Какой чип выбрать для шлюза Bluetooth Mesh: Telink, Silicon Labs или Nordic?

Сравниваем Telink mesh_gw, Nordic Zephyr и Silicon Labs NCP/BGAPI для шлюза Bluetooth Mesh: прошивка, последовательный протокол, ёмкость узлов, стоимость и наш выбор.

В предыдущей статье мы определились с двумя вещами: устройства и шлюз общаются по SIG Mesh, а на шлюзе Mesh-стек живёт в отдельном Bluetooth-модуле, которым Linux-программа управляет через последовательный порт.

Остаётся вполне прикладной вопрос: какой Bluetooth-чип взять?

Мы сравнивали трёх производителей: Telink, Silicon Labs и Nordic. По ходу дела один раз передумали и в итоге остановились на Silicon Labs в шлюзе и Telink в устройствах. В этой статье — сравнение и логика выбора.

Для начала: что этот чип делает в шлюзе?

Bluetooth-модуль шлюза — не обычный Mesh-узел. Он совмещает несколько ролей:

  • Provisioner: добавляет в сеть новые устройства, назначает адреса, раздаёт и привязывает ключи.
  • Controller: отправляет команды включения и выключения, диммирования и смены цвета, принимает отчёты о состоянии.
  • Постоянно включённый узел: ретранслирует сообщения для более удалённых устройств.
  • Сопроцессор: принимает команды от Linux-хоста по UART и передаёт ему входящие сообщения.

Поэтому сравнивать приходится не столько кремний, сколько другое: есть ли у производителя готовая прошивка шлюза и насколько удобен последовательный протокол между хостом и модулем. Именно этот слой определяет, сколько кода понадобится программе шлюза и сможет ли кто-нибудь потом в нём разобраться.

Telink доминирует на китайском рынке освещения и выключателей, и в наших устройствах уже стояли его чипы. SIG Mesh SDK открыт на GitHub и включает готовую прошивку шлюза mesh_gw.

Устроена mesh_gw примерно так:

Слой Содержимое Можно менять?
Bluetooth-стек и Mesh-стек Шифрование, сетевой и транспортный уровни Закрытый код, только библиотеки
Прикладной уровень шлюза Обработка команд по serial, процедура provisioning, отчёты о состоянии Открытый код
Интерфейс с хостом UART (новый TL321X поддерживает только UART) Собственный протокол Telink

Плюсы очевидны:

  • Дешёвые чипы: при больших партиях — несколько юаней за штуку.
  • Готовая прошивка шлюза и отладочный инструмент для Windows.
  • Тот же производитель, что и у устройств, поэтому vendor-модели Telink на устройствах понятны сразу.

Проблема — в последовательном протоколе. Telink придумала его сама, документации мало, и многие детали проясняются только при чтении исходников SDK. Команды называются HCI_CMD_GATEWAY_..., что наводит на мысль о стандартном Bluetooth HCI, но это не он. Да и с кадрами всё нестандартно: кадры от хоста к модулю не имеют заголовка длины и разделяются по паузе на UART, а кадры от модуля к хосту длину содержат.

Есть и ограничение по ёмкости: mesh_gw по умолчанию хранит не более 200 узлов, а при удалённом provisioning — 110, потому что данные узлов лежат в одном секторе flash. Для дома хватает, а для коммерческого применения придётся менять схему хранения в SDK.

Наш первый прототип был написан под этот протокол, вместе с эмулятором модуля для тестов. Работало, но каждая новая функция снова означала раскопки в исходниках, и уверенности это не добавляло.

Nordic: лучшие инструменты и документация, но прошивку шлюза пишешь сам

Nordic nRF52840 и nRF5340 у Bluetooth-разработчиков пользуются заслуженным уважением. Документация, снифферы и мобильные приложения — одни из лучших в отрасли, а nRF52840 Dongle стоит около десяти долларов и просто втыкается в USB.

Но у Nordic есть принципиальный пробел: в актуальном nRF Connect SDK нет официальной прошивки шлюза с serial-интерфейсом. В старом nRF5 SDK for Mesh она была, но больше не поддерживается. Со стороны шлюза остаются три варианта:

Подход На модуле На хосте Вердикт
Писать свою прошивку шлюза Provisioner и клиентские модели Mesh из Zephyr плюс собственный serial-протокол Только трансляция Самая чистая архитектура, но придётся написать тысячу-две строк на C
Модуль как обычный Bluetooth-контроллер Стандартная HCI-прошивка Zephyr Mesh-демон BlueZ на Linux или собственный стек Прошивка готова, но под Windows разработки нет
Zephyr Mesh Shell Встроенная командная строка Текстовые команды Только для отладки

По ёмкости: стек Zephyr можно настроить на 4096 узлов, реалистично с учётом памяти — одна-две тысячи. Но по умолчанию там всего 8 узлов, а список защиты от повторов — на 10 записей. Если ничего не менять, сообщения 11-го устройства начнут теряться. Это классическая ловушка при построении шлюза на Zephyr.

