ubuntu18.04和windows上安装Mosquitto以及配置SSL

什么是MQTT

Message Queuing Telemetry Transport,消息队列遥测传输,是IBM于1998年设计和开发的一种即时通信协议。MQTT是轻量级的发布/订阅式消息传输,旨在为低带宽和不稳定的网络环境中的物联网设备提供可靠的网络服务。在2014年,MQTT成为OASIS标准协议。

最新规范版本为3.1.1。
http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/os/mqtt-v3.1.1-os.html

为什么要用MQTT

(1)低协议开销
MQTT的每消息标题可以短至 2 个字节。对于 HTTP,为每个新请求消息重新建立 HTTP 连接,会导致重大的开销。 MQTT 所使用的永久连接显著减少了这一开销。

(2)对不稳定网络的容忍
MQTT 能够从断开等故障中恢复,而且没有进一步的代码需求。但是,HTTP 无法原生地实现此目的,需要客户端重试编码,这可能增加幂等性问题。

(3)低功耗
MQTT 是专门针对低功耗目标而设计的,HTTP 的设计没有考虑此因素。

(4)数百万个连接的客户端
在 HTTP 堆栈上,维护数百万个并发连接,需要做许多的工作来提供支持。IBM 提供了 IBM MessageSight,这是一个单机架装载服务器,经过测试能处理多达 100 万个通过 MQTT 并发连接的设备。

(5)推送通知
MQTT采用订阅/发布模式,为推送而生。HTTP 只允许使用一种称为COMET 的方法,使用持久的 HTTP 请求来执行推送。从客户端和服务器的角度讲,此方法都很昂贵。

当然,MQTT也不是完美的。

(1)不支持离线消息,需要弥补设备离线以后,MQTT服务器对设备的控制信息丢失的问题。

(2)不支持点对点通信。当设备B和设备C可发送同一主题的情况下,设备A无法知道是设备B还是设备C发送的消息,也有可能消息被设备D窃听。

(3)框架繁多。不同的框架提供了不同的SDK,不同的SDK所支持的功能范围也不尽相同。例如不少框架尚不支持android,SSL。

MQTT如何工作

MQTT协议所传输的信息,都需要一个Topic(主题)。
MQTT服务器被称为broker,会根据Topic来分发所接收的信息。
MQTT客户端被称为client,可以发送任意Topic,也可以接收所注册的Topic。
发送Topic消息的一方,被称为publisher。
接收Topic消息的一方,被称为Subscriber.
MQTT客户端,既可以是Subscriber,也可以同时为publisher。

对于发送的消息,MQTT可以指定发送质量。

“至多一次”,消息发布完全依赖底层 TCP/IP 网络。会发生消息丢失或重复。这一级别可用于如下情况,环境传感器数据,丢失一次读记录无所谓。
“至少一次”,确保消息到达,但消息重复可能会发生。
“只有一次”,确保消息到达一次。这一级别可用于如下情况,在计费系统中,消息重复或丢失会导致不正确的结果。

MQTT broker的选择

你不需要给自己创建一个MQTT的消息中转站!MQTT有很多免费的broker可供选择,这是很令人高兴的。
当然,你也可以使用开源框架,搭建自己的MQTT broker。只是如果想达到百万级的连接量的话,就不要去想。因为,所谓的“开源”也是用来赚钱的。通常1~2万级别还是有戏的。上量的话,收费!之前项目需要,使用了一款broker,据说是一华为毕业的同仁开发。按连接量收费,每个连接5毛。看来,技术就是生产力啊。靠手艺吃饭,没的说,就是用起来有点贵。果断弃之~

在之前的项目中,尝试了一下几种框架。
(1)mosquitto,使用C和C++开发,老牌MQTT broker。64位版本问题较多,需要结合Cmake来进行重新编译。
(2)Joram,使用Java开发,能对Server端信息的分流进行监听。但问题在于没有对Android的支持。
(3)emqttd,使用Erlang语言开发,二次开发难度大,容易受制于人。

ubuntu安装Mosquitto服务端和客户端

介绍

MQTT是一种机器对机器的消息传递协议,旨在为“物联网”设备提供轻量级的发布/订阅通信。它通常用于车辆的地理跟踪,家庭自动化,环境传感器网络和公用事业规模的数据收集。

