开发者学堂课程【嵌入式之 RFID 开发与应用2020版:MQTT-mosquitto 的 ubuntu16.04 安装订阅与发布操作】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/665/detail/11175
MQTT-mosquitto 的 ubuntu16.04 安装订阅与发布操作
内容介绍:
一、MQTT 的发展历程及其广泛应用
二、Mosquitto 的源码的下载
三、安装完 mosquitto 之后,通过测试的方法
四、最简单的订阅命令
五、通信质量为 q1 或 q2,通信过程中的区别
六、订阅的步骤
一、MQTT 的发展历程及其广泛应用
本节课重点学习 MQTT 在实际互联网开发中的应用。首先,对于 MQTT 来说它的应用软件是非常多的,MQTT 出现的时间比较早,九十年代初就已经存在了,经历了这么多年的发展,在最近这几年开始特别火,在物联网得到了更广泛的应用,在这个地方只是列举了一部分能过实现 MQTT 协议的开发软件,接下来要讲 mosquitto 还有 ApacheApollo,那这里面还有一些没有列举到,比如说 Apollo,这些开发软件多可以在网上找到。
总之,本节学习排在第二名的 mosquitto ,mosquitto 是一个质量非常高的开发软件,而且支持最高版本 v3.3.1 的协议,并且它是 c 语言写出来的,提过了一个动态链接库,去做一些二次开发也可以基于源码去做二次开发。包括做一些优化。选择 mosquitto 还有一个非常重要的原因 mosquitto 由 MQTT 协议创始人之一的 Andy Stanford-Clark 参与开发。因为由作者的加持,所以软件不会很差,资料也很丰富。
二、mosquitto 的源码的下载
下载 mosquitto 的源码直接登陆官网:https://mosquitto.org。在这里先不去登录官网去下载源代码,因为 MQTT 的协议当前用的很多,所以说是 ubuntu,官方仓库就会有安装包。如果是 ubuntu环境,首先去执行 sudo apt-add-repository ppa:mosquitto-dev/mosquitto-ppa
命令,也就是在库里添加mosquitto 的安装包并且更新安装库的列表 (sudo apt-get update),然后执行 sudo apt-get install mosquitto
直接执行 mosquitto 就可以。也就是在虚拟器当中去执行就可以 ( 1.6.8 是目前的最新版本)。执行完 sudo apt-get install mosquitoo
之后,只是完成了服务器的下载安装,也就是只能启动一个服务器。但是对客户端来说 sudo apt-get install mosquitoo
是没有的比如说要发布,订阅是没有的。还要下载 sudo apt-get install mosquitto-clients
。安装完之后对安装包提供了一些指令,本身要降低对 MQTT 的使用以及发布和订阅的使用,建议多用命令去操作,后面进行移植之后,也可以根据源码开发。
三、安装完 mosquitto 之后,通过测试的方法
安装完之后第一步如果要完成一个测试,最简单的就是首先要执行 mosquitto -c /etc/mosquitto/mosquitto.conf -p 1883
指令。后面的端口号“1883”加与不加都可以。通过 mosquitto -c /etc/mosquitto/mosquitto.conf
指令去启动服务器。也就是 mosquitto 就是服务器,然后输入 which mosquitto 去执行 mosquitto -c 这时就不用输入“/”因为安装完环境就变为自动就有了。-c 的作用是指定配置文件 etc/mosquitto/mosquitto.conf 的入径。配置文件是默认安装在 etc/mosquitto/mosquitto.conf ,这样就表示已经启动起来了,并且如果不传递端口号 1883,默认的端口号就是 1883. 由于服务器处于注册状态,需要去完成发布和订阅,建议再打开两个终端号。这样服务器就没有办法输入东西了。
四、最简单的订阅命令
接下来来看最简单的订阅命令就是 mosquitto_sub-t“temp”,mosquitto_sub 这就是订阅指令,参数 -t 是订阅的主题,就相当于要去订阅一篇文章那这篇文章的主题就是 -t。可以加上“”,也可以不加,比如说名字是叫做 temp , 名字可以随便起,之前讲过名字不需要经过提前定义,随时可以在使用的时候去定义就可以了。 mosquitto_sub-t temp 处于注册的状态,订阅这个主题等待有人发布关于此主题的内容。这是在另外一个终端,在服务端看看有没有更多消息的输出,服务端在这时就打印了 New connection from 127.0.0.1 on port 1883. New client connected from 127.0.0.1 as mosq-cs1N8qIK4wtzd0qjux(p2,c1,k60)
这样的信息,这是之前打的表示服务器客户端都在同一台主机上面,相当于是一个回环来自 127.0.0.1 连接到了本地。包括里边有一些基本信息 mosq-cs1N8IK4wtzd0qjux(p2,c1,k60)。这时发布一个消息 pub ,pub 也是通过 -t 来指定主题。除了主 t 之外,还通过 -m 来指定内容。那样就再加上内容 -m hello。所以发布方发布完就会退出。再打开服务器的界面发现又有一个新的客户端连接上了。服务器中出现 disconnected 就表示服务器已经断开了。客户端的内容 hello 已经被接收到了。在订阅的时候还可以多加一些参数,加一个 -v 这是显示的内容就可以更多一些,比如再换一个内容叫做 “hehe”,那么 android2 就会显示出 “hehe”属于 temp 主题,这就相当于信息更加丰富些。也可以指定主机通过 -h,在服务器输入本机的主机的 ip192.168.1.13 这就是指定的主机。在 android2 显示收到了两个 “he he” ,这时在服务器中已经发生变化,已经连接到了192.168.1.13 ,之前是回环现在是特定的 ip 。当然还可以指定端口,端口默认的就是 1883。对于接收方也一样,也可以指定主机和端口。还可以改变通信质量,将通信质量改为 q1,也同样可以接收到。还可以指定 q2。
五、通信质量为 q1 或 q2,通信过程中的区别
不管指定什么方式,通信过程中的区别是什么,可以先让服务器退出,然后重新启动服务器,再加一个参数 -d,原因是输入 mosquitto --help 会出现一些内容,在服务器中 -d 不是调试的意思。打开服务器后,对于客户端,在订阅消息的时候再多加一个参数 -d。再加了 -d 之后服务器没有明显的现象,但是对于客户端来说就发送了连接请求 (sending CONNECT)。而且这个过程完全可以对照通信过程或者是手册里面的14种报文。比如说 CONNECT 连接,客户端请求连接服务端,然后 sending,received。
六、订阅的步骤
接下来是开始订阅,订阅之前第一步就是连接 SUBSCRIBE,SUBSCRIBE 客户端订阅请求,服务器回了一个SUBACK,随后就开始发 PINGREQ(心跳包),sending PINGREQ 是发送给服务器的心跳包, received PINGRESP 是服务器回过来的。超时后就会发一次心跳包,保证一直处于连接状态。另一边的客户端也一样,假设以 q 0-d,然后可以看到之前发送的 hehe,连接的服务器,服务器给了一个连接应答。PUBLISH 就是消息, d0,q0,r0,m1 是参数,‘temp’, ...(4 bytes ) 是它的主题,发送出去然后断开。在客户端收到了 hehe。
这时把质量提高将 q0 变为 q1,之前是没有应答 (PUBACK)的,变为 q1 之后出现了应答正好就是通信的过程。再将 q1 改为 q2,改为 q2 之后信息变得更大,服务器在收到之后做了一个记录(RUBREC),并且在发送一个释放,再回一个完成。在 2android2 也有收到。
这是将订阅方退出,此时是没有订阅的,再以 q2 订阅一次与之前是一样的,依然有一个结束应答 (PUBCOMP),因此并不代表通信质量是 2 的时候,订阅方是一定存在的,订阅方可以不存在。
也就是现在连接客户端不会输出订阅的消息。因为 DISCONNECT 断开就默认客户端取消了订阅。它指的是订阅了只是暂时不在线而已,这就是整个通信过程通过 pub 可以详细的看到数据的传送过程,也就验证了之前的三种通信质量,这就是 mosquitto 最基本的操作。