Технический анализ CoAP считывающей ручки, DTLS, observe, блочной передачи и OEM-интеграции для школьного и домашнего развёртывания L5/T2/Y6.

Опубликовано: мар 31, 2021 - 111 Просмотры

CoAP протокол считывающей ручки (Constrained Application Protocol): Облегчённая телеметрия и управление для IoT

Аудитория: Встроенные инженеры-программисты прошивки, архитекторы IoT-решений и системные интеграторы школьной ИТ-инфраструктуры, которые должны выбрать между CoAP, MQTT и HTTP для LAN-канала телеметрии класса с читающими ручками, и которым нужна конкретная ссылка на то, как прошивки L5, T2 и Y6 реализуют CoAP через DTLS с Observe и блочной передачей.

После того как читающая ручка подключается к школьному Wi-Fi (TC-062) и объявляет себя в локальной сети через mDNS (TC-063), следующий вопрос: какой протокол передаёт телеметрию ручки, обновления словаря и команды дистанционного управления обратно в школьную MDM (Mobile Device Management) или облако бренда? Наш ответ с момента запуска прошивки L5 4.0.0 в конце 2023 года — CoAP (Constrained Application Protocol) через DTLS, определённый в RFC 7252 с RFC 7959 (блочная передача) и RFC 7641 (Observe).

CoAP для HTTP — это то же, что BLE HOGP для USB HID: лёгкий протокол на основе UDP с запросами/ответами, разработанный для ограниченных устройств и ограниченных сетей. Читающая ручка — это ограниченное устройство — МКУ 64 МГц, 32 КБ ОЗУ BLE и радио 2,4 ГГц, которые должны сосуществовать со стеком BLE. HTTP/TCP обошёлся бы нам в 38 КБ ОЗУ и задержку при подтверждении TCP в 1,5 секунды. CoAP/UDP обходится нам в 6,4 КБ ОЗУ и задержку запроса CoAP в 18 мс.

Более чем на 47 000 устройств, отгруженных с 2023 года, CoAP передаёт каждый пакет телеметрии LAN-стороны, который исходит из моделей L5, T2 и Y6. В типичном классе с 30 ручками ручка отправляет 30 уведомлений CoAP Observe на ручку в минуту (батарея, состояние словаря, версия прошивки, счётчики ошибок, статус OTA). MDM школы потребляет их все в реальном времени.

Почему CoAP, а не MQTT или HTTP

Протокол Транспорт Затраты ОЗУ на ручке Задержка Соответствие варианту использования
HTTP/1.1 TCP 38 КБ 1,5 с Плохо
HTTP/2 TCP+TLS 64 КБ 1,2 с Плохо
MQTT 3.1.1 TCP+TLS 22 КБ 800 мс Приемлемо
MQTT-SN UDP 14 КБ 250 мс Приемлемо
CoAP UDP(+DTLS) 6,4 КБ 18 мс Отлично

MQTT — каноничный протокол IoT, но он требует брокера, что добавляет зависимость, которой должен управлять школьный ИТ-администратор. CoAP работает напрямую между ручкой и MDM через UDP, что означает отсутствие брокера, отсутствие подтверждения TCP и отсутствие машины состояний TLS.

Экономия ОЗУ является решающей. На L5 весь стек CoAP+DTLS помещается в 6,4 КБ ОЗУ. MQTT-over-TLS потребовал бы 22 КБ, что вынудило бы нас выйти за пределы бюджета BLE L5 в 32 КБ и перейти на более крупный МКУ ценой на $0,80 больше за ручку.

2. Стек CoAP на ручке

Стек CoAP построен поверх mbedTLS 3.4.0 для слоя DTLS и пользовательского слоя UDP-сокетов поверх стека IP LwIP 2.1.3. Архитектура:

Слой Реализация ОЗУ ПЗУ
Приложение (ресурсы CoAP) Пользовательский C 1,8 КБ 4,2 КБ
Движок CoAP libcoap 4.3.0 (патченный) 1,4 КБ 6,8 КБ
Клиент DTLS 1.2 mbedTLS 3.4.0 1,6 КБ 14,4 КБ
UDP-сокет LwIP 2.1.3 0,6 КБ 1,2 КБ
IPv4/IPv6 LwIP 2.1.3 1.0 КБ 8.4 КБ
Всего 6.4 КБ 35.0 КБ

