client-api

Этот документ описывает протокол для внешних клиентов API, использующих наши устройства. Если вы заинтересованы в запуске своего кода непосредственно на устройстве, ознакомьтесь с документацией по module API вместо этого.

API устройства предназначено для наличия только простого потока пакетов ToRadio и FromRadio, и весь полиморфизм обеспечивается гибким набором Google Protocol Buffers, которые передаются по сети. Мы широко используем protocol buffers как для Bluetooth API, так и для пакетов внутри mesh или при предоставлении пакетов другим приложениям на телефоне.

Версия с потоковой передачей

Этот протокол почти идентичен при развертывании поверх BLE, Serial/USB или TCP (наши три в настоящее время поддерживаемых транспорта для подключения к телефону/ПК). Большая часть этого документа касается оригинальной версии BLE, но этот раздел описывает небольшие изменения, когда этот API предоставляется поверх потокового (не датаграммного) транспорта. Версия с потоковой передачей имеет следующие изменения:

Четырехбайтовый заголовок сконструирован так, чтобы обеспечивать кадрирование и не выглядеть как «обычный» 7-битный ASCII.

Приемник проверит длину, и если она >512, то предположит, что пакет поврежден, и вернется к поиску START1. При поиске START1 любые другие символы выводятся как «отладочный вывод». Для небольшого примера реализации этого считывателя см. реализацию на python.

Bluetooth (MeshBluetoothService)

Это основной сервис Bluetooth для устройства, который предоставляет API, которое ваше приложение должно использовать для получения информации о mesh, отправки пакетов или настройки радио.

Для справочной реализации клиента, использующего этот сервис, см. RadioInterfaceService.

Типичная последовательность при подключении телефона к устройству должна быть следующей (если вы хотите наблюдать эту последовательность из python-приложения, просто запустите meshtastic --debug --info — последовательность поверх BLE идентична):

Ожидаемая последовательность для начальной загрузки:

Для определений (и документации) protocol buffers FromRadio, ToRadio, MyNodeInfo, NodeInfo и User см. mesh.proto

UUID для сервиса: 6ba1b218-15a8-461f-9fa8-5dcae273eafd

Каждая характеристика перечислена следующим образом:

UUID Properties Description (including human readable name)

2c55e69e-4993-11ed-b878-0242ac120002 read fromradio — содержит недавно полученный пакет FromRadio, предназначенный для телефона (до MAXPACKET байт на пакет). После чтения ESP32 поместит следующий пакет в этот почтовый ящик. Если FIFO пуст, он поместит пустой пакет в этот почтовый ящик.

f75c76d2-129e-4dad-a1dd-7866124401e7 write toradio — запишите сюда protobuf ToRadio, чтобы отправить их (до длины MAXPACKET)

ed9da18c-a800-4f66-a670-aa7547e34453 read,notify,write fromnum — текущий номер пакета в сообщении, ожидающем внутри fromradio; если телефон видит это уведомление, он должен читать сообщения, пока не догонит этот номер.

5a3d6e49-06e6-4423-9944-e9de8cdf9547 notify Сообщение журнала как protobuf LogRecord. Клиентам рекомендуется слушать это уведомление и предоставлять опцию логирования этих отладочных сообщений.

6c6fd238-78fa-436b-aacf-15c5be1ef2e2 notify Сырое сообщение журнала как строка (с переводом строки). Эта характеристика УСТАРЕЛА и не должна использоваться в новом клиентском коде.

Телефон может записать в этот регистр, чтобы вернуться назад до FIXME пакетов, чтобы обработать редкий случай, когда пакет fromradio был отброшен после вызова обратного вызова ESP32, но до прибытия на телефон. Если телефон записывает в этот регистр, ESP32 отбросит старые пакеты и поместит следующий пакет >= fromnum в fromradio. Когда ESP32 продвигает fromnum, он задержит отправку уведомления на 100 мс в надежде, что уведомление никогда не потребуется отправить, если телефон уже читает из fromradio.

Примечание: если телефон когда-либо увидит уменьшение этого номера, это означает, что ESP32 перезагрузилась.

Re: Управление очередью, не все сообщения хранятся в очереди fromradio (фильтруются на основе SubPacket):

Примечание о размерах MTU

Это устройство будет работать с любым размером MTU, но настоятельно рекомендуется вызывать функцию «setMTU вашего телефона для увеличения MTU до 512 байт» сразу после подключения к сервису. Это значительно улучшит производительность при чтении/записи пакетов.

Protobuf API

При подключении вы должны отправить protobuf want_config_id на устройство. Это заставит устройство отправить свою базу данных узлов и конфигурацию радио через конечную точку fromradio. После отправки полной БД радио отправит want_config_id, чтобы указать, что отправка конфигурации завершена.

Другие сервисы Bluetooth

Этот документ фокусируется на основном протоколе устройства, но стоит отметить, что устройство также предоставляет следующие другие сервисы Bluetooth.

BluetoothSoftwareUpdate

Сервис обновления программного обеспечения. Для примера функции, выполняющей обновление программного обеспечения с использованием этого API, см. startUpdate.

UUID SoftwareUpdateService cb0b9a0b-a84c-4c0d-bdbb-442e3144ee30

Характеристики

UUID properties description
e74dd9c0-a301-4a6f-95a1-f0e1dbea8e1e write,read общий размер образа, 32 бита, запишите это первым, затем прочитайте обратно, чтобы увидеть, был ли он принят (0 означает не принят)
e272ebac-d463-4b98-bc84-5cc1a39ee517 write данные, переменного размера, рекомендуется 512 байт, запишите по одному для каждого блока файла
4826129c-c22a-43a3-b066-ce8f0d5bacc6 write crc32, запишите последним — запись этого завершит операцию OTA, теперь вы можете прочитать результат
5e134862-7411-4424-ac4a-210937432c77 read,notify код результата, можно читать, но уведомит, когда операция OTA завершится
5e134862-7411-4424-ac4a-210937432c67 write устанавливает регион для программирования, в настоящее время определены только 0 (app) или 100 (spiffs), если не установлено, предполагается app
GATT_UUID_SW_VERSION_STR/0x2a28 read Мы также реализуем эти стандартные записи GATT, поскольку обновление ПО, вероятно, нуждается в них:
GATT_UUID_MANU_NAME/0x2a29 read
GATT_UUID_HW_VERSION_STR/0x2a27 read

DeviceInformationService

Реализует стандартный контракт BLE для этой службы (содержит версию программного обеспечения, модель оборудования, серийный номер и т. д...).

BatteryLevelService

Реализует стандартную службу BLE-контракта, предоставляет уровень заряда батареи таким образом, чтобы большинство клиентских устройств автоматически его понимали (т. е. он должен автоматически отображаться на экране устройств Bluetooth).