Полезные ссылки
- Xiaomi Mi Band BLE Protocol reverse-engineering and API
- Контроль над браслетом в ритме BlueZ
- Access Mi Band from Android - Notes on the Bluetooth LE Protocol
- Bluetooth GATT Services
Подготовка рабочего места
-
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 — два, но более сильных