最近比较忙,有些关于EMQ的使用问题,没有时间记录了,趁这个周末抽点时间,将最近遇到的,觉得比较有价值的一个问题,分享给大家吧。

这里是针对前面的一篇博客,做的一个深入研究,关于订阅系统总线判断设备上线还是下线的补充研究。基于报文内容进行分析连接的细分信息,有一定的帮助。

1. 正常的连接

应用服务能够订阅到来自$SYS/brokers/+/clients/+/connected主题的数据。如下:这里能看到设备连接到那个EMQX节点,且知道设备端的配置信息,例如用户名,是否cleansession,clientId等等。这里有一个能反应出设备正常连接的状态字段connack,值为0表示正常连接上了。

Qos : , Topic :$SYS/brokers/emqx@10.95.200.17/clients/res10/connected, ClientId: emqXmonitor
Sub : {"clean_start":true,"clientid":"res10","connack":,"ipaddress":"10.95.177.137","keepalive":,"proto_name":"MQTT","proto_ver":,"ts":,"username":"water"}

当连接断开时(前提是连接正常的连接进来了,即$SYS/brokers/+/clients/+/connected的主题上进来的数据,对应connack的值为0),订阅了$SYS/brokers/+/clients/+/disconnected主题的应用服务,会收到报文如下。这里会发现,报文内容显示了clientId,username以及断开的原因和具体时间点。这里重点要说的是reason字段。下面这个报文显示断开的原因是normal,即正常断开,我这里是基于MQTT.fx模拟的客户端,点击了disconnect按钮实现的。

Qos : , Topic :$SYS/brokers/emqx@10.95.200.17/clients/res10/disconnected, ClientId: emqXmonitor
Sub : {"clientid":"res10","username":"water","reason":"normal","ts":}
Qos : , Topic :$SYS/brokers/emqx@10.95.200.17/clients/res10/connected, ClientId: emqXmonitor
Sub : {"clean_start":true,"clientid":"res10","connack":,"ipaddress":"10.95.177.137","keepalive":,"proto_name":"MQTT","proto_ver":,"ts":,"username":"shihuc"}

下面这个断开,就和上面那个disconnected的报文有点不同,主要是reason的内容不同,这里是closed,标识关闭。说明下,我这里是通过点击MQTT.fx软件右上角的红色X实现的。

Qos : , Topic :$SYS/brokers/emqx@10.95.200.17/clients/res10/disconnected, ClientId: emqXmonitor
Sub : {"clientid":"res10","username":"shihuc","reason":"closed","ts":}

2. 不正常的连接

注意啦,注意啦,这里是connected主题上的报文,显示连接上来了,但是呢,看看connack字段的内容,不是0哟,说明这次连接不是正常的。现象也的确是没有连接上来,因为我的mysql mqtt_user表里面没有abc这个用户,MQTT.fx显示的连接失败的原因是未授权用户。

Qos : , Topic :$SYS/brokers/emqx@10.95.200.17/clients/res11/connected, ClientId: emqXmonitor
Sub : {"clean_start":true,"clientid":"res11","connack":,"ipaddress":"10.95.177.137","keepalive":,"proto_name":"MQTT","proto_ver":,"ts":,"username":"abc"}

下面这个connected消息,和上面的基本一样,下面这个是未授权用户(Not authorized to connect)对应的第二次connected报文。起初,按照我的理解,这里应该是disconnected报文,但是给MQTT官方的github上项目提的issue显示,只有正常连接上线的设备,才会给他下发disconnected消息。否则只有connected消息,通过connack的内容进行细化区分。为何这里会出现两次connected的消息呢?从paho的客户端是可以看得出信息的,首先会从默认的MQTT V4开始

Qos : , Topic :$SYS/brokers/emqx@10.95.200.17/clients/res11/connected, ClientId: emqXmonitor
Sub : {"clean_start":true,"clientid":"res11","connack":,"ipaddress":"10.95.177.137","keepalive":,"proto_name":"MQIsdp","proto_ver":,"ts":,"username":"abc"}

3. 连接的状态的协议说明

这里主要涉及的就是CONNACK这个消息了,参照协议,就不难理解上面报文中的connack的信息了。

我这里用的协议版本是MQTT的V3.1.1, 所以呢,将里面的重点内容摘抄出来,方便查看。一个结论,connack不是0的时候,就要注意是不是有什么问题了

