2015-12-14 3 views
3

Что я хочу сделать:Подключение к смарт/LE весовой шкале Bluetooth с Bluez/bluetoothctl/gatttool

Я хочу подключить Raspberry Pi 2 к Bluetooth Smart Weight Scale (Medisana BS440) и получить мои данные.

То, что я знаю:

Существует только один интересный Primary Service с 5 Характеристики:

- handle: 0x001a 
    - properties: 0x20 (Indication), char value handle: 0x1b uuid:00008a21-0000-1000-8000-00805f9b34fb 
- handle: 0x001d 
    - properties: 0x20 (Indication), char value handle: 0x1e uuid:00008a22-0000-1000-8000-00805f9b34fb 
- handle: 0x0020 
    - properties: 0x02 (Read-Only), char value handle: 0x21 uuid:00008a20-00.. 
- handle: 0x0022 
    - properties: 0x08 (Write-Only), char value handle: 0x23 uuid:00008a81-00.. 
- handle: 0x0024 
    - properties: 0x20 (Indication), char value handle: 0x25 uuid:00008a82-00.. 

Я использовал HCI-Snoop-Developer-Funktion моего Android-телефон, чтобы увидеть как соответствующее приложение связывается с моим масштабом.

  1. Запись 0200 -> 0x1F (включить Индикация 0x1D)
  2. чтения 0x21 -> 0x21 (значение: 37fb)
  3. записи 0200 -> 0x1c (включить Индикация 0x1a)
  4. записи 0200 -> 0x26 (включить индикацию 0x24)
  5. пишите 02a31e2c0b -> 0x23 (я не совсем понимаю это здесь, но знаю, если вы берете байты после 02 (a3 1e 2c 0b -> 0b 2c 1e a3 -> это текущий Unix-timestamp, но за год? 1975?)

после шага 4. есть первый индикатор (ручка 0x25), которые дают мне сохраненные персональные данные мне (мой рост, пол, возраст и т.д.)

после шага 5. Есть некоторые признаки (ручка 0x1b и ручку 0x1e), который должен передавать мои измеренные данные. (Не анализировать HEX-значения в это время)

Что я сделал:

Я установил bluez.5.32 на моем raspi (ядро 4.1.13) и сделал шаг 1 - 5 с gatttool и все работает отлично до шага 5. Я не получаю Индикация-сообщения от ручки 0x1B и 0x1E) Ничего не происходит после шага 5.

gatttool -t random -b DE:70:4A:XX:XX:XX -I 
char-write-cmd 0x1f 0200 
char-read-hnd 0x21 (37fb) 
char-write-cmd 0x1c 0200 
char-write-cmd 0x26 0200 
char-write-cmd 0x23 0000000000 

(я даже делать то, что с Unix-временной метки -в 1975 году .. не получилось)

После того, как я потратил несколько часов на работу, я начал работать над своим raspi (была проблема с dbus), и я попробовал то же самое с bluetoothctl. Я включил все показания и записал 0000000000 в hnd = 0x23. Переключился на управление 0x1a, и он сработал! Я получаю много шестнадцатеричных значений, которые должны быть данными, которые я ищу.

Так в чем проблема? Я хочу использовать gatttool для моей цели или, по крайней мере, я хочу понять, почему оно не работает с gatttool

Когда я использую bluetoothctl, я просто не могу выбрать и просмотреть один атрибут, и после получения данных, мой шкала автоматически отключается от моей малины. Поэтому, когда я выбираю характеристику 0x1a, я не могу видеть сообщения-индикаторы характеристики 0x01d и наоборот.

Есть ли еще одна связь между моим Pi и моей шкалой, когда я использую gatttool или когда я использую bluetoothctl?Или есть разница в том, как они сообщают мои масштабы?

ответ

3

Хорошо. Я решил это сам. Все, что мне нужно было сделать, это изменить: char-write-cmd "to ,, char-write-req" .. В лог-файле моего Android- Hci-Snoop, это всегда было требование написать. Не знаю, почему я не узнал его все время ...

