Пульсометр Garmin BLE не может получать данные HRM через Bluetooth, что мне не хватает?

С пульсометром Bluetooth/ANT+ других производителей я могу легко получить данные HRM, используя gatttool:

<MAC address>> connect
Attempting to connect to <MAC address>
Connection successful
<MAC address>> primary
(...)
<MAC address>> char-desc 0x000c 0x0011
(...)
<MAC address>> char-write-req 0x000f 0100
Characteristic value was written successfully
Notification handle = 0x000e value: 16 34 e4 04 
Notification handle = 0x000e value: 16 34 a5 04 
Notification handle = 0x000e value: 16 33 ea 04 
Notification handle = 0x000e value: 16 33 de 04

При этом я отправляю дескриптор 0x000f, который является 00002902-0000-1000-8000-00805f9b34fb, куда мне нужно отправить запрос (doc для 0x2902), и я получаю ответы от другого дескриптора (doc для 0x2a37).

Меня уже немного смущает полезная нагрузка 0100, которую мы отправляем. Спецификация для 0x2902 говорит, что мы должны отправлять 16 бит, а 0x0100 это 0b100000000. В результате получается 0b0000000100000000 или 0b1000000000000000? Почему мы отправляем 0x0100, а не 0x8000 (то есть 1 с 15 0)?

В любом случае, 01, 010, 0100, 01000 будут работать, но любые другие цифры не будут работать. Разве это не должно привести к сбою уже с 5 цифрами, поскольку 4 шестнадцатеричных символа - это 16 бит? В любом случае, 01 работает (Уведомления включены, Индикация выключена?), 02 не приведет к обновлению (Уведомления выключены, Индикация включена?), 03 работает (Уведомления включены, Индикация включена?). Правильно ли я понимаю?

Сейчас я беру свой пульсометр Garmin (это Garmin HRM Dual). Я могу прекрасно подключиться к нему через Bluetooth, я могу найти правильный дескриптор для взаимодействия с HRM (дескриптор, который соответствует UUID 0x2902), но когда я использую gatttool для отправки char-write-req дескриптору, как и раньше, он говорит, что значение было написано, но ничего не происходит. Я пробовал несколько значений, но ничего не происходит.

Я что-то пропустил? Есть ли какие-либо дополнительные действия, которые необходимо предпринять перед вызовом дескриптора HRM? Спасибо.


person grabaldam    schedule 09.03.2020    source источник


Ответы (1)


0100, который вы отправляете, это просто 0001 в Little Endian. Поскольку BlueZ использует Little Endian при записи значений, последний байт идет первым. Например, если вы хотите написать 01 02 03, вам придется написать это как 030201. Вот почему все 01, 010, 0100 и 01000 работают, потому что во всех этих случаях вы пишете 01. Вы также правы. около 02, разрешающих индикацию, и что 03 будет включать как уведомления, так и индикацию.

Что касается включения уведомлений и чтения данных HRM, убедитесь, что вы носите HRM Dual, прежде чем включать уведомления. Причина этого в том, что HRM Dual не будет работать, пока не обнаружит фактические данные о частоте сердечных сокращений. Вы можете проверить это, подключившись через приложение nRF Connect на своем устройстве Android/iOS и попытавшись прочитать данные HRM.

person Youssif Saeed    schedule 30.11.2020