MQTT研究之EMQ:【EMQX使用中的一些问题记录(4)】的更多相关文章

  1. MQTT研究之EMQ:【CoAP协议应用开发】

    本博文的重点是尝试CoAP协议的应用开发,其中包含CoAP协议中一个重要的开源工具libcoap的安装和遇到的问题调研.当然,为了很好的将EMQ的CoAP协议网关用起来,也调研了下EMQ体系下,CoA ...

  2. MQTT研究之EMQ:【EMQ之HTTP认证/访问控制】

    今天进行验证的逻辑是EMQ的http的Auth以及ACL的逻辑. 首先,参照HTTP插件认证配置的说明文档进行基本的配置, 我的配置内容如下: ##-------------------------- ...

  3. MQTT研究之EMQ:【JAVA代码构建X509证书【续集】】

    openssl创建私钥,获取公钥,创建证书都是比较简单的,就几个指令,很快就可以搞定,之所以说简单,是因为证书里面的基本参数配置不需要我们组装,只需要将命令行里面需要的几个参数配置进去即可.但是呢,用 ...

  4. MQTT研究之EMQ:【SSL证书链验证】

    1. 创建证书链(shell脚本) 客户端证书链关系: rootCA-->chainca1-->chainca2-->chainca3 ca caCert1 caCert2 caCe ...

  5. MQTT研究之EMQ:【EMQX使用中的一些问题记录(1)】

    issue 1. EMQX的共享订阅 EMQX是一个非常强大的物联网通信消息总线,基于EMQX开展应用开发,要注意很多配置细节问题,这里要说到的就是共享订阅以及和cleanSession之间的关系问题 ...

  6. MQTT研究之EMQ:【EMQX使用中的一些问题记录(2)】

    我的测试环境: Linux: CentOS7 EMQX:V3.2.3 题外话: 这里主要介绍Websocket的支持问题. 对ws的支持比较正常,但是对wss的支持,调了较长的时间,没有成功. Jav ...

  7. MQTT研究之EMQ:【EMQX使用中的一些问题记录(3)】

    EMQX功能强大,但是帮助信息或者可用资料的确有限,遇到个问题,比较难找到处理的头绪,今天,我要记录的是,使用中出现EMQX宕机,但是呢,启动也启动不了. 今天记录的内容,就以操作EMQX 3.2.3 ...

  8. MQTT研究之EMQ:【JAVA代码构建X509证书】

    这篇帖子,不会过多解释X509证书的基础理论知识,也不会介绍太多SSL/TLS的基本信息,重点介绍如何用java实现SSL协议需要的X509规范的证书. 之前的博文,介绍过用openssl创建证书,并 ...

  9. MQTT研究之EMQ:【基础研究】

    EMQ版本V2, emqttd-centos7-v2.3.11-1.el7.centos.x86_64.rpm 下载地址:http://emqtt.com/downloads/2318/centos7 ...

随机推荐

  1. docker指定固定IP创建容器

    问题描述: docker默认使用的docker0,子网172.17.0.0/16,不支持指定IP启动容器 问题解决: 新增网段bridge指定别的网段即可 01.docker新增network 新建n ...

  2. JVM的底层实现原理

    JVM是Java程序运行的环境,但是他同时也是一个操作系统的一个应用程序的一个进程,因此JVM也有他自己的运行生命周期,也有自己的代码和数据空间. JDK JDK在Java的整个体系中充当一个生产加工 ...

  3. 遗传算法介绍并附上Python代码

    之前介绍过遗传算法,参见:https://www.cnblogs.com/LoganChen/p/7509702.html 我们用Python实现同样的问题解答. y=10*sin(5*x)+7*ab ...

  4. GhostScript命令参数详解(转)

    http://blog.csdn.net/catoop/article/details/42737441 本文列出几个常用参数,然后下面附上官方的参数详解: 一.常用参数解释 这是一个测试的命令:gs ...

  5. Java8新特性(1)—— Stream集合运算流入门学习

    废话,写在前面 好久没写博客了,懒了,以后自觉写写博客,每周两三篇吧! 简单记录自己的学习经历,算是对自己的一点小小的督促! Java8的新特性很多,比如流处理在工作中看到很多的地方都在用,是时候扔掉 ...

  6. 高小兰 201671010414 实验十四 团队项目评审&课程学习总结

    项目 内容 软件工程 https://www.cnblogs.com/nwnu-daizh/ 作业要求 https://www.cnblogs.com/sunmiaokun/p/11095027.ht ...

  7. 地址栏参数获取函数 GetQueryStr(name)

    //name:参数名称,return:有则返回该参数对应值,没有则返回null function GetQueryStr(name) {          var reg = new RegExp(& ...

  8. vue 实战

    vue 实战 Vue命令行工具vue-cli https://www.cnblogs.com/xiaohuochai/p/7277771.html https://github.com/ymblog/ ...

  9. PHP:ThinkCMFX任意文件包含漏洞

    前言:最近爆出来的漏洞,ThinkCmfX版本应该是通杀的,基于3.X Thinkphp开发的 代码下载地址:https://gitee.com/thinkcmf/ThinkCMFX/releases ...

  10. [Algorithm] 350. Intersection of Two Arrays II

    Given two arrays, write a function to compute their intersection. Example 1: Input: nums1 = [1,2,2,1 ...