陈超
MQTT客户端无法连接成功
2021-3-4 21:58
阅读:12950


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


image.png

调式发现,is_connected=False

rc(Return code)=1

rc的值决定了连接成功或者不成功:

image.png

如截图发现默认写的是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没有通过验证。


preview

  1. Client发送CONNECT数据包给Broker

  2. 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会认为它们之间的连接已经断开。

image.png

image.png

image.png

image.png

publish()

从客户端发送消息给代理。

消息将会发送给代理,并随后从代理发送到订阅匹配主题的任何客户端。


MQTT_ERR_NO_CONN 客户端当前未连接 

还是Client没有和Broker连接上造成的消息发送失败造成的;

继续深挖rc=1的原因!

core/module.py一直无法实现is_connected一直无法无True

也即:无法调用进入core/intercom.py中的_on_connect()函数里面!

image.png

image.png

测试了两天代码,终于调试出问题了!

原来是hbmqtt的broker服务有问题,所以client才不能连接订阅。

更换成EMQ以后,正常运行了!

https://blog.csdn.net/qingzhuyuxian/article/details/106145631

https://www.emqx.cn/

image.png

说明一下,我是在Windows下面使用的,之前在Ubuntu下面测试可以正常运行。

不知道是不是hbmqtt不能在Windows下面使用,具体原因还要再分析一下!

用过emqx感觉真的很不错,为国产软件点赞!

EMQ - 杭州映云科技有限公司是面向 5G 和物联网市场的消息与流处理开源软件公司。

2013年,EMQ 作为一个开源项目在 Github上发布,目前已成为全球市场广泛应用的开源 MQTT 消息服务器。

2017年,在客户需求快速增长的驱动下,我们创立公司并推出 EMQ X 企业版,以加快开源项目的产品化部署应用,并为大型企业客户提供专业技术支持与服务。

EMQ 创始团队主要来自华为、IBM、亚马逊和苹果,拥有多年的工作经验和对行业的深刻理解,并对开源软件产业的未来抱有坚定的信念。


转载本文请联系原作者获取授权,同时请注明本文来自陈超科学网博客。

链接地址:https://wap.sciencenet.cn/blog-858128-1275037.html?mobile=1

收藏

分享到:

当前推荐数:0
推荐到博客首页
网友评论0 条评论
确定删除指定的回复吗?
确定删除本博文吗?