Не удается прочитать HM-10 после подключения к Bluez - PullRequest
0 голосов
/ 11 июня 2018

Надеюсь, вы поможете мне понять, как использовать Bluez для чтения из модуля BLE HM-10.Почему это проблема для меня?Я не могу заставить чтение или запись работать правильно, и моя конечная цель - использовать библиотеку bluepy Яна Харви, построенную на верхнем стеке Bluez.Любая помощь приветствуется.Спасибо!

HM-10, подключенный к Arduino Nano, скажет «Foobar», подождите одну секунду, скажет «Barfoo», подождите одну секунду и повторите.Мой iOS Bluetooth Serial App (названный «Serial» в магазине приложений) правильно его подхватывает.

Оборудование: Ядро Raspberry Pi ZeroW: 4.9.68+ Bluez: 5.50 (выпущено 3 июня 2018 г.)

Основная проблема

Я не могу использовать bluetoothctl для чтения «Foobar» и «Barfoo».

pi@raspberrypi:~ $ bluetoothctl
[bluetooth]# power on
[bluetooth]# connect 34:15:13:87:98:37
[DSDTECH HM-10]# menu gatt
[DSDTECH HM-10]# select-attribute 0000ffe1-0000-1000-8000-00805f9b34fb
[DSDTECH HM-10:/service0010/char0011]# read
[CHG] Attribute /org/bluez/hci0/dev_34_15_13_87_98_37/service0010/char0011 Value:
  34 15 13 87 98 37                                4....7
  34 15 13 87 98 37                                4....7

BtMon показывает, что я получаю "Foobar" и "Barfoo", хотя

На самом деле, используя btmon ($sudo btmon в другом терминале), я вижу, что моя малинапи ноль W видит эти значения.Приведенные ниже записи повторяются каждую секунду.

> ACL Data RX: Handle 64 flags 0x02 dlen 15              #278 [hci0] 339.880027
      ATT: Handle Value Notification (0x1b) len 10
        Handle: 0x0012
          Data: 426172666f6f0d0a
> ACL Data RX: Handle 64 flags 0x02 dlen 15              #279 [hci0] 340.292455
      ATT: Handle Value Notification (0x1b) len 10
        Handle: 0x0012
          Data: 466f6f6261720d0a

426172666f6f0d0a = Barfoo (hex2ascii)

466f6f6261720d0a = Foobar (hex2ascii)

Не получать показания от других атрибутов

Если вы знаете HM-10, вы знаете, что ffe1 - это то, что вы должны использовать для передачи данных UART.Я закодировал ffe1 в своем доморощенном Android-приложении, которое работает как мастер для сопряжения с HM-10.Но я хотел проверить, что дают мне другие атрибуты.

[DSDTECH HM-10:/service0010/char0011]# select-attribute 00002902-0000-1000-8000-00805f9b34fb
[DSDTECH HM-10:/service0010/char0011/desc0013]# read
[CHG] Attribute /org/bluez/hci0/dev_34_15_13_87_98_37/service0010/char0011/desc0013 Value:
  00 00                                            ..
  00 00                                            ..



[DSDTECH HM-10:/service0010/char0011/desc0013]# list-attributes
Primary Service
        /org/bluez/hci0/dev_34_15_13_87_98_37/service000c
        00001801-0000-1000-8000-00805f9b34fb
        Generic Attribute Profile
Characteristic
        /org/bluez/hci0/dev_34_15_13_87_98_37/service000c/char000d
        00002a05-0000-1000-8000-00805f9b34fb
        Service Changed
Descriptor
        /org/bluez/hci0/dev_34_15_13_87_98_37/service000c/char000d/desc000f
        00002902-0000-1000-8000-00805f9b34fb
        Client Characteristic Configuration
Primary Service
        /org/bluez/hci0/dev_34_15_13_87_98_37/service0010
        0000ffe0-0000-1000-8000-00805f9b34fb
        Unknown
Characteristic
        /org/bluez/hci0/dev_34_15_13_87_98_37/service0010/char0011
        0000ffe1-0000-1000-8000-00805f9b34fb
        Unknown
Descriptor
        /org/bluez/hci0/dev_34_15_13_87_98_37/service0010/char0011/desc0013
        00002902-0000-1000-8000-00805f9b34fb
        Client Characteristic Configuration
Descriptor
        /org/bluez/hci0/dev_34_15_13_87_98_37/service0010/char0011/desc0014
        00002901-0000-1000-8000-00805f9b34fb

[DSDTECH HM-10:/service0010/char0011/desc0013]# select-attribute /org/bluez/hci0/dev_34_15_13_87_98_37/service0010/char0011/desc0014 
# I could not get the uuid to work after selecting 00002902, and do not know how to exit out of an attribute. 
# This corresponds to uuid 00002901
[DSDTECH HM-10:/service0010/char0011/desc0014]# read
[CHG] Attribute /org/bluez/hci0/dev_34_15_13_87_98_37/service0010/char0011/desc0014 Value:
  77 77 77 2e 6a 6e 68 75 61 6d 61 6f 2e 63 6e     www.jnhuamao.cn
  77 77 77 2e 6a 6e 68 75 61 6d 61 6f 2e 63 6e     www.jnhuamao.cn
[DSDTECH HM-10:/service0010/char0011/desc0014]# select-attribute /org/bluez/hci0/dev_34_15_13_87_98_37/service0010
[DSDTECH HM-10:/service0010]# read
Unable to read attribute /org/bluez/hci0/dev_34_15_13_87_98_37/service0010


