||
2021-03-04T15:55:35 - ERROR - mqtt - Unexpected disconnection from 127.0.0.1:1883 2021-03-04T15:55:35 - INFO - mqtt - Reconnecting to 127.0.0.1:1883 ... 2021-03-04T15:55:35 - ERROR - mqtt - Unexpected disconnection from 127.0.0.1:1883 2021-03-04T15:55:35 - INFO - mqtt - Reconnecting to 127.0.0.1:1883 ... 2021-03-04T15:55:35 - ERROR - mqtt - Unexpected disconnection from 127.0.0.1:1883 2021-03-04T15:55:35 - INFO - mqtt - Reconnecting to 127.0.0.1:1883 ... 2021-03-04T15:55:35 - INFO - job - Starting job "getGGA" for port "com" ... 2021-03-04T15:55:35 - ERROR - mqtt - Publishing message failed: no connection
调式发现,is_connected=False
rc(Return code)=1
rc
的值决定了连接成功或者不成功:
如截图发现默认写的是MQTTv311
https://zhuanlan.zhihu.com/p/79469070
Return code连接状态
0、连接已经建立
1、连接被拒绝,不允许的协议版本
2、连接被拒绝,Client Identifier被拒绝
3、连接被拒绝,服务器不可用
4、连接被拒绝,错误的用户名或密码
5、连接被拒绝,未授权
Return code=2 代表的是 Client Identifier 格式不规范,比如长度超过 23 个字符,包含了不允许的字符等(部分 Broker 的实现在协议标准上做了扩展,比如允许超过 23 个字符的 Client Identifer 等)
Return code=4在MQTT协议中的含义是Username和Password的格式不正确,但是在大部分的Broker实现中,使用错误的用户名和密码时返回的也是4,所以可以认为4表示就是错误的用户名或者密码;
Return code=5一般表示Broker不使用用户名和密码验证而是采用IP地址或者Client Identifier进行认证的时候使用,来标识Client没有通过验证。
Client发送CONNECT数据包给Broker
Broker在收到CONNECT数据包之后,给Client返回一个CONNACK数据包
在CONNECT数据包可变头中,包含以下信息:
协议名称(Protocol Name):值固定为字符 “MQTT”。
协议版本(Protocol Level):对 MQTT 3.1.1 来说,该值为 4。
用户名标识(User Name Flag):消息体中是否有用户名字段,1bit,0 或者 1。
密码标识(Password Flag):消息体中是否有密码字段,1bit,0 或者 1。
遗愿消息Retain标识(Will Retain):标识遗愿消息是否是 Retain 消息,1bit,0 或者 1。
遗愿消息 QOS 标识(Will QOS):标识遗愿消息的 QOS,2bit,0、1 或者 2。
遗愿标识(Will Flag):标识是否使用遗愿消息,1bit,0 或者 1。
会话清除标识(Clean Session):标识Client是否建立一个持久化的会话,1bit,0或者1。当该标识设为0时,代表Client希望建立一个持久会话的连接,Broker将存储该Client订阅的主题和未接受的消息,否则Broker不会存储这些数据,同时在建立连接时清楚这个Client之前存在的持久化会话所保存的数据。
连接保活(Keep Alive):设置一个以秒为单位的时间间隔,Client和Broker之间在这个时间间隔之内需要至少一次消息交互,否则Client和Broker会认为它们之间的连接已经断开。
publish()
从客户端发送消息给代理。
消息将会发送给代理,并随后从代理发送到订阅匹配主题的任何客户端。
MQTT_ERR_NO_CONN 客户端当前未连接
还是Client没有和Broker连接上造成的消息发送失败造成的;
继续深挖rc=1的原因!
core/module.py一直无法实现is_connected一直无法无True
也即:无法调用进入core/intercom.py中的_on_connect()函数里面!
测试了两天代码,终于调试出问题了!
原来是hbmqtt的broker服务有问题,所以client才不能连接订阅。
更换成EMQ以后,正常运行了!
https://blog.csdn.net/qingzhuyuxian/article/details/106145631
说明一下,我是在Windows下面使用的,之前在Ubuntu下面测试可以正常运行。
不知道是不是hbmqtt不能在Windows下面使用,具体原因还要再分析一下!
用过emqx感觉真的很不错,为国产软件点赞!
EMQ - 杭州映云科技有限公司是面向 5G 和物联网市场的消息与流处理开源软件公司。
2013年,EMQ 作为一个开源项目在 Github上发布,目前已成为全球市场广泛应用的开源 MQTT 消息服务器。
2017年,在客户需求快速增长的驱动下,我们创立公司并推出 EMQ X 企业版,以加快开源项目的产品化部署应用,并为大型企业客户提供专业技术支持与服务。
EMQ 创始团队主要来自华为、IBM、亚马逊和苹果,拥有多年的工作经验和对行业的深刻理解,并对开源软件产业的未来抱有坚定的信念。
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2025-1-16 00:19
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社