概要
IoT Platform は、複数のデバイスに同時にメッセージをブロードキャストできます。デバイスは、以下の方法を使用してメッセージを処理できます。IoT Platform は、単一デバイスブロードキャストと複数デバイスブロードキャストをサポートしています。2 つの方法の Topic 形式は異なります。デバイスは、サポートされている方法に基づいて応答を返す必要があります。
複数デバイスブロードキャスト
複数デバイスブロードキャストは、システムメッセージを複数のデバイスにブロードキャストするために使用されます。デバイスは、これらのメッセージをサブスクライブせずに受信できます。Topic 形式は /sys/${pk}/${dn}/broadcast/request/+ です。
スケジュール済みブロードキャスト
スケジュール済みブロードキャストは、指定されたデバイスにメッセージをブロードキャストするために使用されます。デバイスは、対応する Topic をサブスクライブした後にのみ、これらのメッセージを受信できます。Topic 形式は /broadcast/${pk}/${custom action} です。
メッセージの受信
この機能を使用する前に、Android 用 Link SDK を初期化し、ダウンストリームデータリスナーを登録する必要があります。スケジュール済みブロードキャストでは、デバイスが Topic をサブスクライブする必要があります。Topic は IoT Platform によって定義され、/broadcast/${pk}/${custom action} 形式です。カスタムアクションは、形式に準拠する任意の値にすることができます。デバイスは、IoT Platform によって提供された定義に基づいて Topic をサブスクライブします。
// ダウンストリームデータリスナーを登録します。
LinkKit.getInstance().registerOnPushListener(notifyListener);
/**
* ダウンストリームデータリスナー。IoT Platform からのすべての Message Queuing Telemetry Transport(MQTT)データは、このリスナーでコールバックされます。
*/
private static IConnectNotifyListener notifyListener = new IConnectNotifyListener() {
/**
* shouldHandle が Topic を処理しないと指定していない場合、onNotify リスナーがトリガーされます。
* @param connectId 接続タイプ。このパラメーターは、接続が持続的接続かどうかを確認するために使用されます。 connectId == ConnectSDK.getInstance().getPersistentConnectId()
* @param topic ダウンストリーム Topic。IoT Platform から送信されたデータをホストします。
* @param aMessage ダウンストリームデータの内容。
*/
@Override
public void onNotify(String connectId, String topic, AMessage aMessage) {
String data = new String((byte[]) aMessage.data);
// IoT Platform から返されるデータの例: data = {"method":"thing.service.test_service","id":"123374967","params":{"vv":60},"version":"1.0.0"}
ALog.d(TAG, "onNotify() called with: connectId = [" + connectId + "], topic = [" + topic + "], aMessage = [" + data + "]");
if (ConnectSDK.getInstance().getPersistentConnectId().equals(connectId) && ! TextUtils.isEmpty(topic) &&
topic.startsWith("/sys/" + DemoApplication.productKey + "/" + DemoApplication.deviceName + "/broadcast/request/")) {
/**
* Topic 形式は /sys/${pk}/${dn}/broadcast/request/+ です。
* IoT Platform は、デフォルトではサブスクリプションまたは確認応答(ACK)メッセージを必要としません。ただし、IoT Platform とデバイスから ACK メッセージをスケジュールすることもできます。
* 例: /sys/a14NQ5RLiZA/android_lp_test1/broadcast/request/1229336863924294656
* 注: IoT Platform などのトリガー側からのデータは、Base64 エンコードする必要があります。そうしないと、デバイスで文字化けが発生する可能性があります。
* 例: IoT Platform: org.apache.commons.codec.binary.Base64.encodeBase64String("broadcastContent".getBytes())
*/
//
ToastUtils.showToast("複数のデバイスにブロードキャストされたメッセージが IoT Platform から受信されました: topic=" + topic + ",data=" + data);
// TODO: 複数デバイスブロードキャストに基づいて処理ロジックを定義します。
} else if (ConnectSDK.getInstance().getPersistentConnectId().equals(connectId) && ! TextUtils.isEmpty(topic) &&
topic.startsWith("/broadcast/" + DemoApplication.productKey )) {
//
/**
* この Topic のメッセージを受信するには、Topic をサブスクライブする必要があります。Topic 形式は /broadcast/${pk}/${custom action} で、IoT Platform から送信された Topic と同じである必要があります。
* 例: /broadcast/a14NQ5RLiZA/oldBroadcast
* 注: IoT Platform などのトリガー側からのデータは、Base64 エンコードする必要があります。そうしないと、デバイスで文字化けが発生する可能性があります。
* 例: IoT Platform: org.apache.commons.codec.binary.Base64.encodeBase64String("broadcastContent".getBytes())
*/
ToastUtils.showToast("IoT Platform からのブロードキャストメッセージが受信されました: topic=" + topic + ",data=" + data);
// TODO: 受信したブロードキャストメッセージに基づいて処理ロジックを定義します。
} else {
ToastUtils.showToast("IoT Platform からのブロードキャストメッセージが受信されました: topic=" + topic + ",data=" + data);
/**
* TODO
* サブスクライブしている Topic に基づいて処理します。
*/
}
}