千家信息网

Android中怎么利用Kotlin 连接 MQTT

发表于:2024-10-19 作者:千家信息网编辑
千家信息网最后更新 2024年10月19日,Android中怎么利用Kotlin 连接 MQTT,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。新建 Kotlin 项目打开 An
千家信息网最后更新 2024年10月19日Android中怎么利用Kotlin 连接 MQTT

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 文件,同时,我们需要注册权限。

创建 MQTT 客户端

private lateinit var mqttClient: MqttAndroidClient// TAGcompanion 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,可以看到连接成功和成功订阅的日志

然后我们使用 MQTT 5.0 客户端工具 - MQTT X 进行测试,发布消息到 topic: a/b,客户端可以看到收到消息的日志

我们在客户端发布消息到 topic: a/b ,因为我们订阅了该 topic,同时也会收到消息,最后我们断开客户端与 MQTT 服务器的连接,日志如下:

关于Android中怎么利用Kotlin 连接 MQTT问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注行业资讯频道了解更多相关知识。

0