想做个物联网接入平台
今天在电脑中找到了去年8月份画的一张图,突然自己又想把它给实现出来。希望自己还能抽出时间去撸上一把。
本文主要介绍一下Mosquitto中用到的比较重要的数据结构,为之后的流程处理讲解奠定基础。为了清晰,结构体展示时只保留重要成员。
写这个系列文章其实出发点有很多。一方面是很早之前看到了一个开源物联网云平台项目,叫做iotgo,有兴趣的同学可以去搜索后了解一下。iotgo使用的是node.js语言编写,是一个物理网设备管理的平台。我抽出了十一假期研究了一下它的源码:它使用angular做前端,前端通过websocket实时从后台获取设备信息,所有的设备通过socket与平台通讯。但是这个框架我还是觉得很别扭,可能在我看来一个网站只是一个用户接口而已,不应与设备直接打交道,于是我想起来了MQTT(只是一个协议),当时实验室有同学在用这个做项目。设备可以通过MQTT协议与服务器进行通信,然后网站只需要与代理服务器进行交互信息。目前开源的MQTT服务器众多,但性能参差不齐,比较常用的是Mosquitto,EMQTT等等。Mosquitto被广泛地应用在各种研究和实际项目,但在阅读其源码的过程中,发现它还有很多性能可以提升的地方。所以提升MQTT服务器性能成了我的毕业设计,我想将自己理解和修改Mosquitto过程记录下来分享出来,这些是我写这系列文件的初衷之一。
MQTT协议的固定报文头由两个部分组成,第一部分是报文的控制类型与标识,占据1个字节;第二部分是报文的剩余长度,占据1~4个字节。
心跳检测是客户端发送给服务端的。协议中关于心跳检测的作用是这样叙述的
1.在没有任何其它控制报文从客户端发给服务的时,告知服务端客户端还活着。
与QoS0类似,可以是客户端向服务端发布,也可以是服务端向客户端发布消息。但是在QoS1的服务质量中,接收者需要对发布者的消息进行回应。
发布可以使客户端发送给服务端,也可以是服务端发送给客户端。当一个客户端A想发布一条消息时,它应该先把这条消息发布给服务端,然后由服务端作为代理将该条消息发布给所有订阅消息主题的客户端们。