Nordic подходит в двух случаях: если нужен полный контроль над Mesh-уровнем шлюза или если один шлюз должен обслуживать несколько сотен устройств и больше. Нас не касалось ни то, ни другое, а модули заметно дороже, так что мы отказались.

Silicon Labs: документированный serial-протокол — и это решило дело

Silicon Labs идёт тем же путём, что и Telink: «модуль крутит стек, хост шлёт команды». Официально это называется режимом NCP (network co-processor). Разница в том, что его serial-протокол BGAPI описан как следует:

  • Все команды, ответы и события задокументированы, есть официальные хост-библиотеки на C и Python.
  • Покрыт почти весь Mesh API: provisioning, конфигурация, стандартные модели, обновление ключей и прошивки.
  • В SDK есть пример provisioner’а на стороне хоста (application note AN1371), и нашу реализацию на Rust можно строить по его логике.
  • Графический инструмент NCP Commander позволяет добавлять устройства и переключать свет вообще без кода.

Формат кадра BGAPI прост: 4-байтовый заголовок и до 255 байт полезной нагрузки.

[hdr0][len_lo][class][cmd][payload 0–255 bytes]
hdr0: bit7 команда/событие, биты 6–3 тип устройства, биты 2–0 старшие биты длины

Одна оговорка: в BGAPI на последовательной линии нет контрольной суммы. Кадры разделяются только по длине, поэтому, чтобы не терять байты, нужно обязательно включать аппаратное управление потоком RTS/CTS. При выборе главного процессора проверьте, что его UART умеет flow control.

По цене: EFR32BG24, который используется в шлюзах, на сайте Silicon Labs стоит около 2,70–3,70 доллара за чип при партии в 1000 штук — дороже, чем Telink. В пересчёте на шлюз это примерно 2 доллара сверху.

Все трое в одной таблице

Telink Nordic Silicon Labs
Прошивка шлюза Готова (mesh_gw) Писать самому или стандартная HCI Готова (примеры NCP)
Serial-протокол Закрытый, мало документации Свой или стандартный HCI BGAPI, документирован, есть хост-библиотеки
Инструменты отладки Есть Лучшие Хорошие
Ёмкость по умолчанию 200 узлов (110 при удалённом provisioning) 8, нужно увеличивать, до 4096 Задаётся конфигурацией NCP-прошивки
Стоимость чипа Самая низкая Выше Средняя
Китайская цепочка поставок Самая зрелая Средняя Хорошая

Итоговая комбинация:

  • Шлюз: модуль Silicon Labs серии BG24 с NCP-прошивкой.
  • Устройства: по-прежнему Telink, на SIG Mesh SDK от Telink.

В шлюзе стоит один модуль, поэтому пара лишних долларов покупает документированный serial-протокол, полный Mesh API и официальные примеры, а поддерживать всё это намного проще. С устройствами иначе: выключатели и светильники идут большими партиями, небольшая разница в цене чипа быстро складывается в приличную сумму, и по стоимости и местной экосистеме Telink подходит лучше.

Два производителя уживаются в одной сети благодаря стандартным моделям SIG из прошлой статьи. Пока устройства используют стандартные модели вроде Generic OnOff, Light Lightness и CTL, вендор шлюза не имеет значения. Если же устройство использует vendor-модели Telink, придётся либо перейти на стандартные, либо реализовать соответствующую vendor-модель на шлюзе.

После отказа от протокола Telink переписывать нужно только слой serial-протокола в программе шлюза; Matter, таблица устройств и слой маппинга остаются нетронутыми. Это и есть та самая слоистая архитектура из первой статьи, которая окупается.

Что ещё предстоит проверить

Пока все эти выводы существуют только на бумаге. Когда придут платы, первыми будут три проверки:

  1. Действительно ли шлюз на Silicon Labs и устройства Telink работают вместе? Прежде чем писать код, через NCP Commander добавим плату с light-прошивкой Telink и включим её.
  2. Может ли UART главного процессора работать с аппаратным flow control? Прогоним длительные стресс-тесты и посмотрим, не теряются ли кадры.
  3. Сколько устройств один шлюз тянет стабильно? Подберём число узлов и размер списка защиты от повторов в NCP-прошивке под реальные нужды.

Результаты выйдут отдельной статьёй.

Напоследок

Выбирая Bluetooth-чип для шлюза, легко зациклиться на цене и характеристиках. Но разработку и поддержку на деле чаще определяет невидимая часть — serial-протокол: описан ли он, можно ли его отлаживать и можно ли выяснить, почему что-то сломалось.

Если вы выбираете чип для Bluetooth Mesh-шлюза или работаете с BGAPI от Silicon Labs или mesh_gw от Telink, буду рад пообщаться: linktr.ee/weiyii

Чтение и отправка через WeChat

QR-код статьи

Отсканируйте и поделитесь через меню WeChat.