Общий размер стека составляет 35 КБ ПЗУ, что укладывается в 4 МБ флеш-памяти L5. Потребление ОЗУ (6.4 КБ) оставляет L5 с 25.6 КБ свободной кучи для стека BLE и приложения.

3. CoAP ресурсы

Каждая ручка чтения предоставляет следующие CoAP ресурсы по URI coap://<pen-ip>:8883/srp/v1/:

Ресурс Метод Нагрузка Назначение
/srp/v1/info GET JSON Статические метаданные ручки
/srp/v1/battery GET, Observe uint8 Процент заряда батареи
/srp/v1/dict GET, Observe string Текущий словарный пакет
/srp/v1/lang GET, Observe string Текущий язык
/srp/v1/fw GET string Версия прошивки
/srp/v1/usage GET, Observe JSON Статистика ежедневного использования
/srp/v1/errors GET, Observe JSON Счетчики ошибок
/srp/v1/audio PUT octet-stream Отправка аудиоклипа (тест TTS)
/srp/v1/cmd POST JSON Удаленная команда (громкость, EQ, блокировка)
/srp/v1/dict/dl PUT octet-stream Передача блока словаря
/srp/v1/ota POST JSON Триггер OTA
/srp/v1/reset POST JSON Триггер сброса настроек
/.well-known/core GET link-format Обнаружение ресурсов RFC 6690

Ручка предоставляет 12 ресурсов плюс стандартное ядро. Каждый ресурс регистрируется на CoAP-сервере при загрузке и доступен через CoAP GET, PUT, POST или DELETE.

Механизм Observe

RFC 7641 Observe — ключевая функция CoAP для нашего варианта использования. Она позволяет MDM зарегистрировать интерес к ресурсу и получать автоматические уведомления при изменении значения ресурса. Ручка реализует Observe для энергозависимых ресурсов (батарея, словарь, язык, использование, ошибки).

Ресурс Observe по умолчанию Частота обновления
/battery Включено При каждом изменении на 1%
/dict Включено При смене словаря
/lang Включено При смене языка
/usage Включено Каждые 60 с
/errors Включено При событии ошибки

MDM в классе может зарегистрировать Observe на всех 30 ручках для /usage и /errors. Когда ученик касается нового слова, ручка отправляет уведомление Observe через CoAP в течение 200 мс. MDM агрегирует данные и обновляет панель учителя в реальном времени.

5. Блочная передача

Обновления словаря могут достигать 64 МБ (один языковой пакет для английского составляет 38 МБ, для арабского — 24 МБ, для мандарина — 42 МБ). Один UDP-датаграмма не может это перенести. Блочная передача RFC 7959 разбивает полезную нагрузку на блоки до 1024 байт.

Размер блока Вариант использования Время передачи 38 МБ
256 байт По умолчанию для клиентов с малым ОЗУ 18 мин
512 байт По умолчанию для стороны ручки 9 мин
1024 байт По умолчанию для стороны MDM 5 мин

Блочный приёмник ручки поддерживает блоки до 1024 байт и может возобновить прерванную передачу с помощью опции Block2. Если ручка перезагружается во время передачи, MDM повторно отправляет только отсутствующие блоки, а не весь словарь.

6. Уровень безопасности DTLS 1.2

Каждый запрос и ответ CoAP зашифрованы с помощью DTLS 1.2. Ручка использует ECDHE_ECDSA с P-256 и AES-128-CCM-8 — те же примитивы, что мы используем для BLE SSP (TC-059). Handshake выглядит следующим образом:

Шаг Время на L5
ClientHello 14 мс
ServerHello + Certificate + ServerHelloDone 24 мс
ClientKeyExchange + CertificateVerify + Finished 38 мс
Server Finished 18 мс
Общее рукопожатие 94 мс

Рукопожатие за 94 мс выполняется достаточно быстро, чтобы MDM мог открывать новый сеанс DTLS для каждого обновления словаря без ощутимой задержки. Для уведомлений Observe сеанс поддерживается в течение 24 часов и повторно согласовывается по запросу.

7. Пример CoAP-запроса

MDM, отправляющий GET на /srp/v1/info , формирует:

Header: TKL=0, Code=0.01 (GET), Message ID=0x4F2B
Token: (empty)
Options: 
  Uri-Path: "srp"
  Uri-Path: "v1"
  Uri-Path: "info"

Ручка отвечает:

Header: TKL=4, Code=2.05 (Content), Message ID=0x4F2B
Token: 0xA1B2C3D4
Options:
  Content-Format: application/json
Payload:
{
  "model": "Q8",
  "fw": "3.3.1",
  "brand": "acme",
  "lang": "en-US",
  "dict": "us-k-2-2026q1",
  "bat": 84,
  "mac": "AA:BB:CC:DD:EE:FF",
  "uptime_s": 38472,
  "tap_count_lifetime": 482193
}

Полный ответ составляет 198 байт, включая заголовки. Один UDP-пакет при MTU 568 байт легко вмещает эти данные.

Пример работы CoAP Observe

MDM, регистрирующий Observe на /srp/v1/usage:

Header: TKL=4, Code=0.01 (GET), Message ID=0x4F2C
Token: 0x12345678
Options:
  Uri-Path: "srp"
  Uri-Path: "v1"
  Uri-Path: "usage"
  Observe: 0 (register)

Ручка отвечает текущим значением, а затем отправляет обновления при каждом изменении:

Header: TKL=4, Code=2.05 (Content), Message ID=0x4F2D
Token: 0x12345678
Options:
  Observe: 1 (first notification)
  Content-Format: application/json
Payload:
{
  "ts": 1735689600,
  "taps_last_60s": 47,
  "audio_seconds_last_60s": 38.4,
  "errors_last_60s": 0
}

Класс с 30 ручками с уведомлениями Observe с частотой 1 Гц генерирует 30 уведомлений в секунду, что в сумме составляет 1,8 КБ/с. Это значительно ниже пропускной способности любой школьной Wi-Fi сети.

9. Реальные сбои, которые мы наблюдали

Сбой % CoAP-тикетов Решение
Тайм-аут рукопожатия DTLS 31% Уменьшить тайм-аут рукопожатия, добавить повторные попытки
Сбой возобновления блочной передачи 22% Добавить обработку опции Block2
Потеря Observe при перезагрузке ручки 17% Повторная регистрация Observe при обнаружении перезагрузки
Коллизия токена 12% Рандомизировать токен для каждого запроса
Полезная нагрузка слишком велика для UDP 9% Принудительная блочная передача на 256 байт
Устаревшая запись mDNS 6% Уменьшить TTL mDNS до 60 с
Неправильный content-format 3% Проверять Content-Format в ответе

Основной вид сбоя (тайм-аут рукопожатия DTLS) был связан с школьной сетью, которая молча отбрасывала UDP-пакеты выше определённого размера. Мы уменьшили максимальный размер записи DTLS с 2048 до 1024 байт, что решило проблему.

10. Расход батареи

На T2 (2500 мАч) с прошивкой 2.6.4:

Режим Потребление тока Расход батареи
Wi-Fi подключен, CoAP неактивен 6,2 мА базовый уровень
Wi-Fi подключен, CoAP в режиме ожидания 6,5 мА +0,3 мА (4,8%)
Wi-Fi подключён, CoAP Observe 1 Гц 7.1 мА +0.9 мА (14.5%)
Wi-Fi подключено, CoAP блочная передача 9.4 мА +3.2 мА (51.6%)

Блочная передача требует высоких затрат, поскольку радиомодуль остаётся полностью активным на протяжении всего скачивания. Для передачи словаря объёмом 38 МБ радиомодуль активен около 5 минут, потребляя примерно 470 мА·ч, что составляет 19% от батареи T2. Поэтому мы рекомендуем выполнять обновление словарей при подключённом питании от сети переменного тока, а не от батареи.

11. Тестирование совместимости CoAP

Стек CoAP ручки успешно проходит набор тестов совместимости ETSI CoAP plugtest (32 тестовых случая) и набор тестов взаимодействия IETF CoAP (84 тестовых случая). Стек также проверен на совместимость с эталонными реализациями с открытым исходным кодом Californium (Java) и aiocoap (Python).

Набор тестов Процент прохождения Последний запуск
ETSI CoAP plugtest 100% (32/32) 2026-04
IETF CoAP interop 100% (84/84) 2026-04
Californium interop 100% (24/24) 2026-04
aiocoap interop 100% (24/24) 2026-04

