MQTT是message queuing telementry transport的简称,中文是消息队列遥测传输协议。
它是一种基于发布、订阅模式的轻量级通讯协议,该协议构建于TCP/IP协议之上,由IBM在1999年发布。其最大的优点在于可以用极少的代码和有限的带宽,为远程设备提供实时可靠的消息服务。
作为一种低开销、低带宽占用的即时通讯协议,MQTT在物联网、小型设备、移动应用等方面有广泛的应用。
MQTT固定报文头最少有两个字节,第一字节包含消息类型(Message Type)和QoS级别等标志位。第二字节开始是剩余长度字段,该长度是后面的可变报文头加消息负载的总长度,该字段最多允许四个字节。
每个字节单独表示只能表示0-127的十进制数,为了表示大于127的数,需要使用多个字节,具体计算方法如下:
0xFF 0xFF 0x7F
127+128*(127+128*(127))=2,097,151
0xFF 0xFF 0xFF 0x7F
127+128*2097151=268,435,455
所以MQTT最多可携带256MB的信息数据。
可变报文头主要包含协议名、协议版本、连接标志(Connect Flags)、心跳间隔时间(Keep Alive timer)、连接返回码(Connect Return Code)、主题名(Topic Name)等,后面会针对主要部分进行讲解。
Payload直译为负荷,可能让人摸不着头脑,实际上可以理解为消息主体(body)。
当MQTT发送的消息类型是CONNECT(连接)、PUBLISH(发布)、SUBSCRIBE(订阅)、SUBACK(订阅确认)、UNSUBSCRIBE(取消订阅)时,则会带有负荷。
在固定报文头的第一字节,约定了消息的类型,其中MQTT支持14中不同的消息类型,如下图:
MQTT支持三种QoS,分别是0,1,2
QoS0表示最多发一次,意味着信息的可靠性比较差,但是可以隔段时间多次发送,适用于对信息次数不重要的消息。
QoS1表示最少发一次,意味着如果一条数据未接收到需要重复发送以确保收到,信息是可靠的,但是时延不确定。
QoS2表示要求只能发送一次,发送1次必须完成任务,适用于对次数敏感的消息。
MQTT是基于TCP/IP协议的明文传输,消息内容不被加密,可以使用抓包软件抓取。
作为传输协议,MQTT仅关注消息传输,提供合适的安全功能是开发者的责任。安全功能可以从三个层次来考虑——应用层、传输层、网络层。
MQTT支持两种认证方式:
各大云平台都已经部署了MQTT服务,可以使用其服务。
可以在私人计算机上部署MQTT服务软件为其他设备提供MQTT服务。常用的MQTT服务软件有:
这里推荐eclipse家的paho.exe
百度云
提取码:y8ya
基于TCP/IP的socket编程需要将超过最大报文长度的报文进行合理切片,而MQTT最大的消息可以达到256MB.
他们都是明文传输,但是HTML设计之初就是为了传递HTML文件,是典型的C/S模式,而MQTT可以设计成多用户多设备的通讯,基于订阅和发布形式。
最有可能与MQTT竞争的是XMPP协议。XMPP(可扩展通讯与表示协议)是一项用于实时通讯的开放技术,它使用可扩展标记语言(XML)作为交换信息的基本格式。其优点是协议成熟、强大、可扩展性强。目前主要应用于许多聊天系统中,在消息推送领域,MQTT和XMPP互相竞争。下面列举MQTT与XMPP各自的特性
综上所述,在嵌入式设备中,由于需要一个灵巧简洁,对设备开发者和服务端开发者都友好的协议,MQTT比XMPP更具有优势。
CoAP也是一个能与MQTT竞争的协议。其模仿HTTP的REST模型,服务端以URI方式创建资源,客户端可以通过GET、PUT、POST、DELETE方式访问这些资源,并且协议风格也和HTTP极为相似,使用CoAP必须经过DataBase才能转给第三方。
artemis是Apache软件基金会的项目,国内下载最好通过开源镜像网站。这里提供清华镜像:
wget https://mirrors.tuna.tsinghua.edu.cn/apache/activemq/activemq-artemis/2.19.0/apache-artemis-2.19.0-bin.tar.gz --no-check-certificate
下载完成后进行解压
tar -zxvf apache-artemis-2.19.0-bin.tar.gz
将文件夹移动到 /opt 目录下
mv apache-artemis-2.19.0/ /opt/
首先检测是否已经安装java
java -version
没有安装的话,先下载java压缩包。这里推荐华为云的镜像:
wget https://repo.huaweicloud.com/java/jdk/8u171-b11/jdk-8u171-linux-x64.tar.gz
创建安装目录,并将压缩包解压到安装目录
mkdir /usr/local/java/
tar -zxvf jdk-8u171-linux-x64.tar.gz -C /usr/local/java/
打开/etc/profile文件
vi /etc/profile
在后面加入下面的代码,配置环境变量
export JAVA_HOME=/usr/local/java/jdk1.8.0_171
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
激活配置文件,再查看java版本则安装成功
source /etc/profile
java -version
进入安装目录的 bin 目录
cd /opt/apache-artemis-2.19.0/bin/
创建broker和用户密码,角色,是否允许匿名,和创建位置
./artemis create --user admin --password admin --role admins --allow-anonymous true /opt/artemis
配置artemis
cd /opt/artemis/etc/
修改localhost为本机IP地址,从而使外部用户可以访问
vi bootstrap.xml
vi jolokia-access.xml
关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
输入启动命令:
/opt/artemis/bin/artemis run
在两台安装了MQTT客户端的设备上连接MQTT服务器,输入服务器IP地址:1883,一台订阅test,另一台发布test主题的消息,发布之后,可以在订阅的设备上看到消息。
由此可以说明MQTT服务搭建成功。
发布设备:
订阅设备: