近接触MQTT协议,MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议)协议是一种基于发布/订阅(publish/subscribe)模式的“轻量级”通讯协议,该协议构建于TCP/IP协议上,由IBM在1999年发布。MQTT大优点在于,可以以极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务。做为一种低开销、低带宽占用的即时通讯协议,使其在物联网、小型设备、移动应用等方面有较广泛的应用。
MQTT的特色
MQTT是一个基于客户端-服务器的消息发布/订阅传输协议。MQTT协议是轻量、简单、开放和易于实现的,这些特点使它适用范围非常广泛。在很多情况下,包括受限的环境中,如:机器与机器(M2M)通信和物联网(IoT)。其在,通过卫星链路通信传感器、偶尔拨号的医疗设备、智能家居、及一些小型化设备中已广泛使用。
MQTT协议当前版本为,2014年发布的MQTT v3.1.1。除标准版外,还有一个简化版MQTT-SN,该协议主要针对嵌入式设备,这些设备一般工作于百TCP/IP网络,如:ZigBee。
MQTT协议运行在TCP/IP或其他网络协议,提供有序、无损、双向连接。其特点包括:
1. 使用的发布/订阅消息模式,它提供了一对多消息分发,以实现与应用程序的解耦。
2. 对负载内容屏蔽的消息传输机制。
3. 对传输消息有三种服务质量(QoS):
4. 数据传输和协议交换的小化(协议头部只有2字节),以减少网络流量
5. 通知机制,异常中断时通知传输双方
服务质量
接下来我们来了解一下MQTT的服务质量,为了满足不同的场景,MQTT支持三种不同级别的服务质量(Quality of Service,QoS)为不同场景提供消息可靠性:
o 多一次,这一级别会发生消息丢失或重复,消息发布依赖于底层TCP/IP网络。即:<=1
o 至多一次,这一级别会确保消息到达,但消息可能会重复。即:>=1
o 只有一次,确保消息只有一次到达。即:=1。在一些要求比较严格的计费系统中,可以使用此级别
MQTT实现原理
MQTT可以理解主要由两端构成网络,一端是服务器端,另一端就是客户端。
而客户端又分两个角色,一个是订阅者、另一个是发布者,服务器则是代理,流程如下:
订阅者首先在代理那订阅主题,发布者发布该主题内容时,订阅者才会收到,否则不会接收任何信息。
MQTT本身的消息也分为令部分:主题(Topic)和负载(payload)。
o Topic,可以理解为消息的类型,订阅者订阅(Subscribe)后,就会收到该主题的消息内容(payload)
o payload,可以理解为消息的内容,是指订阅者具体要使用的内容
MQTT代理搭建(Linux下搭建)
我们在上面了解了一下MQTT,具体的协议可以去官网//mqtt.org查看,而这些知识只是协议的介绍,下面我们来了解一下如何搭建MQTT网络,mosquitto是MQTT的开源代理,遵循的是MQTT v3.1.1协议。下面我们搭建代理。
2 # 下载源代码包
wget //mosquitto.org/files/source/mosquitto-1.4.12.tar.gz
shell Code
2 # 解压
tar zxfv mosquitto-1.3.4.tar.gz
shell Code
2 # 进入目录
cd mosquitto-1.3.4
shell Code
2 # 编译
make
shell Code
2 # 安装
sudo make install
遇到下属问题的解决办法:
idea Code
【1】编译找不到openssl/ssl.h
【解决方法】——安装openssl
sudo apt-get install libssl-dev
【2】编译过程找不到ares.h
【解决方法】——修改config.mk中的WITH_SRV:=yes,改为WITH_SRV:=no
【3】使用过程中找不到libmosquitto.so.1
error while loading shared libraries: libmosquitto.so.1:
cannot open shared object file: No such file or directory
【解决方法】——修改libmosquitto.so位置
# 创建链接
sudo ln -s /usr/local/lib/libmosquitto.so.1/usr/lib/libmosquitto.so.1
# 更新动态链接库
sudo ldconfig
【4】make: g++:命令未找到
【解决方法】
安装g++编译器
sudo apt-get install g++
MQTT代理的搭建(windows下搭建)
Mosquitto有两个模式,一个是win32,一个是cygwin,下面是下载地址:
mosquitto-1.0.3-install-win32.exe(743 kB) (Native build, Windows Vista and up)
mosquitto-1.0.3-install-cygwin.exe(2,026kB)(Cygwin build, Windows XP and up)
安装win2版本
win32直接下载到本地,安装即可。
如果缺少libeay.dll 、 pthreadVC2.dll、ssleay.dll等库文件,需要下载到本地同级目录再进行安装。
安装cygwin版本
而安装cywin是需要下载cygwin,下面是下载地址
mosquitto-1.0.3-install-cygwin.exe
Mosquitto依赖的lib有binutils、gcc4-core、gcc4-gcc、libwrap-devel、libwrap0、make、mercurial、wget。
后安装mosquitto-cygwin软件,可以在任务管理器中启动mosquitto服务。
MQTT设置用户密码(windows和Linux相同,这里以;Linux为例)
在 /etc/mosquitto/mosquitto.conf 文件中需配置是否允许匿名用户、用户存储的用户名密码的文件路径、用户访问主题权限的文件路径,配置文如下:
NormalText Code
allow_anonymous false # 不允许匿名
password_file /etc/mosquitto/passwd # 配置用户密码文件
acl_file /etc/mosquitto/acl #配置topic和用户 (此文件是配置用户访问某主题,
如果不配置则使用password_file文件中的用户密码进行访问)
添加用户
NormalText Code
#mosquitto_passwd -c /etc/mosquitto/passwd pub_client
#mosquitto_passwd /etc/mosquitto/passwd sub_client
第一个命令,参数多一个-c,是创建/etc/mosquito/passwd文件,将用户名和密码写到文件中,用户名是明文,密码是加密过的密文。
第二个命令,是在已有的用户上添加新的用户。
配置好后,代理会屏蔽匿名用户。
为用户添加可操作主题
NormalText Code
user pub_client
topic write mtopic/#
user sub_client
topic read mtopic/#
在给定mosquitto.conf中给定acl文件的路径中 打开文件,user后面添加已有用户名,topic 后面添加 可读或者可写的主题,read 是可读,write是可写。