BT HUB (обновлено: 18 Oct 2021, 10:55:29)

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

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

В SDK 4.3 и выше или при включенной PSRAM используется стек NimBLE.

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

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

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


Сторонние прошивки на LYWSD03MMC, MHO-C401, CGG1

Сторонние прошивки позволяют реализовать обмен данными по более оптимальном режиму отправки данных и экономии батареи. Прошивки по умолчанию не используют шифрование данных.

Для LYWSD03MMC существует 2 варианта прошивок:

1. Автор Atc1441, ссылка на прошивку. Веб программатор TelinkFlasher. Настройки интервала.

2. Автор pvvx, ссылка на прошивки. Веб  программатор.  Можно установить пин код для защиты. Множество настроек. + Доступны прошивки для MHO-C401 и CGG1

Обратите внимание, что сейчас в продаже появились другие аппаратные версии LYWSD03MMC HW: B1.6 и B1.9 - пока к ним нет прошивок ! Поддерживается только  B1.4 !


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

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

Если заменить прошивку на неофициальную, то ключ не требуется.

Считать ключ можно 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==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 байт, тип данных, длина принятых данных, сами данные.

Экспериментальные опции(не доступно в NimBLE)

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.