Введение в QtCoAP

QtCoAP, M2M, Qt

Это клиентская реализация Constrained Application Protocol (Протокола ограниченных приложений (CoAP)) для Internet of Things (Интернета вещей). Библиотека предоставляет быстрый и простой способ использования протокола CoAP в ваших кроссплатформенных приложениях Qt. Как было объявлено ранее, QtCoAP будет доступен в новом выпуске Qt 5.13 как часть Qt for Automation вместе с другими реализациями протокола IoT, такими как MQTT, KNX и OPC UA.

Что такое CoAP?

CoAP был разработан, как облегченный протокол обмена данными между компьютерами (M2M), который может работать на устройствах с ограниченным объемом памяти и вычислительных ресурсов. Он основан на концепции RESTful APIs и очень похож на HTTP.

CoAP имеет архитектуру «клиент-сервер» и использует запросы GET, POST, PUT и DELETE для взаимодействия с данными. Но в отличие от HTTP, он использует облегченный UDP для переноса вместо TCP. Кроме того, он поддерживает некоторые интересные функции, такие, как многоадресные запросы, обнаружение ресурсов и наблюдение.

Благодаря низким расходам и простоте CoAP стал одним из популярных протоколов IoT для использования на встроенных устройствах. Он действует, как своего рода HTTP для встроенного мира.

Обзор реализации QtCoAP

QtCoAP поддерживает следующие функции:

  • Наблюдение за ресурсами.
  • Обнаружение ресурсов.
  • Групповое общение (многоадресная передача).
  • Блочные переводы.
  • Безопасность.

Библиотека действительно проста в использовании. Вам просто нужно создать экземпляр объекта QCoapClient и подключить его сигналы:

QCoapClient client;
connect(&client, &QCoapClient::finished, this, &CoapHandler::onFinished);
connect(&client, &QCoapClient::error, this, &CoapHandler::onError);

Теперь вы готовы отправлять запросы и получать ответы:

// GET requests
client.get(QUrl("coap://127.0.0.1:5683/resource"));
// or simply
client.get(QUrl("127.0.0.1/resource"));

// PUT/POST requests
QFile file("data.json");
// ...
client.post(QUrl("127.0.0.1/resource"), file.readAll());
client.put(QUrl("127.0.0.1/resource"), file.readAll());

// DELETE requests
client.deleteResource(QUrl("127.0.0.1/resource"));

Используя класс QCoapRequest , вы можете передавать параметры и настраивать ваши запросы. Например:

QCoapRequest request;
request.setUrl(QUrl("127.0.0.1"));
request.setPayload(file.readAll());
request.addOption(QCoapOption::UriPath, "resource");
client.put(request);

CoAP также предоставляет механизм публикации-подписки, который достигается с помощью запросов “observe” («наблюдения»):

QCoapReply *observeReply = client.observe(QUrl("127.0.0.1/temperature"));
connect(observeReply, &QCoapReply::notified, this, &CoapHandler::onNotified);

Теперь ваше приложение будет получать уведомления при каждом изменении ресурса “/temperature” («/температура»).

Что делает CoAP еще более интересным, так это возможность находить и открывать ресурсы CoAP. Вы можете найти ресурсы на данном хосте:

QCoapResourceDiscoveryReply
*discoverReply = client.discover(QUrl("127.0.0.1"));

Или во всей сети:

QCoapResourceDiscoveryReply
*discoverReply = client.discover();

Это отправит запрос на обнаружение многоадресной рассылки IPv4 CoAP multicast group. Вы также можете запустить обнаружение для узлов IPv6:

discoverReply = client.discover(QtCoap::MulticastGroup::AllCoapNodesIPv6LinkLocal);
// or
discoverReply = client.discover(QtCoap::MulticastGroup::AllCoapNodesIPv6SiteLocal);
...
connect(discoverReply, &QCoapResourceDiscoveryReply::discovered, this, &CoapHandler::onDiscovered);

Вы получите несколько ответов об обнаружении от каждого устройства CoAP в вашей сети. Например:

Host 1:

RES: 2.05 Content
;rt="temperature-c";if="sensor";obs,
;rt="firmware";sz=262144

Host 2:

RES: 2.05 Content
;rt="temperature-c";if="sensor";obs,

Это будет означать, что в вашей сети есть 2 устройства, на которых работают серверы CoAP: одно из них подключено к датчикам температуры и освещенности, а другое - только к датчику температуры.

Безопасность

Последнее, но не менее важное - это безопасность. Библиотека Qt CoAP поддерживает следующие режимы безопасности:

  • Аутентификация с помощью pre-shared keys (общих ключей).
  • Использование X.509 certificates (сертификатов X.509).

Для защиты соединения CoAP вам необходимо пройти один из этих режимов при создании клиента и настроить его соответствующим образом. Например:

QCoapClient secureClient(QtCoap::SecurityMode::PreSharedKey);
QCoapSecurityConfiguration config;
config.setIdentity("Client_identity");
config.setPreSharedKey("secretPSK");
secureClient.setSecurityConfiguration(config);
We recommend hosting TIMEWEB
We recommend hosting TIMEWEB
Stable hosting, on which the social network EVILEG is located. For projects on Django we recommend VDS hosting.
Support the author Donate

Comments

Only authorized users can post comments.
Please, Log in or Sign up
Donate

Hello, Dear Users of EVILEG!!!

If the site helped you, then support the development of the site financially, please.

You can do it by following ways:

Thank you, Evgenii Legotckoi

p
Feb. 17, 2020, 1:41 p.m.
pstMem

C++ - Тест 003. Условия и циклы

  • Result:85points,
  • Rating points6
z
Feb. 17, 2020, 5:02 a.m.
zet

C++ - Test 006. Enumerations

  • Result:80points,
  • Rating points4
z
Feb. 17, 2020, 4:49 a.m.
zet

C++ - Test 001. The first program and data types

  • Result:80points,
  • Rating points4
Last comments
Feb. 17, 2020, 2:22 a.m.
Evgenij Legotskoj

Добрый день. Это кастомный тег, помещается в файл, который находится в каталоге templatetags myapp/ templatetags/ myapp.py
B
Feb. 16, 2020, 12:36 p.m.
BahaMeirman

Добрый вечер! Монжно по подробней о теге get_companion? ссылка не работает.
Feb. 16, 2020, 8:35 a.m.
Evgenij Legotskoj

Добрый день. На GitHub исходники, можете посмотреть в официальном репозитории
B
Feb. 16, 2020, 8:29 a.m.
BahaMeirman

Здравстсвуйте Евгений, непонятно мне где эти исходники найти?
Now discuss on the forum
Feb. 18, 2020, 2:16 p.m.
Mihailll

Нет, стоит minLevel=1 А что это значит? Поменял на 0, но ничего не изменилось. Файл настроек выглядит так [listener]; host=192.168.0.100port=8080minThreads=4maxThreads=100…
Feb. 18, 2020, 6:19 a.m.
Pavel.K

Привет , кто -нибудь подскажет как реализовать перетаскивание обьектов из листвью , и как это вообще делается ? Суть в том ,чтобы при объекта из листвью модели ,знать что за обьект. В…
V
Feb. 17, 2020, 2:11 p.m.
Vitali

Добрый день. Сейчас инициализация моего приложение выглядит приблизительно так: sys_argv = sys.argvsys_argv += ['--style', 'material']app = QGuiApplication(sys_argv)app.setWindowIcon…
Feb. 16, 2020, 1:13 p.m.
BlinCT

Всем привет. есть те кто сталкивался с данной прогой? Нужна наводка просто как правильно из кучи инфы что содержит файл trace.dat и скармливается kernelshark вытащить причину долгого с…
IP
Feb. 16, 2020, 10:35 a.m.
Igor' Poroshin

#include <QSqlError>#include <QSqlQuery>...if (!model->select()) { qDebug() << model->lastError().text(); qDebug() << model->query().lastQue…
EVILEG
About
Services
© EVILEG 2015-2019
Recommend hosting TIMEWEB