CoAP Latency per Operation (ms)

12. Дорожная карта: CoAP поверх Thread и Matter

В 2027 году мы планируем добавить поддержку радиомодуля Thread в модель-наследнике L5, что позволит ручке участвовать в тканевой сети Matter. Matter использует CoAP поверх UDP (с DTLS) в качестве основного протокола, поэтому наш стек CoAP будет напрямую перенесён. Мы участвуем в Альянсе стандартов подключения с 2024 года для отслеживания эволюции спецификации Matter.

13. Как это связано с другими статьями

TC-064 — заключительная статья в кластере подключения. TC-062 документирует путь Wi-Fi. TC-063 документирует путь mDNS. TC-064 документирует прикладной протокол, работающий поверх обоих. TC-033 охватывает MQTT — облачный протокол, который может располагаться выше CoAP в некоторых развёртываниях. TC-044 сравнивает CoAP, MQTT и HTTP для вариантов использования IoT. TC-099 и TC-100 охватывают криптографию, защищающую канал CoAP.

15. Дополнительное чтение


Запросить расчёт — Получите быстрый ответ с завода

15. Данные полевого развёртывания, совместимость с MDM и контрольный список закупок

Среди развёрнутых 47 000+ устройств в 47 странах стек CoAP+DTLS на моделях L5, T2 и Y6 обработал 1,9 миллиона подтверждаемых (CON) транзакций с третьего квартала 2024 года, со средним временем отклика 142 мс по каналу WPA2-Personal 2,4 ГГц и частотой доставки 99,9% после повторной передачи. Стек построен на базе coap-engine Contiki-NG с кэшем сессий DTLS 1.2/1.3 на 8 сессий и буфером наблюдения за ресурсами 4 КБ и согласован по микропрограмме с базовыми версиями B1/B2 2.4.7, F8 3.1.2, K7/KF1 1.9.5, L5 4.2.0, P2 2.0.3, Q6/Q8 3.3.1 и T2/Y6 2.6.4.

16.1 Время отклика и нагрузка на сервер

На графике ниже показана медиана времени отклика CoAP для PUT-запроса размером 64 байта при увеличении частоты запросов на стороне MDM от 1 до 50 запросов в секунду. Данные получены из 600 испытаний на Aruba CX 6000 с флотом из 30 ручек, зафиксированных между Q1 2025 и Q1 2026 при 23°C и относительной влажности 55%.

CoAP Round-Trip vs Server Workload

16.2 Схема ресурсов и ограничения блочной передачи

Дерево ресурсов CoAP по умолчанию предоставляет 12 конечных точек, все из которых поддерживают блочную передачу (RFC 7959) для полезных нагрузок размером более 1024 байт. Схема ниже является заводской настройкой по умолчанию; бренды могут добавлять или переименовывать конечные точки при MOQ 3 000 с 6-недельным графиком разработки микропрограммы.

Ресурс Метод Размер по умолчанию Лимит блока Авт.
/.well-known/core GET 280 B n/a None
/pen/model GET 8 B n/a None
/pen/fw GET 6 B н/д Нет
/pen/bat GET 4 B н/д Нет
/pen/lang GET 4 B н/д Нет
/pen/oid GET 6 B н/д Нет
/pen/telemetry GET 64 B 1 024 B DTLS-PSK
/pen/telemetry POST н/д 4 096 B DTLS-PSK
/pen/log GET н/д 16 384 B DTLS-PSK
/pen/cmd PUT 32 B 256 B DTLS-PSK
/pen/ota PUT н/д 65 536 B DTLS-PSK + сертификат
/pen/cfg GET 256 B 1 024 B DTLS-PSK

16.3 Правила принятия решения покупателем

Совет покупателю: Если ваш стек MDM работает с MQTT, не навязывайте обёртку CoAP только потому, что ручка её поддерживает. CoAP отлично проявляет себя в локальных школьных программах, где медианная RTT 142 мс и частота доставки 99,9 % позволяют сэкономить 8–12 % на исходящем облачном трафике по сравнению с аналогичным путём MQTT-over-TLS. Для программ с приоритетом WAN/облако оставайтесь на MQTT и используйте CoAP как локальный резерв для той же панели управления MDM.

16.4 Сертификационный охват стека CoAP+DTLS

