Qt CoAPの概要

Constrained Application Protocol (CoAP)はIoTプロトコルで、特に制約のあるネットワークにおける制約のあるデバイス(マイクロコントローラなど)間のM2Mデータ交換のために設計されている。

CoAPのインタラクションモデルはHTTPのクライアント/サーバーモデルに似ているが、HTTPとは異なり、UDPのようなデータグラム指向のコネクションレス・トランスポートを使用するため、オーバーヘッドが非常に小さく、アドレス指定にUDPブロードキャストやマルチキャストを使用できる。同時に、軽量の信頼性メカニズムやセキュリティも提供します。

Qt CoAPはCoAPのクライアント側を実装しています。デフォルトでは、トランスポートレイヤーはセキュリティのためにQUdpSocketQDtls を使用します。QCoapConnectionインターフェースを実装することで、別のトランスポートを使用することができます。

メッセージング・モデル

CoAPメッセージング・モデルは、エンドポイント間のメッセージ交換に基づいている。クライアントはサーバーにリクエストを出し、サーバーはレスポンスを返す。クライアントはサーバーにリクエストを行い、サーバーはレスポンスを返します。クライアントはリソースをGETPUTPOSTDELETEすることができます。クライアントは、サーバー上のリソースを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には以下のセキュリティ・モードが定義されています:

  • 事前共有鍵- このモードでは、クライアントはそのアイデンティティと事前共有鍵をサーバーに送信する必要があります。
  • 生公開鍵- クライアントは証明書なしの非対称鍵ペア(生公開鍵)を持っている。クライアントは、公開鍵から計算された ID と、通信可能なノードの ID リストも持っています。Qt CoAPはまだこのモードを実装していません。
  • 証明書- クライアントは、共通のトラスト・ルートによって署名されたX.509証明書と非対称鍵ペアを持ちます。

CoAPはUDPベースのプロトコルとして設計されているため、Qt CoAPモジュールはUDP上のDatagram 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);

本ドキュメントに含まれる文書の著作権は、それぞれの所有者に帰属します。 ここで提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。