用阿里的示例代码,连接总是断开,也没办法订阅和接收:
import hmac import base64 from hashlib import sha1 import time from paho.mqtt.client import MQTT_LOG_INFO, MQTT_LOG_NOTICE, MQTT_LOG_WARNING, MQTT_LOG_ERR, MQTT_LOG_DEBUG from paho.mqtt import client as mqtt
client_id='XXXXXX'
topic = 'al001'
brokerUrl='XXXXX.mqtt.aliyuncs.com'
def on_connect(client, userdata, flags, rc): print('Connected with result code ' + str(rc)) client.subscribe(topic, 0) for i in range(1, 11): print(i) rc = client.publish(topic, str(i), qos=0) print ('rc: %s' % rc) time.sleep(0.1) def on_message(client, userdata, msg): print(msg.topic + ' ' + str(msg.payload))
def on_disconnect(client, userdata, rc): if rc != 0: print('Unexpected disconnection %s' % rc)
client = mqtt.Client(client_id, protocol=mqtt.MQTTv311, clean_session=True) client.on_connect = on_connect client.on_message = on_message client.on_disconnect = on_disconnect
userName = "XXX" password = "XXX"
client.connect(brokerUrl, 1883, 60) client.loop_forever()
结果显示: Connected with result code 0 1 rc: (0, 2) 2 rc: (0, 3) 3 rc: (0, 4) 4 rc: (0, 5) 5 rc: (0, 6) 6 rc: (0, 7) 7 rc: (0, 8) 8 rc: (0, 9) 9 rc: (0, 10) 10 rc: (0, 11) Unexpected disconnection 7
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
从你提供的代码和运行结果来看,你的客户端成功连接到了阿里云MQTT服务器,并且能够发布消息到主题al001
上。每个发布的消息都返回了一个(0, n)
的结果码,这里的0
表示MQTT协议层面的消息发送成功,而后面的数字n
是递增的,这通常代表消息的QoS(服务质量)相关的Packet Identifier(报文标识符),在QoS 0的情况下,这个递增并不具有特别的意义,因为QoS 0不保证消息到达,也不需要确认。
然而,之后出现了“Unexpected disconnection 7”的日志,这意味着客户端与服务器的连接意外中断了。根据MQTT规范,错误码7对应的是MQTT_ERR_PROTOCOL
,即协议错误。这可能是因为客户端或服务端在通信过程中出现了不符合MQTT协议的行为。
以下是一些建议来排查和解决这个问题:
检查用户名和密码:确保你使用的userName
和password
是正确的。阿里云物联网平台中设备的用户名通常是产品Key和设备名称的组合,密码则是通过签名算法生成的,需要正确计算。请再次核对这些凭证是否准确无误。
查看网络环境:网络不稳定或者防火墙、安全组设置可能会导致连接中断。确认网络畅通,没有阻止MQTT端口(默认1883)的出站或入站流量。
日志级别调整:增加日志输出的详细程度,比如将client
的log_level
设置为MQTT_LOG_DEBUG
,以便获取更详细的调试信息,这有助于定位问题所在。
协议版本和清理会话:你已经设置了MQTTv311协议版本和clean_session=True
,这是合理的配置,但确保这符合你的应用场景需求。如果希望断开重连后能恢复会话状态,可能需要调整clean_session
为False
并处理相应的会话保持逻辑。
阿里云物联网平台检查:登录阿里云物联网平台,检查设备的状态,是否有在线记录,以及是否有错误日志提示。同时,确认产品的MQTT相关配置(如TLS加密要求)与你的客户端设置相匹配。
异常处理:在on_disconnect
回调中,除了打印错误码,还可以尝试重新连接逻辑,以增强程序的健壮性。
如果以上步骤都无法解决问题,建议直接查阅阿里云物联网平台的帮助文档或联系阿里云技术支持,提供更详细的错误信息进行进一步分析。
涵盖 RocketMQ、Kafka、RabbitMQ、MQTT、轻量消息队列(原MNS) 的消息队列产品体系,全系列产品 Serverless 化。RocketMQ 中文社区:https://rocketmq-learning.com/