Friday, June 9, 2023

AndroidでAWS SDKを使ってMQTT通信の実装

Android用AWS SDKを使用してIoTデバイスと通信する

Android用のAWS SDKでは、MQTTプロトコルを通じてIoTデバイスと通信することができます。MQTTは、パブリッシュ/サブスクライブモデルに基づく軽量なプロトコルであり、SDKではAWSIotMqttManagerクラスを介して実装されています。

トピックへのサブスクライブ

subscribeToTopic()メソッドは特定のトピックにサブスクライブし、公開されたメッセージのコールバックを登録するために使用できます。以下のKotlinコードはこのプロセスを示しています:


val topic = "your/topic"
val qos = 0

awsIotMqttManager.subscribeToTopic(topic, qos) { topic, message ->
    // メッセージが受信された時に処理します
    val msg = String(message.payload, Charset.forName("UTF-8"))
    Log.d("MQTT message received", ": $topic, Message: $msg")
}

エラーハンドリング:コールバックメソッドから切断する

サブスクリプションとコールバックが正常に機能していても、特定の理由から接続を閉じる必要がある場合があります。コールバック内からAWSIotMqttManagerのdisconnect()メソッドを呼び出すと次のエラーが発生します:

"コールバックメソッドから切断することは許可されていません (32107)"

Kotlin Coroutines on AndroidでCallback Issues解決する

この問題を解決するためには、Android上でKotlin のCoroutine 機能を利用します。Coroutines は非同期タスクを容易に実行し、マルチスレッディングを容易に扱う機能です。

Your Project内でCoroutines ライブラリ含める

callback issues を解決するためCoroutines を使用したい場合、まず kotlinx.coroutines ライブラリをプロジェクトに含めます。

CoroutineScope Object を使用して安全に接続を閉じる

callback内で CoroutineScope オブジェクトを作成し、それ内で AWSIotMqttManager 上のdisconnect() を呼び出します。これにより、callbackメソッド内から安全に接続を閉じてエラーを回避することが可能です。


// Subscribe to a topic and register a callback using subscribeToTopic()
val topic = "your/topic"
val qos = 0

awsIotMqttManager.subscribeToTopic(topic, qos) { topic, message ->
    // メッセージが受信された時に処理します
    val msg = String(message.payload, Charset.forName("UTF-8"))
    Log.d("MQTT message received", "Topic: $topic, Message: $msg")

    // 接続を閉じる処理(例えば、特定のメッセージが受信されたとき)
    CoroutineScope(Dispatchers.Default).launch {
        awsIotMqttManager.disconnect()
    }
}

結論

このようにコードを設定することで、コールバックメソッドから正常に接続を閉じることができます。これにより、「コールバックメソッドから切断することは許可されていません(32107)」のエラーが発生するのを防ぐことができます。


0 개의 댓글:

Post a Comment