Это клиентская реализация 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);