banner
Object Detector and CoAP Clients.

Статья содержит описание двух различных клиентов, обменивающихся данными через сервер CoAP. Вот спецификация протокола CoAP. Первый клиент реализован в программе Object Detector версии 1.7.9. Этот клиент разработан средствами Qt/C++ на основе публикации от компании Qt Group. Ниже показан исходный текст класса реализующего протокол CoAP. Object Detector распознает объекты, формирует строку формата "object: 0,XX distance: XXX" и передает ее с помощью клиента на сервер CoAP. Работа программы проверена на серверах californium.eclipseprojects.io и coap.me.
Второй клиент предназначен для работы на MCU в Zephyr RTOS и написан на языке С. Автора проекта можно увидеть пройдя по ссылке. Этот клиент считывает данные с сервера CoAP и выводит их в терминал проекта. Это те данные, что отправляет на сервер клиент Object Detector. Синхронизирован ли процесс обмена данными между клиентами? Нет, клиенты ничего не знают друг о друге и работают асинхронно. Проект второго клиента в Visual Studio Code показан на рисунке. Так организован трафик Object Detector ⇄ coap.me ⇄ client CoAP.
На каких платах с MCU может быть запущен второй клиент CoAP?
Здесь приведен список устройства от компании Nordic Semiconductor. Обратите внимание на то, что платы из этого списка работают с множеством различных сетевых протоколов. Например, для платы nRF7002 DK можно использовать Wi-Fi, а плата nRF9151 DK предоставляет сотовые IoT-решения для LTE-M, NB-IoT. В данном проекте задействована плата nRF7002 DK с Wi-Fi. Конечно, можно использовать устройства и от других компаний.
Указанные выше сервера CoAP имеют различные ресурсы. Какие из них использованы в проекте?
Для отладки первого клиента (Object Detector) был использован сервер californium.eclipseprojects.io с ресурсом "/echo". Данные, исходящие от клиента, передавались на сервер методом POST, затем сервер отсылал их обратно клиенту в Object Detector. Object Detector принимал данные от сервера и сравнивал их с переданными. Если данные совпадали, формировалось разрешение на следующую операцию передачи, если нет, то выдавалось сообщение об ошибке.
При работе по схеме: Object Detector ⇄ coap.me ⇄ client CoAP задействован ресурс "/validate". В этом случае Object Detector отсылает данные методом PUT(POST), а клиент в Zephyr RTOS забирает данные методом GET.
Это двадцать девятая статья из цикла "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.
1. Как запустить проект клиента CoAP на плате nRF7002 DK.
Для запуска Wi-Fi клиента CoAP в RTOS Zephyr выполните следующие действия:
  • Загрузите архив nrfconnect/sdk-nrf и распакуйте его;
  • Перейдите в каталог sdk-nrf/samples/net/coap_client/ созданный архиватором, откройте в редакторе файл Kconfig;
  • Измените в строке 11 значение с ods на validate;
  • Измените в строке 15 значение с californium.eclipseprojects.io на coap.me;
  • Добавьте в один из файлов конфигурации проекта, например, в nrf7002dk_nrf5340_cpuapp_ns.conf следующие строки:
CONFIG_WIFI=y
CONFIG_WIFI_NRF70=y
CONFIG_WIFI_CREDENTIALS=y
CONFIG_WIFI_CREDENTIALS_STATIC=y
CONFIG_WIFI_CREDENTIALS_STATIC_SSID="XXXXXX"
CONFIG_WIFI_CREDENTIALS_STATIC_PASSWORD="XXXXX"
  • Создайте конфигурацию проекта в Visual Studio Code;
  • Скомпилируйте проект, загрузите во flash память, запустите;
  • Проверьте наличие сообщений о подллючении к сети Wi-Fi и серверу CoAP;
  • При работе с Object Detector во вкладке terminal проекта должны появляться сообщения о принятых клиентом обьектах.

VS Code c проектом CoAP клиента на nRF7002 DK.
CoAP client

2. Исходный код класса Coap в проекте Object Detector.

CoAP client CoAP client CoAP client CoAP client CoAP client
3. Краткое описание класса Сoap.
Функция Coap::Coap(QObject *parent) : QObject{parent}.
Это конструктор класса. В строке 27 создается QCoapClient. В строках 29,30 определяются функции обработки событий QCoapClient::finished и QCoapClient::error. В строках 32,33 устанавливаются параметры host и port для url. В строке 36 создается запрос на поиск данных в path /.well-known/core. Если запрос успешно создан, то в строке 38 для события QCoapResourceDiscoveryReply::discovered определяется функция Coap::onDiscovered обработки события.
Функция void Coap::onDiscovered(QCoapResourceDiscoveryReply *reply, QList<QCoapResource> resources).
В строке 54 проверяется успешна ли операция if (reply->errorReceived() != QtCoap::Error::Ok). Если операция успешна, то в строке 58 создается запрос на доступ к ресурсу /validate (/echo). Если запрос нормально создан, то для события QCoapReply::notified подключаем функцию Coap::onNotified. Список ресурсов QList<QCoapResource>, переданных сервером в функцию, в данном варианте программы не используется.
Функция void Coap::onNotified(QCoapReply *reply, const QCoapMessage &message).
В строке 68 проверяется успешна ли операция поиска ресурса if (reply->errorReceived() == QtCoap::Error::Ok). Если ресурс найден, устанавливаем флаги значениями sign_resource_success = true и flag_ready_send = true. Это флаги готовности к работе клиента CoAP. Сообщение QCoapMessage &message, переданное сервером в функцию, в данном варианте программы не используется.
Функция void Coap::send_to_server_coap(QString &name_and_distance).
Функция предназначена для отправки данных на сервер CoAP. Вызывается функция из класса MainWindow::MainWindow() и содержит в качестве аргумента строку данных формата "object: 0,XX distance: XXX".
Функция void Coap::onFinished(QCoapReply *reply).
В строке 109 этой функции проверяется успешность передачи данных на сервер. В режиме тестирования (echo) сравниваются переданные и принятые данные. Если все успешно, то устаналивается значение флага flag_ready_send = true.
Функция void Coap::onError(QCoapReply *reply, QtCoap::Error error).
Это обработчик ошибок. В строке 121 вызывается функция errorMessage(errorCode).
Функция QString Coap::errorMessage(QtCoap::Error errorCode).
В этой функции формируется сообщение об ошибке для выдачи пользователю.

Проект Object Detector можно загрузить и поблагодарить: Спасибо!  2202   2005   9442   6213   (счет в сбербанке).
Консультации через e-mail: veresov@jdesign.ru или телефон: +7 921-215-45-70.
Евгений Вересов.
14.02.2026 года.