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