前一段有幸参与到一个智能家居项目的开发,由于之前都没有过这方面的开发经验,所以对智能硬件的开发模式和技术栈都颇为好奇。
产品是一款可燃气体报警器,如果家中燃气泄露浓度到达一定阈值,报警器检测到并上传气体浓度值给后台,后台以电话、短信、微信等方式,提醒用户家中可能有气体泄漏。
用户还可能向报警器发一些关闭报警、调整音量的指令等。整体功能还是比较简单的,大致的逻辑如下图所示:
但当我真正的参与其中开发时,其实有一点小小的失望,因为在整个研发过程中,并没用到什么新的技术,还是常规的几种中间件,只不过换个用法而已。
技术选型用rabbitmq
来做核心的组件,主要考虑到运维成本低,组内成员使用的熟练度比较高。
下面和小伙伴分享一下如何用 springboot
+ rabbitmq
搭建物联网(IOT
)平台,其实智能硬件也没想象的那么高不可攀!
很多小伙伴可能有点懵?rabbitmq
不是消息队列吗?怎么又能做智能硬件了?
其实rabbitmq
有两种协议,我们平时接触的消息队列是用的AMQP
协议,而用在智能硬件中的是MQTT
协议。
一、什么是 MQTT协议?
MQTT
全称(Message Queue Telemetry Transport):一种基于发布/订阅(publish
/subscribe
)模式的轻量级
通讯协议,通过订阅相应的主题来获取消息,是物联网(Internet of Thing
)中的一个标准传输协议。
该协议将消息的发布者(publisher
)与订阅者(subscriber
)进行分离,因此可以在不可靠的网络环境中,为远程连接的设备提供可靠的消息服务,使用方式与传统的MQ有点类似。
TCP
协议位于传输层,MQTT
协议位于应用层,MQTT
协议构建于TCP/IP
协议上,也就是说只要支持TCP/IP
协议栈的地方,都可以使用MQTT
协议。
二、为什么要用 MQTT协议?
MQTT
协议为什么在物联网(IOT)中如此受偏爱?而不是其它协议,比如我们更为熟悉的 HTTP
协议呢?
-
首先
HTTP
协议它是一种同步协议,客户端请求后需要等待服务器的响应。而在物联网(IOT)环境中,设备会很受制于环境的影响,比如带宽低、网络延迟高、网络通信不稳定等,显然异步消息协议更为适合IOT
应用程序。 -
HTTP
是单向的,如果要获取消息客户端必须发起连接,而在物联网(IOT)应用程序中,设备或传感器往往都是客户端,这意味着它们无法被动地接收来自网络的命令。 -
通常需要将一条命令或者消息,发送到网络上的所有设备上。
HTTP
要实现这样的功能不但很困难,而且成本极高。
三、MQTT协议介绍
前边说过MQTT
是一种轻量级的协议,它只专注于发消息, 所以此协议的结构也非常简单。
MQTT数据包
在MQTT
协议中,一个MQTT
数据包由:固定头
(Fixed header)、 可变头
(Variable header)、 消息体
(payload)三部分构成。
- 固定头(Fixed header),所有数据包中都有固定头,包含数据包类型及数据包的分组标识。
- 可变头(Variable header),部分数据包类型中有可变头。
- 内容消息体(Payload),存在于部分数据包类,是客户端收到的具体消息内容。
1、固定头
固定头部,使用两个字节,共16位:
(4-7)位表示消息类型,使用4位二进制表示,可代表如下的16种消息类型,不过 0 和 15位置属于保留待用,所以共14种消息事件类型。