IoT Platform はブロードキャスト通信をサポートしており、指定したプロダクトのすべてのデバイス、または特定の Topic をサブスクライブしているすべてのデバイスにメッセージを送信できます。ビジネスサーバーからのブロードキャストメッセージは、オンラインのデバイスのみが受信します。このトピックでは、すべてのオンラインデバイスにメッセージをブロードキャストする方法の例を示します。
背景情報
- プロダクトのすべてのオンラインデバイスにメッセージをブロードキャストする
お客様のビジネスサーバーは、PubBroadcast API オペレーションを呼び出し、対象のプロダクトの ProductKey と [MessageContent] を渡します。 プロダクトのすべてのオンラインデバイスは、ブロードキャスト Topic
/sys/${productKey}/${deviceName}/broadcast/request/${MessageId}で [MessageContent] を受信します。ブロードキャスト Topic の
MessageIdは、IoT Platform によって生成される ID です。メッセージが正常に送信されると、IoT Platform は PubBroadcast 呼び出しからの応答の一部として、この ID をビジネスサーバーに返します。たとえば、IoT Platform に接続された複数のスマートロックを持つメーカーは、ビジネスサーバーを使用して単一のコマンドをすべてのオンラインのロックに送信し、特定のパスワードを無効化できます。
- 特定の Topic をサブスクライブしているすべてのデバイスにメッセージをブロードキャストする
デバイスは同じブロードキャスト Topic をサブスクライブします。ビジネスサーバーは PubBroadcast API オペレーションを呼び出し、ProductKey、MessageContent、およびブロードキャスト Topic の完全な名前を渡します。Topic 名は
/broadcast/${productKey}/custom-fieldのフォーマットである必要があります。この Topic をサブスクライブしているすべてのオンラインデバイスが MessageContent を受信します。重要- ブロードキャスト Topic は、開発中にデバイス側のコードで定義されます。IoT Platform コンソールで作成する必要はありません。
- 1 つのブロードキャスト Topic にサブスクライブできるデバイスは最大 1,000 台です。デバイス数がそれより多い場合は、グループにセグメント化する必要があります。たとえば、5,000 台のデバイスにブロードキャストするには、デバイスを 1,000 台ずつの 5 つのグループに分割します。その後、
PubBroadcastオペレーションを 5 回呼び出し、カスタムフィールドをそれぞれgroup1、group2、group3、group4、group5に設定する必要があります。各グループのデバイスは、対応する Topic をサブスクライブする必要があります。
ブロードキャスト API オペレーションの詳細については、「PubBroadcast」をご参照ください。
制限事項
- ブロードキャストメッセージは、プロダクト内のオンラインデバイスにのみ送信されます。
- Topic サブスクリプションによって特定のオンラインデバイスにメッセージをブロードキャストする場合、ブロードキャスト API の最大呼び出し頻度は 1 秒あたり 1 回です。
- プロダクトのすべてのオンラインデバイスにメッセージをブロードキャストする場合、デバイスはブロードキャスト Topic をサブスクライブする必要はありません。ブロードキャスト API の最大呼び出し頻度は 1 分あたり 1 回です。
- ブロードキャストメッセージ本文の最大サイズは 64 KB です。
開発環境の準備
この例では、デバイスとサーバーの両方に Java SDK を使用します。Java 開発環境を準備する必要があります。Java の公式サイトから Java 開発キット (JDK) をダウンロードしてインストールしてください。
Maven 依存関係の追加
プロジェクトを作成し、次の Maven 依存関係を pom.xml ファイルに追加します。
<dependencies>
<dependency>
<groupId>com.aliyun.alink.linksdk</groupId>
<artifactId>iot-linkkit-java</artifactId>
<version>1.2.0.1</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.5.6</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-iot</artifactId>
<version>7.41.0</version>
</dependency>
<dependency>
<groupId>com.aliyun.openservices</groupId>
<artifactId>iot-client-message</artifactId>
<version>1.1.2</version>
</dependency>
</dependencies>
プロダクトとデバイスの作成
- IoT Platform コンソールにログインします。
[概要] ページで、管理したいインスタンスを見つけ、インスタンス ID またはインスタンス名をクリックします。
- 左側のナビゲーションウィンドウで、 を選択します。
- [プロダクトを作成] をクリックして、スマートロック プロダクトを作成します。詳細については、「プロダクトの作成」をご参照ください。
- 左側のナビゲーションウィンドウで、 を選択し、スマートロック プロダクト用に 3 つのデバイスを作成します。詳細については、「一度に複数のデバイスを作成する」をご参照ください。
デバイス SDK の設定
- デバイスを IoT Platform に接続します。
- デバイス認証情報を設定します。
final String productKey = "<yourProductKey>"; final String deviceName = "<yourDeviceName>"; final String deviceSecret = "<yourDeviceSecret>"; final String region = "<yourRegionID>";productKey、deviceName、および deviceSecret はデバイス認証情報です。これらを取得するには、IoT Platform コンソールに移動し、ご利用のインスタンスに移動して、 を選択します。デバイスを見つけて [表示] をクリックし、[デバイス詳細] ページに移動します。
region パラメーターは、デバイスのリージョンを指定します。region の指定方法については、「リージョンとゾーン」をご参照ください。
- MQTT 設定、デバイス情報、初期デバイスステータスなどの初期化パラメーターを設定します。
LinkKitInitParams params = new LinkKitInitParams(); // LinkKit は基盤となるプロトコルとして MQTT を使用します。MQTT 設定を構成します。 IoTMqttClientConfig config = new IoTMqttClientConfig(); config.productKey = productKey; config.deviceName = deviceName; config.deviceSecret = deviceSecret; config.channelHost = productKey + ".iot-as-mqtt." + region + ".aliyuncs.com:1883"; // デバイス情報を指定します。 DeviceInfo deviceInfo = new DeviceInfo(); deviceInfo.productKey = productKey; deviceInfo.deviceName = deviceName; deviceInfo.deviceSecret = deviceSecret; // デバイスの初期ステータスを指定します。 Map<String, ValueWrapper> propertyValues = new HashMap<String, ValueWrapper>(); params.mqttClientConfig = config; params.deviceInfo = deviceInfo; params.propertyValues = propertyValues;channelHost は MQTT エンドポイントです。パブリックインスタンスおよび Enterprise Edition インスタンスのエンドポイントを取得するには、「インスタンスのエンドポイントの表示と設定」をご参照ください。
- 接続を初期化します。
// 接続を確立し、接続結果のリスナーを設定します。 LinkKit.getInstance().init(params, new ILinkKitConnectListener() { @Override public void onError(AError aError) { System.out.println("Init error:" + aError); } // 初期化完了後に呼び出されるコールバック。 @Override public void onInitDone(InitResult initResult) { System.out.println("Init done:" + initResult); } });
- デバイス認証情報を設定します。
- onInitDone コールバック関数で、Topic プレフィックスを使用してブロードキャスト Topic を識別します。ブロードキャスト Topic のプレフィックスは
/sys/${productKey}/${deviceName}/broadcast/request/です。public void onInitDone(InitResult initResult) { // ダウンストリームメッセージをリッスンするリスナーを設定します。 IConnectNotifyListener notifyListener = new IConnectNotifyListener() { // ダウンストリームメッセージを処理するために呼び出されるコールバックを定義します。 @Override public void onNotify(String connectId, String topic, AMessage aMessage) { // ブロードキャストメッセージをフィルタリングします。 if(topic.startsWith(broadcastTopic)){ System.out.println( "received broadcast message from topic=" + topic + ",\npayload=" + new String((byte[])aMessage.getData())); } } @Override public boolean shouldHandle(String s, String s1) { return false; } @Override public void onConnectStateChange(String s, ConnectState connectState) { } }; LinkKit.getInstance().registerOnNotifyListener(notifyListener); }
サーバー側 SDK の設定
ブロードキャストメッセージを送信するようにサーバー側の Java SDK を設定します。
- 認証情報を設定します。
String regionId = "<yourRegionID>"; String accessKey = "<yourAccessKey>"; String accessSecret = "<yourAccessSecret>"; final String productKey = "<yourProductKey>"; - サーバーが PubBroadcast API オペレーションを呼び出してメッセージをブロードキャストするように設定します。
// クライアントパラメーターを設定します。 DefaultProfile profile = DefaultProfile.getProfile(regionId, accessKey, accessSecret); IAcsClient client = new DefaultAcsClient(profile); PubBroadcastRequest request = new PubBroadcastRequest(); // ブロードキャストメッセージの ProductKey を設定します。 request.setProductKey(productKey); // メッセージ本文を設定します。文字化けを防ぐために、本文は Base64 エンコードする必要があります。 request.setMessageContent(Base64.encode("{\"pwd\":\"2892nd6Y\"}")); // インスタンス ID を設定します。 request.setIotInstanceId("iot-cn-***"); - サーバーからブロードキャストメッセージを送信します。
try { PubBroadcastResponse response = client.getAcsResponse(request); System.out.println("broadcast pub success: broadcastId =" + response.getMessageId()); } catch (Exception e) { System.out.println(e); }
結果の検証
各デバイスでデバイス SDK コードを実行して接続します。次に、サーバー側 SDK コードを実行して PubBroadcast API オペレーションを呼び出し、デバイスにメッセージをブロードキャストします。
サーバー側 SDK からブロードキャストされたメッセージ本文は "{\"pwd\":\"2892nd6Y\"}" です。
各デバイスのローカルログには、受信したブロードキャストメッセージが表示されます: {\"pwd\":\"2892nd6Y\"}。
スマートロック 1:
2020-03-05 03:17:37.091 – null[MqttDefaulCallback.java] – messageArrived(74):MqttDefaulCallback:messageArrived,topi
[/sys/a1nTNJt9p39/MjxxxDR/broadcast/request/123546464900384256], msg = [{"pwd":"2892nd6Y"}],
2020-03-05 03:17:37.091 – null[PersistentEventDispatcher.java] – broadcastMessage(150):com.aliyun.alink.linksdk.cha
what=3
received broadcast message from topic=/sys/a1nTNJt9p39/MjxxxDR/broadcast/request/123546464900384256,
payload={"pwd":"2892nd6Y"}
スマートロック 2:
2020-03-05 03:17:37.111 - null[MqttDefaulCallback.java] - messageArrived(74):MqttDefaulCallback:messageArrived,topic
[/sys/a1nTNJt9p39/W96JAyE7UBpxHkiFy2CG/broadcast/request/1235464464900384256] , msg = [{"pwd":"2892nd6Y"}],
2020-03-05 03:17:37.111 - null[PersistentEventDispatcher.java] - broadcastMessage(150):com.aliyun.alink.linksdk.chan
what=3
received broadcast message from topic=/sys/a1nTNJt9p39/W9xxx2CG/broadcast/request/1235464464900384256,
payload={"pwd":"2892nd6Y"}
スマートロック 3:
2020-03-05 03:17:37.167 - null[MqttDefaulCallback.java] - messageArrived(74):MqttDefaultCallback:messageArrived,top
[/sys/a1nTNJt9p39/mBGagyPszmfRbKVzyqvZ/broadcast/request/1235464464900384256] , msg = [{"pwd":"2892nd6Y"}],
2020-03-05 03:17:37.167 - null[PersistentEventDispatcher.java] - broadcastMessage(150):com.aliyun.alink.linksdk.ch
what=3
received broadcast message from topic=/sys/a1nTNJt9p39/mlxxxxxxxxxxxvZ/broadcast/request/1235464464900384256,
payload={"pwd":"2892nd6Y"}
付録:デモ
サーバー側およびデバイス側 SDK の例を含む完全なサンプルコードをダウンロードします。
- すべてのオンラインデバイスにメッセージをブロードキャストする: PubBroadcastDemo のダウンロード。
- 特定の Topic をサブスクライブしているすべてのデバイスにメッセージをブロードキャストする: BroadcastDemo のダウンロード。