[DSDTECH HM-10:/service0010]# select-attribute /org/bluez/hci0/dev_34_15_13_87_98_37/service000c/char000d 
# This corresponds to uuid 00002a05-0000-1000-8000-00805f9b34fb
[DSDTECH HM-10:/service000c/char000d]# read
Failed to read: org.bluez.Error.NotPermitted
[DSDTECH HM-10:/service000c/char000d]# select-attribute /org/bluez/hci0/dev_34_15_13_87_98_37/service000c/char000d/desc000f
[CHG] Attribute /org/bluez/hci0/dev_34_15_13_87_98_37/service000c/char000d/desc000f Value:
  02 00                                            ..
  02 00                                            ..

Кажется, я читаю значение данных производителя

Интересно, что это тот же ответ, что и для данных производителя, как видно из команды info.

[bluetooth]# info 34:15:13:87:98:37
Device 34:15:13:87:98:37 (public)
        Name: DSDTECH HM-10
        Alias: DSDTECH HM-10
        Paired: no
        Trusted: yes
        Blocked: no
        Connected: no
        LegacyPairing: no
        UUID: Unknown                   (0000ffe0-0000-1000-8000-00805f9b34fb)
        ManufacturerData Key: 0x4d48
        ManufacturerData Value:
  34 15 13 87 98 37                                4....7
        ServiceData Key: 0000b000-0000-1000-8000-00805f9b34fb
        ServiceData Value:
  00 00 00 00                                      ....
        RSSI: -56
        TxPower: 0

Когда я использую другую комбинацию nano / HM-10, это значение представляет собой другую ошибку @|...x, как для информации / производственных данных, так и для чтения uuid ffe1.

Кроме того, когда я первоначально подключаюсь к устройству, btmon показывает

@ MGMT Event: Device Found (0x0012) plen 57          {0x0001} [hci0] 67.415544
        LE Address: 34:15:13:87:98:37 (OUI 34-15-13)
        RSSI: -62 dBm (0xc2)
        Flags: 0x00000000
        Data length: 43
        Flags: 0x06
          LE General Discoverable Mode
          BR/EDR Not Supported
        Company: not assigned (19784)
          Data: 341513879837
        Service Data (UUID 0xb000): 00000000
        16-bit Service UUIDs (partial): 1 entry
          Unknown (0xffe0)
        TX power: 0 dBm
        Name (complete): DSDTECH HM-10

341513879837 = 47 (hex2ascii) (есть четыре квадрата, которые я не могу отобразить правильно.с четырьмя периодами)

Ответы [ 2 ]

0 голосов
/ 16 июня 2018

Журналы btmon показывают, что данные, поступающие с вашего устройства HM-10, представлены в форме уведомлений.В BLE у вас есть три способа передачи данных;читать, писать и уведомлять.Чтение означает, что клиент GATT (в вашем случае Bluez) считывает данные из служебного признака или из служебного дескриптора сервера GATT, при условии, что операция чтения разрешена для этих соответствующих признака или дескриптора.Операция записи заключается в том, что клиент GATT отправляет данные на сервер GATT (HM-10) путем записи в его служебную характеристику или дескриптор.

Единственный способ, которым сервер GATT сам отправляет данные клиенту GATT, - посредством уведомлений.Но клиенту GATT необходимо включить уведомления на сервере GATT после установления соединения.Включение уведомления может быть сделано путем записи в дескрипторы конфигурации характеристик клиента (CCC) сервера GATT.CCC - это специальная служба GATT, определенная в спецификациях Bluetooth Core.

После включения уведомлений вы увидите данные с сервера GATT.С Bluez вы можете выполнять все операции BLE, используя gatttool.Ниже приведен пример:

Например, если адрес устройства Bluetooth HM-10 - 03: 0F: 45: 65: 43: FF, а адрес интерфейса hci вашего устройства - hci0, ниже последовательность команд включает уведомления:

gatttool -i hci0 -b 03:0F:45:65:43:FF -I
[03:0F:45:65:43:FF][LE]>connect
Attempting to connect to 03:0F:45:65:43:FF
Connection successful

# lists all other primary services
[03:0F:45:65:43:FF][LE]> primary
attr handle: 0x0001, end grp handle: 0x0005 uuid: 00001800-0000-1000-8000-00805f9b34fb
attr handle: 0x0006, end grp handle: 0x0009 uuid: 00001801-0000-1000-8000-00805f9b34fb

# lists all characteristics
[03:0F:45:65:43:FF][LE]> characteristics
handle: 0x0002, char properties: 0x02, char value handle: 0x0003, uuid: 00002a00-0000-1000-8000-00805f9b34fb
handle: 0x0004, char properties: 0x02, char value handle: 0x0005, uuid: 00002a01-0000-1000-8000-00805f9b34fb

# 2902 is UUID of CCC service
[03:0F:45:65:43:FF][LE]> char-read-uuid 2902
handle: 0x0009   value: 00 00
handle: 0x0019   value: 00 00

# Enable notifications
[03:0F:45:65:43:FF][LE]> char-write-req 0x0009 0100
Characteristic value was written successfully
[03:0F:45:65:43:FF][LE]> char-write-req 0x0019 0100
Characteristic value was written successfully
0 голосов
/ 11 июня 2018

Я ничего не знаю о Bluez, но вы получаете рекламные данные, а не данные Tx с HM10.Для считывания данных необходимо воспользоваться услугой: «0000 ffe0 -0000-1000-8000-00805f9b34fb» и характеристикой: «0000 ffe1 -0000-1000-8000-00805f9b34fb".
Вы должны написать дескриптор уведомления для этой характеристики.

Чтобы получить данные, которые вам не нужно читать, данные находятся в информационном наполнении уведомлений, а вы читаете их в характеристике.событие, или как это называется в Bleuez.

...