Основы интеграции
Общие правила для всех устройств DzenTech. Особенности конкретного устройства — на его странице.
Типовая последовательность:
- запустить BLE scan;
- выбрать устройство по имени и стабильному идентификатору;
- установить GATT-соединение;
- найти требуемые service и characteristic;
- включить notifications, если устройство возвращает ответы асинхронно;
- отправить liveness/status query;
- считать устройство готовым только после корректного протокольного ответа;
- сериализовать все операции записи для одного устройства;
- при отключении прекратить новые команды, отменить ожидания и закрыть GATT objects.
Все контроллеры используют:
- service UUID:
0000FFE0-0000-1000-8000-00805F9B34FB; - characteristic UUID:
0000FFE1-0000-1000-8000-00805F9B34FB.
Общие параметры последовательного порта:
- 8 data bits;
- no parity;
- 1 stop bit;
- flow control отключён.
Baud rate зависит от устройства:
- GlamBot: 115200;
- Spinner360: 9600.
ASCII-команды заканчиваются байтом 0D (\r). LF не добавляется.
Состояние соединения
Заголовок раздела «Состояние соединения»Открытый BLE или COM transport ещё не означает, что устройство готово. Рекомендуется различать:
transportConnected— канал открыт;protocolReady— получен корректный ответ устройства;desiredState— запрошенное состояние;actualState— состояние, подтверждённое ответом.
Успешная GATT/COM запись подтверждает передачу данных в transport, но не выполнение команды устройством.
Этот зазор не теоретический — это самая частая причина команд, которые «отправились, но ничего не сделали». На железе он проявляется в двух видах:
- Сразу после подписки. Запросы, отправленные тут же после включения notifications или плотным burst, могут потеряться до того, как парсер заработал. Распределяйте начальные запросы во времени — на Spinner360 примерно по 400–500 мс — и повторяйте тот, ответ на который не пришёл.
- Между повторяющимися командами. Относительным шаговым командам нужен реальный интервал: MixUp Pixel v1 теряет шаги при паузе меньше 120 мс, хотя каждая запись была подтверждена.
Цифры по устройствам — на их страницах. Если сомневаетесь, привязывайте отправку следующей команды к ответу, а не к подтверждению записи.
Retry и reconnect
Заголовок раздела «Retry и reconnect»Рекомендуемая базовая политика:
- не более трёх попыток идемпотентной команды;
- интервал 300–500 ms;
- после исчерпания попыток закрыть transport;
- подключиться заново;
- повторно прочитать status;
- не повторять non-idempotent команды без проверки actual state.
Диагностика
Заголовок раздела «Диагностика»Устройство вообще не появляется в сканировании
Заголовок раздела «Устройство вообще не появляется в сканировании»- не фильтруйте сканирование по service UUID — рекламируемый и GATT-UUID различаются (см. BLE);
- сверяйте все известные alias имени, а не только основную маску: MixUp Backlight v2 встречается
и как
SPStellar; - молчание Spinner360 на
V?не означает несовместимость контроллера — не подтверждены только версия и поддержка ускорения. Базовые команды проверяйте отдельно.
BLE подключён, characteristic не найдена
Заголовок раздела «BLE подключён, characteristic не найдена»Проверить:
- выбран ли правильный device identifier;
- совпадают ли service и characteristic UUID;
- завершён ли service discovery;
- не закрыт ли GATT object параллельной операцией;
- не используется ли устаревший GATT cache;
- включены ли notifications до команды с быстрым ответом.
Write успешен, устройство не изменилось
Заголовок раздела «Write успешен, устройство не изменилось»- проверить режим characteristic write with/without response;
- сериализовать writes;
- разносить по времени повторяющиеся команды — подтверждённая запись не значит применённая;
- прочитать status после команды;
- MixUp Pixel v1: всегда читать power перед toggle; держать ≥ 120 мс между шагами скорости; ожидать внеочередной status после toggle и дубль, если следом сделать запрос;
- MixUp Backlight v2: перед value повторно выбрать RGB/white mode; скорость эффекта — шкала
0…10, прошивка ограничивает значения выше0A; - Spinner360: проверить decimal/hex интерпретацию — set-команды принимают decimal, а ответы
приходят в hexadecimal с префиксом
P(скорость) илиC(ускорение); - MixUp White: проверить преобразование процентов в
0..255.
USB не отвечает
Заголовок раздела «USB не отвечает»Проверить:
- правильный COM port;
- baud rate;
- 8N1;
- отключённый flow control;
- terminator
0D; - отсутствие другого процесса, удерживающего порт.
Быстрое отключение
Заголовок раздела «Быстрое отключение»При disconnect:
- запретить новые команды;
- отменить текущие ожидания;
- завершить notification subscription;
- закрыть characteristic, service и device;
- не использовать старые GATT objects после reconnect.
Операции close/unsubscribe не должны выполняться синхронным blocking wait в UI/STA thread.