Fork me on GitHub

Mi band - подключение, использование, протоколы

Полезные ссылки

Подготовка рабочего места

  • lsusb - посмотреть определился ли dongle bluetooth

  • установить BlueZ (Official Linux Bluetooth protocol stack)

bash sudo dnf install bluez

  • Корректность установки можно проверить, выполнив команду gatttool –help. Gatttool — это инструмент BlueZ для работы с GATT, общим профилем атрибутов BLE устройств.

  • Через pip установил Pexpect для работы с BlueZ из Python.

sudo pip install pexpect
  • Статус адаптера проверил командой hciconfig :
hci0: Type: Primary  Bus: USB
 BD Address: 00:1A:7D:DA:71:13  ACL MTU: 310:10  SCO MTU: 64:8
 UP RUNNING 
 RX bytes:676 acl:0 sco:0 events:47 errors:0
 TX bytes:2919 acl:0 sco:0 commands:47 errors:0

Если флаг DOWN  - адаптер выключен, включите его командой:

sudo hciconfig hci0 up
  • hciconfig -a hci0

hci0:    Type: Primary  Bus: USB BD Address: 00:1A:7D:DA:71:13  ACL MTU: 310:10  SCO MTU: 64:8 UP RUNNING PSCAN RX bytes:6562 acl:0 sco:0 events:181 errors:0 TX bytes:5104 acl:0 sco:0 commands:100 errors:0 Features: 0xff 0xff 0x8f 0xfe 0xdb 0xff 0x5b 0x87 Packet type: DM1 DM3 DM5 DH1 DH3 DH5 HV1 HV2 HV3 Link policy: RSWITCH HOLD SNIFF PARK Link mode: SLAVE ACCEPT Name: 'kazn-adm' Class: 0x1c0104 Service Classes: Rendering, Capturing, Object Transfer Device Class: Computer, Desktop workstation HCI Version: 4.0 (0x6)  Revision: 0x22bb LMP Version: 4.0 (0x6)  Subversion: 0x22bb Manufacturer: Cambridge Silicon Radio (10)

  • dmesg | grep Bluetooth

[   13.462389] Bluetooth: Core ver 2.22 [   13.462413] Bluetooth: HCI device and connection manager initialized [   13.462416] Bluetooth: HCI socket layer initialized [   13.462418] Bluetooth: L2CAP socket layer initialized [   13.462424] Bluetooth: SCO socket layer initialized [   25.643420] Bluetooth: BNEP (Ethernet Emulation) ver 1.3 [   25.643421] Bluetooth: BNEP filters: protocol multicast [   25.643425] Bluetooth: BNEP socket layer initialized [   81.814628] Bluetooth: RFCOMM TTY layer initialized [   81.814640] Bluetooth: RFCOMM socket layer initialized [   81.814705] Bluetooth: RFCOMM ver 1.11

  • bluetoothctl

Работа с Bluetooth устройством

  • sudo hcitool -i hci0 lescan - сканирование Bluetooth устройств в окружающем пространстве
  • sudo gatttool -i hci0 -b 88:0F:10:DC:3E:FB  -I

[88:0F:10:DC:3E:FB][LE]> connect Attempting to connect to 88:0F:10:DC:3E:FB

Соединение в интерактивном режиме без спаривания обычно длится секунд 20. Это так называемый низкий уровень секретности, он используется по умолчанию. Список доступных сервисов выводится командой primary:

[88:0F:10:DC:3E:FB][LE]> primary
attr handle: 0x0001, end grp handle: 0x0009 uuid: 00001800-0000-1000-8000-00805f9b34fb
attr handle: 0x000c, end grp handle: 0x000f uuid: 00001801-0000-1000-8000-00805f9b34fb
attr handle: 0x0010, end grp handle: 0x0039 uuid: 0000fee0-0000-1000-8000-00805f9b34fb
attr handle: 0x003a, end grp handle: 0x0048 uuid: 0000fee1-0000-1000-8000-00805f9b34fb
attr handle: 0x0049, end grp handle: 0x0050 uuid: 0000fee7-0000-1000-8000-00805f9b34fb
attr handle: 0x0051, end grp handle: 0x0053 uuid: 00001802-0000-1000-8000-00805f9b34fb

Определить, что за сервис можно по четырем цифрам после uuid. Получилось два общих сервиса (generic), два сервиса, заданных производителем (0000fee0 и0000fee1 ), HRM сервис (180d) и алертинг (00001802 ). Перечень характеристик браслета выводится командой char-desc в порядке возрастания указателей (handles). Нашел в списке характеристику с идентификатором ff0c:

handle: 0x002c, uuid: 0000ff0c-0000-1000-8000-00805f9b34fb,

Указатель 0x002c для уровня заряда аккумулятора был уже определен для предыдущей версии браслета. Попробовал считать данные командой char-read-hnd (прочитать данные по указателю).

Отправил команду на указатель 0x0053 со значением 01:

[88:0F:10:DC:3E:FB][LE]> char-write-cmd 0x0053 01

Браслет отозвался двумя слабыми жужжаниями, значение 02 это два раза по 01, т.е. четыре сигнала, а 03 — два, но более сильных

social