banner
CoAP Protocol and Thread Management in Zephyr RTOS.

В статьях 1, 2, 3 было рассмотрено применении протоколов MQTT, HTTP, CoAP для передачи данных от программы Object Detector в Zephyr RTOS. Принимаемые в Zephyr RTOS данные никак не использовались, они просто выводились в терминал, подтверждая наличие трафика между прграммами. В этой статье, на примере программы реализации протокола CoAP в Zephyr RTOS, предложен метод управления рабочими потоками на основе анализа принятых данных. Назовем этот метод расширением для протокола CoAP. Под рабочим понимается поток, содержащий определенную нагрузку, например, управление двигателем.
Если коротко: программа Object Detector распознает объекты, передает их имена посредством протокола CoAP (через сервер CoAP) в Zephyr RTOS. Программа CoAP в Zephyr RTOS принимает имена объектов. Расширение CoAP управляет рабочими потоками в соответстветствии с именами объектов.
Алгоритм расширения CoAP реализован следующим образом. Во первых, в принятых данных ищется имя (название) объекта, например, "person", "tvmonitor". Программа Object Detector распознаает и может передавать имена 80 типов объектов. Далее на основании найденного имени объекта расширение управляет в Zehyr RTOS соответствующим потоком.
На рисунке 1 показан фрагмент исходного кода расширения. На рисунке 2 показан результат работы программы CoAP запущенной на плате nRF7002 DK.
Отмечу, что реализация протокола CoAP принадлежит вот этому автору. Опубликованный им исходный код не изменен. Для запуска расширения к тексту добавлен вызов функции static void decoding_object (const uint8_t *payload). Место вызова функции показано на рисунке 3.
Это тридцать вторая статья из цикла "Real-Time Object Recognition". Первые тридцать одна опубликованы здесь: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30 и 31

1. Исходный код и результат работы программы.

Рисунок 1.


Результат работы программы.

Рисунок 2.


Место вызова функции static void decoding_object (const uint8_t *payload)

Рисунок 3.

2. Описание расширения для протокола CoAP.
В функцию static void response_cb( ... ) исходного кода реализации CoAP (проверена на версии nRF Connect SDK v3.1.1) добавлен вызов функции static void decoding_object (const uint8_t *payload), в которой *payload указывает на принятые от сервера данные.
В строках 80 - 86 цикла for (Рисунок 1) предпринимается попытка обнаружить название принятого объекта. Если имя объекта обнаружено, то в строках 91 - 100 оператора switch программа открывает семафор k_sem_give(&instance_person_sem) или k_sem_give(&instance_monitor_sem). Эти семафоры предназначены для управления работой потоков thread0_id и thread1_id в их функциях static void thread0(void) и static void thread1(void). Указанные функции содержат бесконечные циклы while(1). Возможность входа во внутрь циклов и выпонение определенной работы регулируются семафорами.
Создание и удаление потоков это ресурсоемкие операции. В данной реализации потоки создаются при старте программы CoAP. Входы в функции потоков выполняются многократно при дешифрации имен объектов и разрешении семафоров.
Описанное здесь расширение - это простой пример использования протокола CoAP для приема информации, ее дешифрации и выполнения предполагаемой работы в потоках Zephyr RTOS. Для конкретной задачи потребуется более детальная проработка расширения.

Расширение можно загрузить.
Консультации через e-mail: veresov@jdesign.ru или телефон: +7 921-215-45-70.
Евгений Вересов.
20.05.2026 года.