Qt CoAP 概要
Constrained Application Protocol(CoAP)は、リソース制約のあるネットワーク内のリソース制約のあるデバイス(マイクロコントローラなど)間のM2Mデータ交換のために特別に設計されたIoTプロトコルです。
CoAPの相互作用モデルはHTTPのクライアント/サーバーモデルに似ていますが、HTTPとは異なり、UDPなどのデータグラム指向の非接続型トランスポートを使用しています。これにより、オーバーヘッドを非常に低く抑え、アドレス指定にUDPブロードキャストおよびマルチキャストを使用することが可能になります。同時に、軽量な信頼性メカニズムとセキュリティも提供します。
Qt CoAP は、CoAPのクライアント側を実装しています。デフォルトのトランスポートはQUdpSocket 上に構築されており、QDtls はセキュアモードが選択された場合にのみセキュリティを提供します。デフォルトではセキュリティモードは有効になっていません(「セキュリティ」を参照)。QCoapConnectionインターフェースを実装することで、代替のトランスポートを使用することも可能です。
メッセージングモデル
CoAPのメッセージングモデルは、エンドポイント間のメッセージ交換に基づいています。クライアントはサーバーにリクエストを送信し、サーバーはレスポンスを返します。 クライアントは、リソースに対してGET、PUT、POST、DELETEを行うことができます。また、ディスカバリリクエストを送信することでサーバー上のリソースを検出したり、マルチキャストディスカバリリクエストを送信してローカルネットワーク上のリソースを検出したりすることもできます。さらに、observe リクエストを使用してリソースをサブスクライブすることも可能です。
転送の信頼性は、メッセージに確認可能(CON)のフラグを立てることで実現されます。 確認可能メッセージは、受信者が確認応答(ACK)メッセージを送信するまで、デフォルトのタイムアウトと再送信間の指数関数的バックオフを用いて再送信されます。受信者が確認可能メッセージを処理できない場合、確認応答の代わりにリセットメッセージ(RST)を返信します。
信頼性の高い送信を必要としないメッセージは、非確認可能(NON)メッセージとして送信できます。
Qt CoAP API の使用
クライアントとCoAPサーバー間の通信は、QCoapClient クラスを使用して行われます。このクラスには、さまざまなCoAPリクエストを送信するためのメソッドと、送信したリクエストに対する応答が到着した際にトリガーされるシグナルが含まれています。CoAPリクエストの作成には、QCoapRequest クラスが使用されます。サーバーからの応答は、QCoapReply オブジェクトとして返されます。例:
QCoapClient *client = new QCoapClient();
connect(client, &QCoapClient::finished, this, &MyClass::onFinished);
connect(client, &QCoapClient::error, this, &MyClass::onError);
QCoapRequest request(QUrl("coap://127.0.0.1/test"), QCoapMessage::Confirmable);
client->get(request);
client->put(request, QByteArray("payload"));サポートされている機能
リソースディスカバリ
CoAPディスカバリリクエストは、エンドポイント上またはネットワーク全体で利用可能なリソースを照会するために使用されます。これは、人間の介入がないM2Mアプリケーションにとって非常に重要です。例えば、ホームオートメーションやビルオートメーションでは、ローカルのクライアントとサーバーが人間の介入なしに互いを発見し、相互に通信する必要があります。 リソースディスカバリーにより、クライアントはネットワーク内で利用可能なエンドポイントに関する情報を取得できます。
Qt CoAP 単一のエンドポイントおよびマルチキャストグループへのディスカバリーリクエストをサポートしています。例えば、デフォルトのリソースディスカバリーエントリポイントである/.well-known/core へのディスカバリーリクエストに対しては、次のような応答が返される場合があります:
RES: 2.05 Content
</sensors/temp>;rt="temperature-c";if="sensor";obs,
</sensors/light>;rt="light-lux";if="sensor",
</firmware/v2.1>;rt="firmware";sz=262144これは、ネットワーク内に温度センサーおよび光センサー用のリソースと、ファームウェアリソースが存在することを示しています。応答はCoRE Link形式で表現されます。
ディスカバリー応答を取得するには、専用のQCoapResourceDiscoveryReply クラスが使用されます:
// This will make a multicast discovery request to the CoAP IPv4 multicast group.
QCoapResourceDiscoveryReply *discoverReply = client->discover();
connect(discoverReply, &QCoapResourceDiscoveryReply::discovered, this, &MyClass::onDiscovered);QCoapResourceDiscoveryReply::discovered は、ネットワーク内で検出されたCoAPリソースのリストを返します。
リソースの監視
オブザーブ要求は、リソースに関するサーバーからの自動通知を受信するために使用されます。クライアントは、リソースに対してオブザーブ要求を送信することで、オブザーバブルなリソースのオブザーバーとなります。たとえば、上記の例にある温度センサーは、obs 属性を持っているため、オブザーバブルです。したがって、クライアントは、そのセンサーに対してオブザーブ要求を送信することで、温度の更新情報を購読することができます。
以下のサンプルコードは、Qt CoAP を使用してオブザーブ要求を送信する方法を示しています:
QCoapReply *reply = client->observe(QUrl("127.0.0.1/temp"));
connect(reply, &QCoapReply::notified, this, &MyClass::onNotified);特に「Observe」リクエストに関しては、QCoapReply::notified シグナルを使用して、CoAPサーバーからの通知を処理することができます。
ブロック単位の転送
CoAPはUDPなどのデータグラム転送プロトコルに基づいているため、フラグメンテーションによる問題を引き起こさずに転送できるリソース表現のサイズには制限があります。Qt CoAP は、リソース表現が単一のCoAPデータグラムのペイロードで快適に転送できるサイズを超える場合のために、ブロック単位の転送をサポートしています。
セキュリティ
CoAP には、以下のセキュリティモードが定義されています。
- 事前共有鍵(Pre-Shared Key) - このモードでは、クライアントは自身の識別子と事前共有鍵をサーバーに送信する必要があります。
- 生公開鍵- クライアントは、証明書のない非対称鍵ペア(生公開鍵)を保有しています。また、クライアントは、公開鍵から算出された識別子と、通信可能なノードの識別子リストも保有しています。Qt CoAP では、このモードはまだ実装されていません。
- Certificate- クライアントは、共通信頼ルートによって署名された X.509 証明書付きの非対称鍵ペアを保持しています。
CoAPはUDPベースのプロトコルとして設計されているため、Qt CoAP モジュールはUDP上のDatagram TLS (DTLS) に基づくセキュリティを実装しています。ただし、前述の通り、別のセキュリティタイプを持つカスタムトランスポートを提供することも可能です。
注: カスタムトランスポートを指定した場合 、ここで説明した DTLS による保護は適用されなくなります。その場合、通信のセキュリティ確保は当該トランスポートの責任となり、そのトランスポートは、基盤となるプロトコルに適した暗号化、ピア認証、およびメッセージのフレーミングを提供する必要があります。 これらのいずれかを省略したトランスポートでは、リクエストとレスポンスが保護されない状態となりますが、その損失はアプリケーションの他の部分からは認識されません。
警告:デフォルトでは 、Qt CoAP はトランスポートセキュリティなしで動作します。セキュアモードが選択されていない限り、リクエストとレスポンスはプレーンなUDPデータグラムとして送信されます。デフォルト(QtCoap::NoSecurity )は、完全に信頼できるネットワークでのみ使用してください。信頼できないネットワークでは、セキュアモードを指定してQCoapClient を構築してください。
CoAP クライアントを保護するには、クライアントの作成時に、サポートされているセキュリティモードのいずれかを指定する必要があります。
QCoapClient *client = new QCoapClient(this, QtCoap::PreSharedKey);セキュリティパラメータの指定には、QCoapSecurityConfiguration クラスを使用します。たとえば、事前共有鍵モードでは、次のサンプルコードを使用できます:
QCoapSecurityConfiguration config;
config.setPreSharedKey("secretPSK");
config.setIdentity("Client_identity");
client->setSecurityConfiguration(config);また、証明書モードでは、次のようにします:
QCoapClient *client = new QCoapClient(this, QtCoap::Certificate);
QList<QSslCertificate> localCertificates, caCertificates;
QCoapPrivateKey key;
// Initialize the key and certificates
QCoapSecurityConfiguration config;
config.setLocalCertificateChain(localCertificates);
config.setCaCertificates(caCertificates)
config.setPrivateKey(key);
client->setSecurityConfiguration(config);© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.