|
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.
1. Как запустить проект клиента CoAP на плате nRF7002 DK.
Для запуска Wi-Fi клиента CoAP в RTOS Zephyr выполните следующие действия:
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"
VS Code c проектом CoAP клиента на nRF7002 DK.
2. Исходный код класса Coap в проекте Object Detector.
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 можно загрузить и поблагодарить:
Консультации через e-mail: veresov@jdesign.ru или телефон: +7 921-215-45-70.
|
