mqtt开发总结

本文总结了MQTT开发中遇到的问题,包括同一设备创建多次client、断线重连死循环、关闭客户端导致内存泄漏等。解决方案包括使用MqttCallbackExtended进行自动重连、避免手动重连操作以及在应用退出时不关闭MQTT服务以防止内存泄漏。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

源码解析博客推荐

https://juejin.im/post/5cd66c4af265da037516bec3

1.遇到的问题

1.1同一设备,多次创建mqtt client

在最开始的代码实现中,发现同一个设备有两个client。因为我在client的定义上有增加timestamp作为参数的一部分,而timestamp在获取的时候是根据当前时间动态获取的,这导致我在service多次启动中,创建了多个client。

在mqtt的client中,一个clientID可以创建一个mqtt的连接,如果出现了两个以上,那么说明一定是clientID不同导致的。

1.2断线重连导致陷入死循环

 

最开始设计断线重连的时候,client调用的callback是:mqttcallback,这个回调需要手动处理断线重连状态。

​
//订阅主题的回调【setAutomaticReconnect设置false调用该回调】
    private MqttCallback mqttCallback = new MqttCallback() {
        @Override
        public void connectionLost(Throwable cause) {
            LogUtils.d("mqtt", "mqttCallback>>连接中断");
            //doClientConnect();//再次连接,这种写法会导致异常:不停的断线重连
//            try {
//                Thread.
### MQTT协议开发教程及相关示例代码 #### 1. 连接服务器并初始化 在单片机或其他嵌入式设备中,使用MQTT库连接到MQTT代理(Broker)是第一步。通常需要指定主机地址、端口号以及客户端ID等基本信息。 以下是Python中的Paho-MQTT库的一个基本连接示例: ```python import paho.mqtt.client as mqtt def on_connect(client, userdata, flags, rc): if rc == 0: print("Connected to broker") else: print(f"Connection failed with code {rc}") client = mqtt.Client() client.on_connect = on_connect broker_address = "mqtt.example.com" port = 1883 client.connect(broker_address, port) client.loop_start() # Start the network loop ``` 此部分展示了如何通过`paho-mqtt`库建立与MQTT Broker的连接[^1]。 --- #### 2. 订阅主题 订阅特定主题以便接收消息是一个常见的需求。以下是如何设置回调函数来处理接收到的消息,并订阅某个主题的例子。 ```python def on_message(client, userdata, message): payload = str(message.payload.decode("utf-8")) topic = message.topic print(f"Message received: Topic={topic}, Payload={payload}") client.subscribe("test/topic") # Subscribe to a specific topic client.on_message = on_message # Set callback function for incoming messages ``` 上述代码片段说明了如何定义一个用于处理传入消息的回调函数,并将其绑定至客户端实例上。 --- #### 3. 发布消息 向其他订阅者广播信息也是MQTT的核心功能之一。下面展示了一个简单的发布方法。 ```python message_payload = "Hello from Python!" retained_flag = False qos_level = 0 result = client.publish(topic="test/topic", payload=message_payload, qos=qos_level, retain=retained_flag) if result.rc != mqtt.MQTT_ERR_SUCCESS: print("Failed to send message.") else: print("Message published successfully!") ``` 这里演示了利用`publish()`方法发送一条带有自定义负载的消息的过程。 --- #### 4. 请求响应机制 (下发订阅 vs 上报订阅) 根据实际应用场景的不同,可以选择不同的交互方式。如果不需要传递额外参数,则可以直接采用上报订阅形式;而当存在复杂查询逻辑时,则需借助下发订阅完成双向沟通[^3]。 例如,在人脸识别考勤系统中: - **上报订阅**:员工刷卡后,硬件会主动推送打卡事件至预设好的主题; - **下发订阅**:管理员可通过API接口设定筛选条件并将指令分发出去,随后等待反馈结果返回。 这两种模式均依赖于明确的一对一映射关系——即report/request配对原则。 --- #### 总结 综上所述,MQTT因其简洁高效的设计理念成为众多低功耗场景下的首选解决方案[^2]。无论是基础的功能实现还是高级别的业务流程定制化支持方面都有出色表现。开发者只需掌握几个核心概念即可快速入门并构建属于自己的应用框架。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值