Cloud IoT Core を使用すると、デバイスにコマンドを送信できます。コマンドは、Cloud IoT Core に接続され、コマンド トピックに登録されたデバイスに送信される一時的な 1 回限りのディレクティブです。
デバイス構成と比較して、他の Cloud IoT Core 機能に依存しないため、コマンドはより速く、より頻繁に送信できます。コマンドと構成を選択する際は、時間の経過に伴って永続性や知識が必要かどうか(構成)、速度または時間方向のディレクティブ(コマンド)を優先するかどうかを検討してください。
コマンドは次のような場合に役立ちます。
- 特定の時間に多数のデバイスにすばやくメッセージを送信する
- 特定の時間に多数のデバイスに多数のメッセージを送信する
- 有効期限が必要な時間制限のあるディレクティブを送信する
- 増分デバイス設定を送信する
コマンドには次の特徴があります。
- 登録済みの接続されているデバイスに直接送信される
- Cloud IoT Core で保持されない
- 登録されていないデバイスとコマンドの送信時に接続されていたデバイスはドロップされる
- 一意ではない(重複する情報が送信される場合があるものの、その可能性は低い)
- 特定の順序で送信されない(ただし、ほぼ送信順に配信される)
- 任意の形式(データの blob)
現在、Cloud IoT Core では MQTT 経由のコマンドのみがサポートされています(HTTP ではサポートされていません)。
コマンドと構成の比較
Cloud IoT Core はデバイスの構成もサポートしています。構成はコマンドよりも整合性があり、永続的です。構成は Cloud IoT Core に保持され、MQTT を使用すると、最終的にサブスクライブしたデバイスであっても、最終的にはサブスクライブされたすべてのデバイスに最新の構成が配信されます。
次の表は、コマンドと構成のどちらを使用するかを決定する際に役立ちます。
構成 | コマンド |
---|---|
最新の構成が配信されるまで再試行される(MQTT) | QoS 1 が再試行されますが、配信される保証はありません |
持続的であるため、後でデバイスが接続(MQTT)またはポーリング(HTTP)しても、最新の構成が引き続き配信されます | 永続的ではありません。コマンドの送信時に接続したデバイスにのみ配信されます |
新しいバージョンが以前のバージョンに置き換わります | コマンド間に関係や順序がない |
「ある」べき状態にデバイスに指示します。これは Cloud IoT Core の状態に対応します。 | 特定の時刻に「行う」ことをデバイスに指示します |
高レイテンシ | 低レイテンシ |
通常は小さいサイズ(最大 64 KB) | 最大 256 KB |
ユーザー定義の任意の blob | ユーザー定義の任意の blob |
デバイス 1 台あたり毎秒 1 件の更新 | 1 プロジェクトあたり 1,000 回/秒(構成可能) レジストリごとに 1 秒あたり 2,500 回 |
コマンドは Cloud IoT Core では保持されず、無期限に再試行されないため、デバイスのテレメトリーや状態データに特定のコマンドが反映されることはありません。デバイスがコマンドを受信していないか、後続のコマンドまたは構成を受信している可能性があります。コマンドは一時的なものであり、長期的なデバイスデータの一部ではありません。
コマンドの順序と重複を管理するには、デバイス ロジックまたはクライアント アプリケーションを使用します。
コマンドを送信する
デバイスにコマンドを送信するには、Google Cloud コンソール、gcloud、または Cloud IoT Core API を使用します。
Console
デバイスにコマンドを送信するには:
- Google Cloud コンソールで、[レジストリ] ページに移動します。
- ゲートウェイの [レジストリ ID] をクリックします。
- 左側のレジストリ メニューで、[デバイス] をクリックします。
- コマンドを送信するデバイスの ID をクリックします。
- ページの上部にある [コマンドを送信] をクリックします。
コマンドの形式を選択します。
- テキスト
- Base64
[Command data] フィールドに、コマンドを入力します。
オプションの [サブフォルダ] フィールドに、このコマンドのサブフォルダの名前を入力します。ワイルドカード トピックに登録されたデバイスは、サブフォルダに送信されたコマンドを受信します。
[コマンドを送信] をクリックします。
gcloud
デバイスにコマンドを送信するには、gcloud iot devices commands send
コマンドを実行します。
gcloud iot devices commands send \ { --command-file=COMMAND_FILE | --command-data=COMMAND_DATA } \ --region=REGION \ --registry=REGISTRY_ID \ --device=DEVICE_ID \ [--subfolder=SUBFOLDER]\
コマンドデータに特殊文字が含まれている場合は、--command-data
ではなく --command-file
を使用してください。
API
SendCommandToDevice メソッドを使用してコマンドを送信します。
C#
Go
Java
Node.js
PHP
Python
Ruby
コマンドを受信する
コマンドを受信するには、デバイスが次の条件を満たしている必要があります。
- MQTT プロトコルを使用して Cloud IoT Core に接続している
- MQTT トピック
/devices/{device-id}/commands/#
に登録される(# ワイルドカードは必須です)
ワイルドカード トピックをサブスクライブすると、デバイスは devices/{device-id}/commands
に送信されたコマンドと、サブフォルダ(devices/{device-id}/commands/{subfolder}
など)に送信されたコマンドを受信します。特定のサブフォルダへの登録はサポートされていません。
コマンドは、その時刻に接続され、登録されているデバイスに配信されます。後で接続とサブスクライブを行うデバイスのために、キューに入れられたり保持されたりすることはありません。
Quality of Service(QoS)
コマンド配信は、使用している QoS レベルによって異なります。
QoS レベル | 保証 |
---|---|
0 | リクエストが OK を返しても、無保証(ベスト エフォートのみ) |
1 | sendCommandtoDevice リクエストが OK を返した場合、at-least-once 配信が保証されます。 |
つまり、QoS 0 の場合、メッセージはデバイスのレスポンスに関係なく、送信後すぐに成功とみなされます。QoS 1 の段階では、デバイスがメッセージ配信に確認応答しています。なお、「at-least-once」配信とは、デバイスがコマンドを複数回受け取る可能性があることを意味します。 Cloud IoT Core は、コマンドの受信回数を追跡しません。
エラー
コマンドのタイムアウト(割り当てと上限で説明されているように 60 秒)に達すると、
DEADLINE_EXCEEDED
が返されます。デバイスが接続されていないか、接続されていても MQTT ワイルドカード トピックに登録されていない場合は、
FAILED_PRECONDITION
が返されます。
ロギング
デバイスに送信されたコマンドとデバイスによる確認応答は Cloud Logging に記録されます。
料金
コマンドは、MQTT を介して送信される他のすべてのメッセージと同様に課金されます。詳細については、料金をご覧ください。