Mosquitto是流行的MQTT服务器(或MQTT的代理),它具有强大的社区支持,并且易于安装和配置。

在本教程中,我们将安装Mosquitto并将代理设置为使用SSL来保护受密码保护的MQTT通信。

先决条件

在开始本教程之前,您需要:

第1步-安装Mosquitto

Ubuntu 18.04在其默认软件存储库中具有Mosquitto的最新版本,因此我们可以从那里安装它。

首先,使用您的非root用户登录并使用以下命令更新软件包列表apt update

sudo apt update

现在,使用安装Mosquitto apt install

sudo apt install mosquitto mosquitto-clients

默认情况下,Ubuntu将在安装后启动Mosquitto服务。让我们测试默认配置。我们将使用我们刚安装的Mosquitto客户端之一来订阅经纪人上的主题。

~# ps -elf | grep mosquitto

如果有如下进程,则说明mosquitto已经启动
0 S radia 1616 1431 0 80 0 - 4037 pipe_w 11:12 pts/0 00:00:00 grep --color=auto mosquitto
4 S mosquit+ 10361 1 0 80 0 - 12010 - May18 ? 00:07:09 /usr/sbin/mosquitto -c /etc/mosquitto/mosquitto.conf

主题是您将消息发布到并订阅的标签。它们按层次结构排列,因此例如可以有sensors/outside/tempsensors/outside/humidity。您如何安排主题取决于您和您的需求。在本教程中,我们将使用一个简单的测试主题来测试我们的配置更改。

第二次登录到服务器,因此并排有两个终端。在新终端中,用于mosquitto_sub订阅测试主题:

mosquitto_sub -h localhost -t test

-h用于指定MQTT服务器的主机名,并且-t是主题名称。点击后,您将看不到任何输出,ENTER因为它mosquitto_sub正在等待邮件到达。切换回您的其他终端并发布一条消息:

mosquitto_pub -h localhost -t test -m "hello world"

的选项mosquitto_pub与相同mosquitto_sub,尽管这次我们使用附加-m选项来指定消息。点击ENTER,您应该会在另一个终端中看到hello world。您已经发送了第一条MQTT消息!

输入CTRL+C第二个终端以退出mosquitto_sub,但保持与服务器的连接打开。我们将在步骤5中再次将其用于其他测试。

接下来,我们将使用基于密码的身份验证来保护安装。

步骤2 —配置MQTT密码

让我们将Mosquitto配置为使用密码。Mosquitto包含一个实用程序,用于生成名为的特殊密码文件mosquitto_passwd。该命令将提示您输入指定用户名的密码,并将结果放在中/etc/mosquitto/passwd

sudo mosquitto_passwd -c /etc/mosquitto/passwd sammy

现在,我们将为Mosquitto打开一个新的配置文件,并告诉它使用此密码文件要求所有连接都需要登录:

sudo nano /etc/mosquitto/conf.d/default.conf

这应该打开一个空文件。粘贴以下内容:/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"

该消息应被拒绝:

OutputConnection Refused: not authorised.
Error: The connection was refused.

在再次尝试使用密码之前,请再次切换到第二个终端窗口,并使用用户名和密码来订阅’test’主题:

mosquitto_sub -h localhost -t test -u "sammy" -P "password"

它应该连接并坐着,等待消息。在本教程的其余部分中,您可以保持此终端的打开和连接状态,因为我们会定期向其发送测试消息。

现在,再次使用用户名和密码在另一个终端上发布消息:

mosquitto_pub -h localhost -t "test" -m "hello world" -u "sammy" -P "password"

该消息应按照步骤1中的顺序进行。我们已成功向Mosquitto添加了密码保护。不幸的是,我们正在通过互联网发送未加密的密码。接下来,我们将为Mosquitto添加SSL加密来解决此问题。

步骤3 —配置MQTT SSL

要启用SSL加密,我们需要告诉Mosquitto我们的“加密”证书的存储位置。打开我们之前开始的配置文件:

sudo nano /etc/mosquitto/conf.d/default.conf

在文件末尾粘贴以下内容,保留我们已经添加的两行:/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在port上设置一个加密的侦听器8883。这是MQTT + SSL的标准端口,通常称为MQTTS。接下来的三行,certfilecafile,和keyfile,都指向Mosquitto到合适咱们加密文件建立的加密连接。

保存并退出文件,然后重新启动Mosquitto以更新设置:

sudo systemctl restart mosquitto

更新防火墙以允许连接到端口8883

sudo ufw allow 8883
OutputRule 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。由于我们的SSL证书是针对颁发的,因此mqtt.example.com,如果尝试进行安全连接,localhost则会收到一条错误消息,提示主机名与证书主机名不匹配(即使它们都指向同一台Mosquitto服务器)。

--capath /etc/ssl/certs/为启用SSL mosquitto_pub,并告诉它在哪里寻找根证书。这些通常是由您的操作系统安装的,因此Mac OS,Windows等的路径是不同的。mosquitto_pub使用根证书来验证Mosquitto服务器的证书是否由Let’s Encrypt证书颁发机构正确签名。这是需要注意的重要mosquitto_pub,并mosquitto_sub会尝试在没有此选项(或类似的SSL连接--cafile选项),即使你连接的标准安全端口8883

如果测试一切顺利,我们将在另一个终端再次看到问候mosquitto_sub。这意味着您的服务器已完全设置好!如果您想扩展MQTT协议以使用websocket,则可以执行最后一步。

步骤4 —通过Websockets配置MQTT(可选)

为了在Web浏览器中使用JavaScript讲MQTT,该协议经过了修改,可以在标准Websocket上工作。如果不需要此功能,则可以跳过此步骤。

我们需要在listenerMosquitto配置中再添加一个块:

sudo nano /etc/mosquitto/conf.d/default.conf

在文件末尾,添加以下内容:/etc/mosquitto/conf.d/default.conf

. . .
listener 8083
protocol websockets
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

同样,请确保在文件末尾保留换行符。

除端口号和protocol websockets线路外,其余大部分与上一个块相同。websockets上没有用于MQTT的官方标准化端口,但是这8083是最常见的端口。

保存并退出文件,然后重新启动Mosquitto。

sudo systemctl restart mosquitto

现在,打开8083防火墙中的端口。

sudo ufw allow 8083

为了测试此功能,我们将使用基于浏览器的公共MQTT客户端。那里有一些,但是Eclipse Paho JavaScript Client使用起来很简单直接。在浏览器中打开Paho客户端。您会看到以下内容:

Paho客户端屏幕

如下填写连接信息:

  • 主机应该是您的Mosquitto服务器的域mqtt.example.com
  • 端口应该是8083
  • 可以将ClientId保留为默认值js-utility-DI1m6
  • 路径可以保留为默认值/ ws
  • 用户名应该是您的Mosquitto用户名;在这里,我们使用了萨米
  • 密码应该是您选择的密码。

其余字段可以保留为其默认值。

按下Connect之后,基于Paho浏览器的客户端将连接到您的Mosquitto服务器。

要发布消息,请导航到“ 发布消息”窗格,填写主题test,然后在“ 消息”部分中输入任何消息。接下来,按发布。该消息将显示在您的mosquitto_sub终端中。

结论

现在,我们已经建立了安全的,受密码保护和SSL保护的MQTT服务器。对于您梦dream以求的项目,它都可以充当健壮且安全的消息传递平台。与MQTT协议配合使用的一些流行软件和硬件包括:

  • OwnTracks,您可以在手机上安装的开源地理跟踪应用程序。OwnTracks将定期向您的MQTT服务器报告位置信息,然后您可以将其存储在地图上并显示在地图上,或者创建警报并根据您的位置激活IoT硬件。
  • Node-RED是基于浏览器的图形界面,用于将物联网“连接”在一起。您可以将一个节点的输出拖到另一个节点的输入,并且可以通过各种协议之间的过滤器将信息路由到数据库等。NodeTT很好地支持MQTT。
  • ESP8266是一种廉价的无线微控制器MQTT能力。您可以将其连接起来以将温度数据发布到某个主题,或者订阅气压主题并在暴风雨来临时发出蜂鸣声!

这些只是MQTT生态系统中的一些流行示例。有更多的硬件和软件可以使用该协议。如果您已经拥有喜欢的硬件平台或软件语言,则它可能具有MQTT功能。让您的“事物”互相交谈,祝您玩得开心!

windows下安装mosquitto服务端和客户端

到:https://mosquitto.org/download/下载windows安装包

安装python下的客户端
pip3 install paho-mqtt
使用示例待续…

2+