Если кто-то имеет такую ​​же проблему с Bluez/bluetoothd/bluetoothctl & DBus как мне (использовать команды «список-атрибутов», " выберите «write» в bluetoothctl, вам нужно выполнить bluetoothd в Experimental-Mode, например «bluetoothd -n -E», но каждый раз, когда я это делал, у меня появлялись сообщения об ошибках типа «D-Bus: имя уже используется» или что-то вроде «установка d'шины не удалось: соединение не разрешается владеть услугу из-за безопасности ...» (не помню точное ErrorMessage))

Что я сделал:

  • установка Bluez с ./configure [...] --enable-экспериментальное (чтение ReadMe-файл)

  • SUDO нано /etc/dbus-1/system.d/bluetooth.conf

    - -> скопировал весь блок, который начинается с> policy user = "root">, и вставьте его ниже этого блока. Тогда я изменил «корень» в «пи» в одном из двух блоков

Если кто-то хочет знать, как эта шкала дает результаты измерений проверить эту ссылку: A little Game/Quiz: Do you see my values? (Interpreting Hex-Values)

+0

Вы можете принять свой собственный ответ, вместо того, чтобы добавлять «РЕШЕНИЕ» в заголовок. https://blog.stackoverflow.com/2009/01/accept-your-own-answers/ – timss

4

Масштаб по-видимому, соединяемый только в течение короткого периода времени после того, как вес и т.д. измерялось я использовал не-интерактивный режим gatttool в Баш скрипт, как это:

gatttool -t random -b F1:37:57:XX:XX:XX --char-write --handle 0x001f -n 0200 
gatttool -t random -b F1:37:57:XX:XX:XX --char-read --handle 0x0021 
gatttool -t random -b F1:37:57:XX:XX:XX --char-write --handle 0x001c -n 0200 
gatttool -t random -b F1:37:57:XX:XX:XX --char-write --handle 0x0026 -n 0200 
gatttool -t random -b F1:37:57:XX:XX:XX --char-write-req --handle 0x0023 -n 0000000000 --listen 

информация была взята от Pratik Sinha here. Чтобы получить ответ, необходимо явно указать --listen, после чего будет получено около 25 строк данных (чередуя ответы 1b и 1e). Спасибо за информацию, спасли мне дни работы!

С Новым годом!

EDIT:

Использование Python и pygatt module это сводится к:

import pygatt.backends 
from binascii import hexlify 

def printIndication(handle, value): 
    print('Indication received {} : {}'.format(hex(handle), hexlify(str(value)))) 

adapter = pygatt.backends.GATTToolBackend() 
adapter.start() 
# wait for someone to step on the scale 
while True: 
    try: 
     device = adapter.connect('f1:37:57:xx:xx:xx', 5, 'random') 
     break 
    except pygatt.exceptions.NotConnectedError: 
     print('Waiting...') 
device.subscribe('00008a22-0000-1000-8000-00805f9b34fb', callback = printIndication, indication = True) 
device.subscribe('00008a21-0000-1000-8000-00805f9b34fb', callback = printIndication, indication = True) 
device.subscribe('00008a82-0000-1000-8000-00805f9b34fb', callback = printIndication, indication = True) 
try: 
    device.char_write_handle(0x23, [02,00,00,00,00], True) 
except pygatt.exceptions.NotificationTimeout: 
    pass 
device.disconnect() 
adapter.stop() 

ПРИМЕЧАНИЯ:

  • Чтение ручки 0x21 не служит никакой цели в моем опыте
  • Написание ручки 0x23 с 02, за которым следует временная отметка unix, синхронизирует RTC шкалы
  • Используйте многобайтовый модифицированный pygatt (pull 34), чтобы иметь возможность принимать несколько байтов в указании
  • Хотя запись в 0x23 не будет производить никаких уведомлений, необходимо ждать, пока уведомление не сможет получить 0x1b и 0x1e Показания к применению. Когда была получена последняя индикация, получено исключение NotificationTimeout.
+0

просто хотел добавить эту информацию, но вы были быстрее. Я добавил ссылку в свой ответ (еще один вопрос о stackoverflow). В этом посте я попросил о помощи, потому что я не знал, как интерпретировать Hexvalues ​​0x1b и 0x1e. (Решил его по-своему позже) Может быть интересно для вас и других. Вы также использовали Medisana BS440? –

+0

Да, я тоже использую BS440, и ваш другой пост тоже был большой помощью! Я просто не понимаю, почему нужно ждать уведомления, чтобы начать получать показания (на самом деле проблема, с которой вы столкнулись вначале). Так или иначе .., это работает. Другое дело, что когда человек х измеряется, он будет передавать только 30 сохраненных результатов этого человека. – Keptenkurk