Уровень CoAP работает на той же станции Wi-Fi 2,4 ГГц, что и поток подготовки, и подпадает под CE-RED (EN 300 328 v2.2.2), FCC Part 15.247, UKCA-RER, RCM (AS/NZS 4268), KC, MIC и ISED RSS-247. Наборы шифров DTLS 1.2/1.3 совместимы с FIPS (TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384), а сертификаты выдаются внутренним УЦ, привязанным к HSM нашей PKI. EN 71-1/-2/-3, ASTM F963-17, CPSIA, RoHS, REACH и PROP 65 распространяются на корпус. GCC (SFDA), ESMA (UAE MoIAT), SNI (Индонезия), NOM (Мексика) и INMETRO (Бразилия) расширяют доступ на рынки. Каждая партия сопровождается 38-страничным Отчётом о типовых испытаниях и серийным номером на единицу продукции, который привязан к маршрутному листу ОТК.

16.5 Внутренние перекрёстные ссылки и пути чтения

Описание процедуры Wi-Fi-инициализации, выполняемой до CoAP, см. Подготовка Wi-Fi ручки через режим точки доступа. Уровень обнаружения в локальной сети, который объявляет конечные точки CoAP, описан в разделе Обнаружение служб mDNS и DNS-SD ручки для чтения. Сравнение MQTT на стороне облака см. IoT Reading Pen: MQTT vs HTTP vs CoAP и Облачная архитектура IoT-пенала: MQTT. Модель сертификата, защищающая квитирование DTLS, описана в IoT-пенал: TLS 1.2 vs 1.3 и сертификат. Со стороны производителя программы см. Оптовые пеналы для чтения и ODM-инжиниринг пеналов для чтения.

Призыв к действию: нужен пользовательский ресурсный узел CoAP для панели MDM или школьной локальной сети? Запросить расчёт стоимости со словом «COAP-RES», и мы вышлем 6-страничную схему ресурсов (URI, методы, возможности блочной передачи, аутентификация) и расчёт стоимости интеграции прошивки по фиксированной цене в течение 24 часов. Готовые нейтральные пеналы отгружаются при MOQ 500 сроком 5 дней, пользовательские схемы CoAP при MOQ 3 000 со сроком интеграции прошивки 6 недель.

Frequently Asked Questions

Поддерживает ли читающая ручка CoAP поверх TCP (RFC 8323)?
Нет. Ручка поддерживает только CoAP поверх UDP. CoAP-over-TCP по RFC 8323 требует TCP-стека, что добавляет 38 КБ ОЗУ. Ограниченный бюджет памяти ручки не позволяет разместить одновременно BLE-стек и полный TCP-стек.
Какую версию DTLS использует ручка?
DTLS 1.2 (RFC 6347) с ECDHE_ECDSA, P-256 и AES-128-CCM-8. DTLS 1.3 (RFC 9147) запланирован на 2027 год для модели-преемника L5, но сейчас не поставляется. DTLS 1.0 не поддерживается.
Может ли ручка одновременно выступать в роли CoAP-сервера и CoAP-клиента?
Да. Ручка является одновременно CoAP-сервером (отвечает на GET/PUT/POST запросы MDM) и CoAP-клиентом (отправляет уведомления Observe). Двойная роль стека добавляет 0,4 КБ ОЗУ и 1,2 КБ ПЗУ. L5, T2 и Y6 поддерживают двойную роль.
Каков максимальный размер одного CoAP-пакета?
Без блочной передачи максимум составляет 1152 байта (полезная нагрузка UDP-датаграммы за вычетом служебных данных заголовка CoAP, что укладывается в типичный MTU Ethernet 1500 байт). С блочной передачей (RFC 7959) эффективного ограничения нет; мы тестировали передачу словарей до 64 МБ.
Может ли ручка участвовать в Matter-фабрике?
Пока нет. Matter требует Thread или Wi-Fi плюс CoAP-стек. Наши L5, T2 и Y6 сейчас используют Wi-Fi плюс CoAP, но не имеют уровня приложений Matter. Планируемая на 2027 год модель-преемник L5 добавит радиомодуль Thread и поддержку Matter с переиспользованием существующего CoAP-стека.
Ваша корзина
Разрешение cookies улучшит вашу работу с этим сайтом. Политика cookies
Chat on WhatsApp