mafulechka
10 июня 2019 г. 14:01

Введение в QtCoAP

Это клиентская реализация 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 и подключить его сигналы:

  1. QCoapClient client;
  2. connect(&client, &QCoapClient::finished, this, &CoapHandler::onFinished);
  3. connect(&client, &QCoapClient::error, this, &CoapHandler::onError);

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

  1. // GET requests
  2. client.get(QUrl("coap://127.0.0.1:5683/resource"));
  3. // or simply
  4. client.get(QUrl("127.0.0.1/resource"));
  5.  
  6. // PUT/POST requests
  7. QFile file("data.json");
  8. // ...
  9. client.post(QUrl("127.0.0.1/resource"), file.readAll());
  10. client.put(QUrl("127.0.0.1/resource"), file.readAll());
  11.  
  12. // DELETE requests
  13. client.deleteResource(QUrl("127.0.0.1/resource"));

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

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

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

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

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

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

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

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

  1. QCoapResourceDiscoveryReply
  2. *discoverReply = client.discover();

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

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

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

Host 1:

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

Host 2:

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

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

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

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

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

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

  1. QCoapClient secureClient(QtCoap::SecurityMode::PreSharedKey);
  2. QCoapSecurityConfiguration config;
  3. config.setIdentity("Client_identity");
  4. config.setPreSharedKey("secretPSK");
  5. secureClient.setSecurityConfiguration(config);

Вам это нравится? Поделитесь в социальных сетях!

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь