Опция BT HUB для приема данных с разнообразных Bluetooth датчиков и устройств через GATT (Generic Attribute Profile) — профиль общих атрибутов.
ESP32 и ESP32C3: Опция использует встроенный в чип Bluetooth контроллер. В SDK 4.3 и выше или при включенной PSRAM используется стек NimBLE.
Linux: На данный момент поддерживается только на ARM профилях. Поддержки шифрования Xiaomi на данный момент нет. В ОС должна быть поддержка bluetooth.
Принятые данные видны подробно в UART отладке. Поддерживаемые датчики доступны на главной странице и на всех серверах/сервисах. В Free режиме доступно только UART вывод информации, включая вывод данных с поддерживаемых датчиков.
На данный момент доступно чтение Xiaomi устройств: MJ_HT_V1, CGG1, MiFlora, LYWSD02, LYWSD03(LYWSD03MMC), CGD1, MiKettle, а также BLE датчики фирмы Inkbird и датчики Tilt гидрометр/термометр (включается в шестеренке). Возможна частичная или полноценная работа и других датчиков и устройств Xiaomi - может требоваться доработка. Жду от пользователей отладочных данных от других устройств для добавления в проект.
Для включения опции требуется переразметка памяти, если модуль прошит с нуля до 09.05.20, чтобы опция влезла в модуль с 4 мб flash . Документация по ESP32 Опция очень ресурсоёмкая, занимает много flash памяти и ОЗУ!!! ОЗУ может не хватать при работе с другими ресурсоёмкими опциями (icq, telegram, Email, интернет-радио, mqtt и др.) - в таком случае могут быть ошибки сборки или не стабильность в работе.
30.05.2020 - добавлена поддержка шифрованных датчиков LYWSD03MMC.
10.07.2020 - добавлена поддержка MiKettle
23.01.2021 - добавлена поддержка датчиков Inkbird
06.10.2021 - добавлена поддержка приема от сторонних прошивок LYWSD03MMC, MHO-C401, CGG1.
В веб модуле имеются следующие настройки:
Enable BLE Hub - Включение опции.
Enable auto added device - Автоматический поиск и добавление поддерживаемых опцией датчиков, новый датчик добавляется в список ниже в первую пустую ячейку (пустая - это ячейка заполненная 00 или FF). Не работает с шифрованными датчиками. Ждать добавления датчика можно до 11 минут - такой интервал чаще всего у Xiaomi датчиков с родной прошивкой.
Enable RAW filter - Фильтр МАС адресов для режима приема RAW (не определенных) данных в UART отладке и в MQTT. Список адресов по ссылке: filter
Filter black list mode - Использование черного списка вместо белого в фильтре.Debug UART level - Уровень вывода отладки в UART:
0 - Выключено;
1 - Только знакомые датчики;
2 - Все несущие полезную информацию типы данных;
3 - Все данные.
Debug print RAW level - Уровень вывода RAW отладки на веб вкладке модуля:
0 - Выключено;
2 - Все несущие полезную информацию типы данных;
3 - Все данные.
Send Mqtt RAW level - Уровень отправки RAW в MQTT:
0 - Выключено;
1 - Все несущие полезную информацию типы данных;
2 - Все типы данных;
3 - Полный пакет данных с устройства.
Если в эфире находится очень большое количество устройств, то их данные при включенной отправке в UART и в MQTT может приводить к сбоям в работе прошивки, используйте фильтры, чтобы отделить полезную информацию и снизить нагрузку на модуль. Крайне рекомендуется в опции MQTT включать отдельные топики при приеме большого потока данных.
В нижней части странички находится список устройств, которые поддерживает опция. Для очистки ячейки достаточно удалить её содержимое и сохранить.
Сторонние прошивки позволяют реализовать обмен данными по более оптимальном режиму отправки данных и экономии батареи. Прошивки по умолчанию не используют шифрование данных.
Для LYWSD03MMC существует 2 варианта прошивок:
1. Автор Atc1441, ссылка на прошивку. Веб программатор TelinkFlasher. Настройки интервала.
2. Автор pvvx, ссылка на прошивки. Веб программатор. Можно установить пин код для защиты. Множество настроек. + Доступны прошивки для MHO-C401 и CGG1
Обратите внимание, что сейчас в продаже появились другие аппаратные версии LYWSD03MMC HW: B1.6 и B1.9 - новые прошивки от pvvx их сейчас поддерживают.
Испытано на LYWSD03MMC и CGD1, возможно сейчас все новые устройства идут с шифрованием. Опция включается дополнительно в шестеренке. Ключ требуется ввести на специальной странице ключей в соответствующее поля по номеру устройства.
Если заменить прошивку на неофициальную, то ключ не требуется.
Считать ключ можно 2 способами:
1. Использовать веб приложение Telink Flasher . Проверено работает на Андроид в Chrome , может работать и в других операционных системах (при разрешенных правах доступа к блютузу). Для получения ключа требуется на странице нажать Connect , далее выбрать устройство у которого требуется получить ключ, после успешного подключения нажимаем кнопку Do Activation - после этого ключ мы увидим в поле Mi Bind Key . Каждое нажатие на кнопку Do Autorization меняет ключ.
2. Патченное приложение Mi Home. (После установки приложения, не забываем проверить разрешения на запись, чтоб записались логи в телефон). Каждая синхронизация устройства меняет ключ датчика.
После сопряжения датчика со смартфоном в папке /vevs/logs/, которую предварительно там создали появятся файлы.
Bindkey вставить в поле с соответствующим Mac адресом!
Вот результат )
Эта документация поможет пользователям для добавления устройств в проект или самостоятельной их обработки.
Принятый пакет содержит несколько типов данных с данными, его формат <длина 1 байт> <тип 1 байт> <данные> и далее данные повторяются, пока не встретиться длина равная 0 байт. Длина - это 1 байт тип + данные. Весь пакет можно принять через MQTT RAW level 3
От типа зависит назначение данных, документацию можно почитать на официальном сайте Bluetooth. В проекте в выводе RAW пакетов на данный момент полезными(несущими полезные данные) считаются типы:
0x16 - Service Data - 16-bit UUID. Узнать чей UUID можно тут.
0xFF - Manufacturer Specific Data.
Возможно и есть и другие типы, которые могут пригодиться, но пока такие не встречались.
Пример кода для самостоятельной обработки данных с устройств через GATT:
void myBleHub(uint8_t *mac,uint8_t ad_type ,uint8_t len,uint8_t *data){ if(mac[4]==0xAA && mac[5]==0xBB) // можно сравнивать МАС только последние 2 байта { if(ad_type==0x16) // принимаем Service Data - 16-bit UUID { if(*(uint16_t*)(data)==0xFEFF) // первые 2 байта - это номер UUID { //тут уже работаем с массивом data[] начиная с 2 байта uint32_t val1=*(uint32_t*)(data+2); // если первые данные в пакете это uint32_t число } } if(ad_type==0x48) // принимаем не опознанные данные на примере HA11 battery balancer equalize { valdes[0] = data[10]*256 + data[11]; valdes[1] = data[12]*256 + data[13]; } if(ad_type==0xFF) // принимаем Manufacturer Specific Data { //тут уже работаем с массивом data[] } } }В стартовой функции задать строку cb_bthub_funs=myBleHub;
По порядку параметры принятые в функции: MAC адрес 6 байт, тип данных, длина принятых данных, сами данные.
http://[IP]/blecontrol?cmd=open&mac=MAC - Открыть устройство
http://[IP]/blecontrol?cmd=list - Вывести характеристики устройства, прочесть атрибуты
http://[IP]/blecontrol?cmd=close - Закрыть устройство
http://[IP]/blecontrol?cmd=write&h=handle&hex=hex_строка - Записать атрибут в устройство, handle ищем на вкладке list.
http://[IP]/blecontrol?cmd=read&h=handle - Прочесть атрибут, handle ищем на вкладке list.