Qt CoAP 概要
Constrained Application Protocol (CoAP)はIoTプロトコルで、特に制約のあるネットワークにおける制約のあるデバイス(マイクロコントローラなど)間のM2Mデータ交換用に設計されている。
CoAPのインタラクションモデルはHTTPのクライアント/サーバーモデルに似ているが、HTTPとは異なり、UDPのようなデータグラム指向のコネクションレス・トランスポートを使用するため、オーバーヘッドが非常に小さく、アドレス指定にUDPブロードキャストやマルチキャストを使用できる。同時に、軽量な信頼性メカニズムとセキュリティを提供する。
Qt CoAP はCoAPのクライアント・サイドを実装している。デフォルトでは、トランスポート・レイヤーはセキュリティのために 、 。QCoapConnectionインターフェースを実装することで、別のトランスポートを使用することができる。QUdpSocket QDtls
メッセージング・モデル
CoAPメッセージング・モデルは、エンドポイント間のメッセージ交換に基づいている。クライアントはサーバーにリクエストを行い、サーバーはレスポンスを送り返す。クライアントはサーバーにリクエストを行い、サーバーはレスポンスを返します。クライアントはリソースをGET、PUT、POST、DELETEすることができます。クライアントは、サーバー上のリソースをGET、PUT、POST、およびDELETEすることができる。クライアントはまた、発見リクエストを行うことによって、サーバー上のリソースを発見することができ、ローカルネットワークでは、マルチキャスト発見リクエストを行うことによって、リソースを発見することができる。observeリクエストでリソースを購読することも可能である。
転送の信頼性は、メッセージに確認可能(CON)を付けることで達成される。確認可能なメッセージは、受信者が確認応答(ACK)メッセージを送信するまで、デフォルトのタイムアウトと指数関数的なバックオフを使って再送される。受信者が確認可能メッセージを処理できない場合、確認応答の代わりにリセット・メッセージ(RST)を返信する。
信頼性のある伝送を必要としないメッセージは、確認不可能(NON)メッセージとして送ることができる。
Qt CoAP API の使用
クライアントとCoAPサーバーの通信は、QCoapClient クラスを使って行われます。このクラスには、さまざまなCoAPリクエストを送信するためのメソッドと、送信されたリクエストに対するリプライが到着したときにトリガーされるシグナルが含まれています。QCoapRequest クラスは CoAP リクエストの作成に使われる。サーバーからのレスポンスは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 Format で表現される。
ディスカバリー・リプライを取得するために、専用の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 リソースのリストを返す。
リソース観測
Observe リクエストは、リソースの自動サーバー通知を受け取るために使用されます。クライアントはリソースにオブザーブリクエストを送ることで、オブザーブ可能なリソースのオブザーバーになる。例えば、上の例の温度センサーはobs
属性を持っているので、観測可能です。そのため、クライアントはobserveリクエストを送ることで、温度の更新を購読することができます。
以下のコード例では、Qt CoAP を使って Observe リクエストを送る方法を示しています:
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 、リソース表現が1つのCoAPデータグラムのペイロードで快適に転送できるよりも大きい場合のために、ブロック単位の転送をサポートしています。
セキュリティ
CoAPには以下のセキュリティ・モードが定義されている:
- 事前共有鍵- このモードでは、クライアントはそのアイデンティティと事前共有鍵をサーバーに送信する必要があります。
- 生公開鍵- クライアントは証明書なしの非対称鍵ペア(生公開鍵)を持っている。Qt CoAP はまだこのモードを実装していない。
- 証明書- クライアントは、共通のトラスト・ルートによって署名されたX.509証明書と非対称鍵ペアを持つ。
CoAPはUDPベースのプロトコルとして設計されているため、Qt CoAP モジュールはUDP上のデータグラムTLS(DTLS)に基づいたセキュリティを実装している。しかし、上述したように、別のセキュリティ・タイプを持つカスタム・トランスポートを提供することも可能である。
CoAPクライアントを保護するためには、クライアントを作成するときに、サポートされているセキュリティ・モードの1つを指定しなければならない:
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);
© 2025 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.