Link SDK for Java は、Message Queuing Telemetry Transport(MQTT)Topic を使用して IoT Platform と通信するために呼び出すことができる基本的な API 操作を提供します。このトピックでは、API 操作を呼び出して、MQTT Topic にメッセージをパブリッシュする方法、MQTT Topic をサブスクライブする方法、および MQTT Topic のサブスクリプションを解除する方法について説明します。
コードの詳細については、デモ パッケージの MqttSample.java ファイルをご参照ください。
メッセージをパブリッシュする
メッセージをパブリッシュする方法については、MqttPublishRequest をご参照ください。
応答を返さない
デバイスが IoT Platform にメッセージを送信し、IoT Platform が応答しない場合、または IoT Platform が応答してもデバイスが応答を処理する必要がない場合は、次のサンプル コードを使用します。
// メッセージをパブリッシュします。 MqttPublishRequest request = new MqttPublishRequest(); // 応答が必要かどうかを指定します。 request.isRPC = false; // デバイスが IoT Platform にメッセージを送信するときに使用する Topic を指定します。 request.topic = "/a18wP******/LightSwitch/user/update"; // サービス品質(QoS)レベルを指定します。 request.qos = 0; String data = "hello world"; // デバイスがパブリッシュするメッセージに含めるデータを指定します。 request.payloadObj = data; LinkKit.getInstance().publish(request, new IConnectSendListener() { @Override public void onResponse(ARequest aRequest, AResponse aResponse) { // メッセージは、オペレーティングシステムの送信バッファに送信されます。 // ネットワークの状態が悪い場合、IoT Platform はメッセージを受信できない可能性があります。 // アップストリーム メッセージのダウンストリーム応答を受信した場合は、アップストリーム メッセージが IoT Platform によって受信されたかどうかを確認することをお勧めします。 } @Override public void onFailure(ARequest aRequest, AError aError) { // メッセージのパブリッシュに失敗しました。 } });パラメーター
例
説明
isRPC
false
メッセージがリモート プロシージャ コール(RPC)リクエストかどうかを指定します。メッセージが RPC リクエストの場合、replyTopic パラメーターで指定された Topic からメッセージを受信した後にのみ応答が返されます。
デフォルト値:false。メッセージは応答を必要としません。
topic
/a18wP******/LightSwitch/user/update
パブリッシュ権限を持つ Topic。デバイスはこの Topic を使用して IoT Platform にメッセージを送信します。
qos
0
MQTT リクエストの QoS レベル。デフォルト値:0。
payloadObj
{"id":"160865432","method":"thing.event.property.post","params":{"LightSwitch":1},"version":"1.0"}
デバイスがパブリッシュするデータ。データは任意の形式にすることができます。データが JSON 文字列の場合、
idフィールドの値は一意である必要があります。ID は自動増分値として指定する必要があります。この例では、メッセージのidフィールドの値が 160865432 の場合、次のメッセージのidフィールドの値は 160865433 になります。応答を返す
デバイスのアップストリーム メッセージをビジネス サーバーに転送し、ビジネス サーバーからデバイスにダウンストリーム メッセージを送信する場合に、次のサンプル コードを使用します。
また、データ形式が Alink プロトコルに準拠し、プロトコルで IoT Platform が応答を返す必要があると指定されている Topic を使用する場合は、次のサンプル コードを使用します。
// メッセージをパブリッシュします。 MqttPublishRequest request = new MqttPublishRequest(); // 応答が必要かどうかを指定します。このパラメーターを true に設定すると、IoT Platform からの応答が必要になります。 request.isRPC = true; // QoS レベルを指定します。 request.qos = 0; // デバイスが IoT Platform にメッセージを送信するときに使用できる Topic を指定します。 request.topic = "/a18wP******/LightSwitch/user/update"; // IoT Platform が応答を返すときに使用できる Topic を指定します。このパラメーターを設定しない場合は、「topic_reply」が使用されます。 request.replyTopic = "/a18wP******/LightSwitch/user/update_reply"; String data = "hello world"; // デバイスがパブリッシュするメッセージに含めるデータを指定します。 request.payloadObj = data; LinkKit.getInstance().publish(request, new IConnectSendListener() { @Override public void onResponse(ARequest aRequest, AResponse aResponse) { // メッセージがパブリッシュされました。 } @Override public void onFailure(ARequest aRequest, AError aError) { // メッセージのパブリッシュに失敗しました。 } });パラメーター
例
説明
isRPC
true
メッセージが RPC リクエストかどうかを指定します。メッセージが RPC リクエストの場合、replyTopic パラメーターで指定された Topic からメッセージを受信した後にのみ応答が返されます。
このパラメーターを true に設定すると、IoT Platform からの応答が必要になります。
qos
0
MQTT リクエストの QoS 値。デフォルト値:0。
topic
/a18wP******/LightSwitch/user/update
パブリッシュ権限を持つ Topic。デバイスはこの Topic を使用して IoT Platform にメッセージを送信します。
replyTopic
/a18wP******/LightSwitch/user/update_reply
IoT Platform が応答を返すときに使用できる Topic。このパラメーターを設定しない場合は、「topic_reply」が使用されます。
payloadObj
{"id":"160865432","method":"thing.event.property.post","params":{"LightSwitch":1},"version":"1.0"}
デバイスがパブリッシュするデータ。データは JSON 文字列である必要があり、
idフィールドの値は一意である必要があります。ID は自動増分値として指定する必要があります。この例では、メッセージのidフィールドの値が 160865432 の場合、次のメッセージのidフィールドの値は 160865433 になります。
メッセージをサブスクライブする
デバイスは、特定の Topic からのメッセージをサブスクライブできます。サブスクリプションは IoT Platform に保存されます。IoT Platform は、特定の Topic によってパブリッシュされたメッセージを受信すると、そのメッセージをデバイスに転送します。詳細については、MqttSubscribeRequest をご参照ください。
デバイスが Topic のメッセージをサブスクライブした後、関連するダウンストリーム メッセージは、「接続ステータスとダウンストリーム メッセージ リスナー」セクション(デバイスの検証と接続 トピック内)で説明されている IConnectNotifyListener 関数によって返されます。
サンプル コード:
// メッセージをサブスクライブします。
MqttSubscribeRequest subscribeRequest = new MqttSubscribeRequest();
// subTopic をサブスクライブする Topic に置き換えます。
subscribeRequest.topic = subTopic;
subscribeRequest.isSubscribe = true;
LinkKit.getInstance().subscribe(subscribeRequest, new IConnectSubscribeListener() {
@Override
public void onSuccess() {
// サブスクリプションは成功しました。
}
@Override
public void onFailure(AError aError) {
// サブスクリプションに失敗しました。
}
}); デバイスが指定された Topic をサブスクライブする必要がなくなった場合は、Topic のサブスクリプションを解除する必要があります。Topic のサブスクリプションを解除しないと、サブスクリプションは持続し、デバイスはサブスクライブされた Topic からメッセージを受信し続けます。詳細については、このトピックの「Topic のサブスクリプションを解除する」セクションをご参照ください。
Topic のサブスクリプションを解除する
// Topic のサブスクリプションを解除します。
MqttSubscribeRequest unsubRequest = new MqttSubscribeRequest();
// unSubTopic をサブスクリプションを解除する Topic に置き換えます。
unsubRequest.topic = unSubTopic;
unsubRequest.isSubscribe = false;
LinkKit.getInstance().unsubscribe(unsubRequest, new IConnectUnscribeListener() {
@Override
public void onSuccess() {
// Topic のサブスクリプション解除は成功しました。
}
@Override
public void onFailure(AError aError) {
// Topic のサブスクリプション解除に失敗しました。
}
});