环境:Ubuntu 16.04web
MQTT是一种机器到机器的消息传递协议,旨在为“物联网”设备提供轻量级的发布/订阅通讯。它一般用于地理跟踪车队,家庭自动化,环境传感器网络和公用事业规模数据收集。安全
Mosquitto是一种流行的MQTT服务器(或MQTT中的代理),具备出色的社区支持,易于安装和配置的特色。服务器
在本教程中,咱们将安装Mosquitto并设置咱们的代理以使用SSL来保护受密码保护的MQTT通讯。websocket
MQTT 是一个轻量级即时通讯协议,使用基于 TCP/IP 协议的发布/订阅消息转发模式, MQTT 协议的中心是 broker( 服务器/代理),客户端经过订阅消息和发布消息进行数据交互。
若初次接触MQTT协议,可先理解如下概念:
【MQTT协议特色】——相比于RESTful架构的物联网系统,MQTT协议借助消息推送功能,能够更好地实现远程控制。
【MQTT协议角色】——在RESTful架构的物联网系统,包含两个角色客户端和服务器端,而在MQTT协议中包括发布者,代理器(服务器)和订阅者。
【MQTT协议消息】——MQTT中的消息可理解为发布者和订阅者交换的内容(负载),这些消息包含具体的内容,能够被订阅者使用。
【MQTT协议主题】——MQTT中的主题可理解为相同类型或类似类型的消息集合。网络
Mosquitto是一款实现了 MQTT v3.1 协议的开源消息代理软件,包括了服务器端和客户端,能够跨平台部署,提供轻量级的,支持发布/订阅的的消息推送模式,使设备对设备之间的短消息通讯简单易用。架构
2.1安装mosquittosocket
1.引入mosquitto仓库并更新测试
sudo apt-add-repository ppa:mosquitto-dev/mosquitto-ppa sudo apt-get update
2.执行如下命令安装mosquittoui
sudo apt-get install mosquitto
3.查看mosquitto服务状态加密
sudo service mosquitto status
4.开启/中止mosquitto服务
sudo service mosquitto start
sudo service mosquitto stop
2.2简单的测试
一个完整的MQTT示例包括代理器,发布者和订阅者。
测试分为如下几个步骤:
(1)启动服务mosquitto
(2)订阅者经过mosquitto_sub订阅指定主题的消息。
(3)发布者经过mosquitto_pub发布指定主题的消息。
(4)代理服务器把该主题的消息推送到订阅者。
本机测试:
代理器,发布者和订阅者都在本机。
1.安装mosquitto客户端
sudo apt-get install mosquitto-clients
2.打开一个终端,订阅主题
mosquitto_sub -h localhost -t "mqtt" -v
【-h】指定要链接的MQTT服务器
【-t】订阅主题,此处为mqtt
【-v】打印更多的调试信息
3.打开另外一个终端,发布主题
mosquitto_pub -h localhost -t "mqtt" -m "Hello2 MQTT"
【-h】指定要链接的MQTT服务器
【-t】向指定主题推送消息
【-m】指定消息内容
网络测试
test.mosquitto.org是一个公开可用的Mosquitto MQTT服务器/代理。
1.经过如下命令从test.mosquitto.org订阅全部主题,任何人发布的任何消息你均可以收到,你会看到大量有趣消息滚动在你的屏幕上。
mosquitto_sub -h test.mosquitto.org -t "#" -v
2.也能够经过如下命令订阅特定主题,用来接收本身的消息
mosquitto_sub -h test.mosquitto.org -t "msg_only_from_me" -v
mosquitto_pub -h test.mosquitto.org -t "msg_only_from_me" -m "My cat is Luna"
咱们配置Mosquitto使用密码。Mosquitto包含一个实用程序来生成一个名为mosquitto_passwd
的特殊密码文件。此命令将提示您输入指定用户名的密码,并将结果放入/etc/mosquitto/passwd
sudo mosquitto_passwd -c /etc/mosquitto/passwd sammy
如今咱们将为Mosquitto打开一个新配置文件,并告诉它使用此密码文件来要求全部链接的登陆:
sudo nano /etc/mosquitto/conf.d/default.conf
这应该打开一个空文件。粘贴以下:
allow_anonymous false password_file /etc/mosquitto/passwd
请务必在文件末尾留下尾随换行符。
allow_anonymous false
将禁用全部未通过身份验证的链接,该password_file
行告诉Mosquitto在哪里查找用户和密码信息。保存并退出该文件。
如今咱们须要重启Mosquitto并测试咱们的更改。
sudo systemctl restart mosquitto
尝试发布没有密码的邮件:
mosquitto_pub -h localhost -t "test" -m "hello world"
该邮件应被拒绝:
Connection Refused: not authorised.
Error: The connection was refused.
在咱们再次尝试使用密码以前,请再次切换到第二个终端窗口,并使用用户名和密码订阅“test”主题:
mosquitto_pub -h localhost -t "test" -m "hello world" -u "sammy" -P "password"
mosquitto_sub -h localhost -t test -u "sammy" -P "password"
它应该链接并等待消息。您能够将本终端打开并链接到本教程的其他部分,由于咱们会按期发送测试消息。
如今再次使用用户名和密码与您的其余终端发布消息:
要启用SSL加密,咱们须要告诉Mosquitto存储Let的加密证书的位置。打开咱们以前启动的配置文件:
sudo nano /etc/mosquitto/conf.d/default.conf
在文件末尾粘贴如下内容,留下咱们已经添加的两行:
. . . listener 1883 localhost listener 8883 certfile /etc/letsencrypt/live/mqtt.example.com/cert.pem cafile /etc/letsencrypt/live/mqtt.example.com/chain.pem keyfile /etc/letsencrypt/live/mqtt.example.com/privkey.pem
一样,请务必在文件末尾留下尾随换行符。
咱们在配置中添加了两个单独的listener
块。
第一个,listener 1883 localhost
更新端口上的默认MQTT监听器1883
,这是咱们到目前为止所链接的。1883
是标准的未加密MQTT端口。该localhost
行的部分指示Mosquitto仅将此端口绑定到localhost接口,所以没法从外部访问它。不管如何,咱们的防火墙都会阻止外部请求,但明确是好的。
listener 8883
在端口上设置加密侦听器8883
。这是MQTT + SSL的标准端口,一般称为MQTTS。
接下来的三行: certfile
,cafile
,和keyfile
,都指向Mosquitto到适合咱们加密文件创建的加密链接。
保存并退出该文件,而后从新启动Mosquitto以更新设置:
sudo systemctl restart mosquitto
更新防火墙以容许链接到端口8883
sudo ufw allow 8883
输出以下所示:
Rule added Rule added (v6)
如今咱们再次使用mosquitto_pub
测试一些不一样的SSL选项:
mosquitto_pub -h mqtt.example.com -t test -m "hello again" -p 8883 --capath /etc/ssl/certs/ -u "sammy" -P "password"
请注意,咱们使用的是完整的主机名而不是localhost
。由于咱们发出了mqtt.example.com
SSL证书,若是咱们尝试localhost
安全链接,咱们会收到一个错误,说主机名与证书主机名不匹配(即便它们都指向同一个Mosquitto服务器)。
--capath /etc/ssl/certs/
启用SSL mosquitto_pub
,并告诉它在哪里查找root证书。这些一般由您的操做系统安装,由于Mac OS,Windows等的路径不一样。mosquitto_pub
使用root证书验证Mosquitto服务器的证书是否由Let的加密证书颁发机构正确签名。须要很注意的是mosquitto_pub
并且它没有这个选项不会尝试(或相似的SSL链接--cafile
选项),即便你链接的标准安全端口8883
。
若是测试结果一切正常,咱们会再次看到hello出如今另外一个mosquitto_sub
终端。这意味着您的服务器已彻底设置好!若是您想扩展MQTT协议以使用websockets,您能够按照最后一步操做。
参考连接:
https://cloud.tencent.com/developer/article/1350337