中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Android中怎么利用Kotlin 連接 MQTT

發布時間:2021-06-26 14:51:43 來源:億速云 閱讀:376 作者:Leah 欄目:互聯網科技

Android中怎么利用Kotlin 連接 MQTT,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

新建 Kotlin 項目

打開 Android Studio 新建一個項目,選擇語言為 Kotlin,Android Studio 會自動創建 Kotlin 相關配置。若要配置現有項目,則可以參考 將 Kotlin 添加到現有應用。

添加依賴

打開項目的 build.gradle,添加 Eclipse Paho Java Client 和 Eclipse Paho Android Service 依賴到 dependencies 部分。

dependencies {
    implementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.2.4'
    implementation 'org.eclipse.paho:org.eclipse.paho.android.service:1.1.1' 
}

配置 AndroidManifest.xml

Android Service 是 Eclipse 開發的基于 Android 平臺的一個后臺服務,我們需要將它注冊到AndroidManifest.xml 文件,同時,我們需要注冊權限。

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

<application
   ...
   <service android:name="org.eclipse.paho.android.service.MqttService" />
</application>

創建 MQTT 客戶端

private lateinit var mqttClient: MqttAndroidClient
// TAG
companion object {
    const val TAG = "AndroidMqttClient"
}

連接 MQTT 服務器

本文將使用 EMQ X MQTT Cloud 運營和維護的免費公共 MQTT 服務器, EMQ X Cloud 是由 EMQ 推出的安全的 MQTT 物聯網云服務平臺,它提供一站式運維代管、獨有隔離環境的 MQTT 5.0 接入服務。

  • Broker: broker.emqx.io

  • TCP Port: 1883

  • Websocket Port: 8083

fun connect(context: Context) {
        val serverURI = "tcp://broker.emqx.io:1883"
        mqttClient = MqttAndroidClient(context, serverURI, "kotlin_client")
        mqttClient.setCallback(object : MqttCallback {
            override fun messageArrived(topic: String?, message: MqttMessage?) {
                Log.d(TAG, "Receive message: ${message.toString()} from topic: $topic")
            }

            override fun connectionLost(cause: Throwable?) {
                Log.d(TAG, "Connection lost ${cause.toString()}")
            }

            override fun deliveryComplete(token: IMqttDeliveryToken?) {

            }
        })
        val options = MqttConnectOptions()
        try {
            mqttClient.connect(options, null, object : IMqttActionListener {
                override fun onSuccess(asyncActionToken: IMqttToken?) {
                    Log.d(TAG, "Connection success")
                }

                override fun onFailure(asyncActionToken: IMqttToken?, exception: Throwable?) {
                    Log.d(TAG, "Connection failure")
                }
            })
        } catch (e: MqttException) {
            e.printStackTrace()
        }

    }

其中,MqttCallback 接口包含 3 個方法:

  1. messageArrived:收到 broker 新消息

  2. connectionLost:與 broker 連接丟失

  3. deliveryComplete:消息到 broker 傳遞完成

MqttConnectOptions 用于配置連接設置,包含用戶名密碼,超時配置等,具體可以查看其方法。

創建 MQTT 訂閱

訂閱 topic

fun subscribe(topic: String, qos: Int = 1) {
        try {
            mqttClient.subscribe(topic, qos, null, object : IMqttActionListener {
                override fun onSuccess(asyncActionToken: IMqttToken?) {
                    Log.d(TAG, "Subscribed to $topic")
                }

                override fun onFailure(asyncActionToken: IMqttToken?, exception: Throwable?) {
                    Log.d(TAG, "Failed to subscribe $topic")
                }
            })
        } catch (e: MqttException) {
            e.printStackTrace()
        }
    }

取消訂閱

取消訂閱 topic

fun unsubscribe(topic: String) {
        try {
            mqttClient.unsubscribe(topic, null, object : IMqttActionListener {
                override fun onSuccess(asyncActionToken: IMqttToken?) {
                    Log.d(TAG, "Unsubscribed to $topic")
                }

                override fun onFailure(asyncActionToken: IMqttToken?, exception: Throwable?) {
                    Log.d(TAG, "Failed to unsubscribe $topic")
                }
            })
        } catch (e: MqttException) {
            e.printStackTrace()
        }
    }

發布消息

fun publish(topic: String, msg: String, qos: Int = 1, retained: Boolean = false) {
        try {
            val message = MqttMessage()
            message.payload = msg.toByteArray()
            message.qos = qos
            message.isRetained = retained
            mqttClient.publish(topic, message, null, object : IMqttActionListener {
                override fun onSuccess(asyncActionToken: IMqttToken?) {
                    Log.d(TAG, "$msg published to $topic")
                }

                override fun onFailure(asyncActionToken: IMqttToken?, exception: Throwable?) {
                    Log.d(TAG, "Failed to publish $msg to $topic")
                }
            })
        } catch (e: MqttException) {
            e.printStackTrace()
        }
    }

斷開 MQTT 連接

fun disconnect() {
        try {
            mqttClient.disconnect(null, object : IMqttActionListener {
                override fun onSuccess(asyncActionToken: IMqttToken?) {
                    Log.d(TAG, "Disconnected")
                }

                override fun onFailure(asyncActionToken: IMqttToken?, exception: Throwable?) {
                    Log.d(TAG, "Failed to disconnect")
                }
            })
        } catch (e: MqttException) {
            e.printStackTrace()
        }
    }

測試

首先將 Android 客戶端連接到 MQTT 服務器,然后訂閱 topic: a/b,可以看到連接成功和成功訂閱的日志

Android中怎么利用Kotlin 連接 MQTT

然后我們使用 MQTT 5.0 客戶端工具 - MQTT X 進行測試,發布消息到 topic: a/b,客戶端可以看到收到消息的日志

Android中怎么利用Kotlin 連接 MQTT

Android中怎么利用Kotlin 連接 MQTT

我們在客戶端發布消息到 topic: a/b ,因為我們訂閱了該 topic,同時也會收到消息,最后我們斷開客戶端與 MQTT 服務器的連接,日志如下:

Android中怎么利用Kotlin 連接 MQTT

關于Android中怎么利用Kotlin 連接 MQTT問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

三穗县| 江门市| 普定县| 富蕴县| 西城区| 台中市| 石景山区| 资中县| 古蔺县| 金华市| 枣强县| 大化| 广昌县| 黄陵县| 南丰县| 浪卡子县| 宁阳县| 腾冲县| 大城县| 鄂伦春自治旗| 丰原市| 肃宁县| 镶黄旗| 天长市| 武宁县| 北海市| 林州市| 界首市| 射阳县| 灵寿县| 蒲城县| 纳雍县| 孝昌县| 桐乡市| 陈巴尔虎旗| 沁阳市| 东丰县| 博野县| 遂溪县| 海盐县| 四川省|