BT HUB (обновлено: 12 Jul 2021, 13:31:48)

Опция BT HUB для приема данных с разнообразных Bluetooth датчиков и устройств через GATT (Generic Attribute Profile) — профиль общих атрибутов.

Опция использует встроенный в ESP32 Bluetooth контроллер.

Работа совместно с PSRAM не протестирована !

Принятые данные видны подробно в 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

Настройка BT HUB в Веб

В веб модуле имеются следующие настройки:


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 включать отдельные топики при приеме большого потока данных.

В нижней части странички находится список устройств, которые поддерживает опция. Для очистки ячейки достаточно удалить её содержимое и сохранить.

Чтение зашифрованных данных датчиков Xiaomi

Испытано на LYWSD03MMC и CGD1, возможно сейчас все новые устройства идут с шифрованием. Опция включается дополнительно в шестеренке. Ключ требуется ввести на специальной странице ключей в соответствующее поля по номеру устройства.

Если заменить прошивку у LYWSD03MMC на неофициальную прошив через TelinkFlasher , то данные будут передаваться открытые. При этом появляются дополнительные возможности, например установка более частого интервала отправки. В веб конфигураторе обязательно требуется выбрать протокол MiLike (Advertising Type).


Считать ключ можно 2 способами:

1. Использовать веб приложение Telink Flasher . Проверено работает на Андроид в Chrome , может работать и в других операционных системах (при разрешенных правах доступа к блютузу). Для получения ключа требуется на странице нажать Connect , далее выбрать устройство у которого требуется получить ключ, после успешного подключения нажимаем кнопку Do Activation - после этого ключ мы увидим в поле Mi Bind Key . Каждое нажатие на кнопку Do Autorization меняет ключ.

2. Патченное приложение Mi Home. (После установки приложения, не забываем проверить разрешения на запись, чтоб записались логи в телефон). Каждая синхронизация устройства меняет ключ датчика.

После сопряжения датчика со смартфоном в папке /vevs/logs/, которую предварительно там создали появятся файлы.


Bindkey вставить в поле с соответствующим Mac адресом! 


Вот результат )


Описание формата принимаемых данных GATT

Эта документация поможет пользователям для добавления устройств в проект или самостоятельной их обработки.

Принятый пакет содержит несколько типов данных с данными, его формат <длина 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==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.