Аудитория: Встроенные инженеры-программисты прошивки, архитекторы 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 |
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. Дополнительное чтение
- Ручка для чтения: режим WiFi AP — подготовка Smart Config
- Ручка для чтения: mDNS и обнаружение служб DNS-SD
- Ручка для чтения: WiFi 2.4G и двухдиапазонный IoT
- Ручка для чтения: роуминг и повторное подключение WiFi
- IoT Reading Pen: MQTT vs HTTP vs CoAP
- Ручка для чтения: облачная архитектура IoT — MQTT
- Ручка для чтения: криптография и TrustZone
- Ручка для чтения: TLS 1.2 vs 1.3 и сертификаты
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%.
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 недель.