专栏首页云计算教程系列如何在Ubuntu上搭建MQTT服务器
原创

如何在Ubuntu上搭建MQTT服务器

介绍

MQTT(消息队列遥测传输)是ISO 标准下基于发布/订阅范式的消息协议。它工作在 TCP/IP协议族上,是为硬件性能低下的远程设备以及网络状况糟糕的情况下而设计的发布/订阅型消息协议。

Mosquitto是一款实现了消息推送协议 MQTT v3.1 的开源消息代理软件,提供轻量级的,支持可发布/可订阅的的消息推送模式,使设备对设备之间的短消息通信变得简单,比如现在应用广泛的低功耗传感器,手机、嵌入式计算机、微型控制器等移动设备。它具有强大的社区支持,并且易于安装和配置。

在本教程中,我们将教你安装Mosquitto,并通过腾讯云免费的SSL证书进行加密配置。本教程是基于Ubuntu系统,如果你使用的是CentOS系统请查看物联网入门:搭建MQTT服务器这篇文章。

准备

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

  • 一个Ubuntu 16.04服务器,我们建议您使用腾讯云免费开发者实验室进行试验。
  • 一个指向服务器的域名,可以参考腾讯云快速添加域名解析,本教程将使用mqtt.example.com进行简介。
  • nano文本编辑器。本教程将自始至终使用nano,您可以使用sudo yum -y install nano命令进行安装或者替换您最喜欢的文本编辑器。

第一步 - 安装Mosquitto

Ubuntu 16.04在其默认软件存储库中有一个新版本的Mosquitto。使用非root用户登录并用apt-get安Mosquitto。

sudo apt-get install mosquitto mosquitto-clients

默认情况下,Ubuntu将在安装后启动Mosquitto服务。现在让我们测试默认配置。mosquitto包附带了一些MQTT客户端命令行。我们将使用其中一个订阅代理上的主题。

主题是您发布消息并订阅的标签。它们按等级排列,你可以有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,不要关闭其他终端哦,后面我们还要进行测试。

接下来,我们将使用新的Let's Encrypt客户端Certbot通过SSL保护我们的安装过程。

第二步、申请腾讯云SSl加密证书

1. 申请入口

进入SSL证书管理控制台

单击【申请证书】

查看申请域名型证书型号,单击【确定】

填写申请

填写申请域名,例如qcloud.com,cloud.tencent.com,demo.test.qlcoud.com。

手动DNS验证方式

证书默认支持收到DNS验证,验证方法可查看详情

提交申请后验证身份

提交申请成功后弹窗提示如下,需要前往【证书详情页】获取CName记录添加解析:

获取CName记录如Tips中显示,需要尽快成功添加解析,方可通过CA机构审核:

第三步 - 配置MQTT密码

Mosquitto包含一个工具,用于生成一个特殊的密码文件,名为mosquitto_passwd。此工具将提示您输入指定用户名的密码,并将结果放在/etc/mosquitto/passwd

sudo mosquitto_passwd -c /etc/mosquitto/passwd sammy

现在,我们将替换默认的配置文件,并告诉Mosquito使用这个密码文件来要求所有连接的登录。

sudo nano /etc/mosquitto/mosquitto.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_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加密来修复这个问题。

第四步 - 配置MQTT SSL

为了启用SSL加密,我们需要告诉Mosquitto我们的加密证书存储在哪里。打开我们以前的配置文件。

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

在文件末尾粘贴以下内容,写下下面的内容:

. . .
listener 1883 localhost
​
listener 8883
certfile /etc/tencentcloud/live/mqtt.example.com/cert.pem
cafile /etc/tencentcloud/live/mqtt.example.com/chain.pem
keyfile /etc/tencentcloud/live/mqtt.example.com/privkey.pem

我们要增加两个单独的listener到配置。第一个,listener 1883 localhost,更新1883端口上的默认mqtt侦听器。1883是标准的未加密的MQTT端口。Mosquitto只将该端口绑定到localhost接口,因此无法从外部访问它。外部请求无论如何都会被防火墙阻止。

listener 8883在端口上设置加密侦听器8883端口。这是MQTT+SSL的标准端口,通常称为MQTTS。接下来的三行,certfile,cafilekeyfile,填写您在腾讯云申请到的证书地址。

保存并退出文件。

在重新启动Mosquitto以加载新配置之前,我们需要安装一个mosquitto服务文件。systemd这个文件用于确定如何运行mosquitto。在你最喜欢的编辑器里打开它。

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

sudo systemctl restart mosquitto

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

sudo ufw allow 8883
Rule added

现在我们再次使用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我们将得到一个错误,即主机名与证书主机名不匹配。

--cafile /etc/ssl/certs/ca-bundle.crtmosquitto_pub启用SSL,并告诉它在哪里查找根证书。它们通常是由操作系统安装的,所以对于MacOS、Windows等来说,路径是不同的。mosquitto_pub使用根证书来验证Mosmisto服务器的证书是否已由腾讯云所签发的证书颁发机构正确地签名。重要的是要注意mosquitto_pubmosquitto_sub如果没有此选项,将不会尝试使用ssl连接,即使您正在连接到标准的安全端口8883

如果一切顺利,我们将看到Hello again出现在另一个mosquitto_sub终端。这意味着您的服务器已经完全设置好了!如果您希望扩展MQTT协议以使用WebSocket,则可以执行最后一步。

第五步 - 通过Websockets配置MQTT(可选)

为了在Web浏览器中使用JavaScript来使用MQTT,该协议被调整为在标准WebSocket上工作。如果不需要此功能,则可以跳过此步骤。

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

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

在文件末尾添加以下内容:

. . .
listener 8083
protocol websockets
certfile /etc/tencentcloud/live/mqtt.example.com/cert.pem
cafile /etc/tencentcloud/live/mqtt.example.com/chain.pem
keyfile /etc/tencentcloud/live/mqtt.example.com/privkey.pem

除了端口号和协议websockets行之外,这与前一个块大致相同。MQTT在websockets上没有官方标准化端口,但8083是最常见的。

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

sudo systemctl restart mosquitto

在防火墙里打开端口8083

sudo ufw allow 8083

要测试此功能,我们将使用基于浏览器的MQTT客户端。其中Eclipse Paho JavaScript Client是比较简单易用的。在浏览器中打开Paho客户端,你会看到以下内容:

填写连接信息如下:

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

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

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

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

结论

现在,我们已经建立了一个安全的、受密码保护的MQTT服务器,并使用了腾讯云SSL证书。这将作为一个强大和安全的消息传递平台,无论你梦想什么项目。与MQTT协议很好地工作的一些流行的软件和硬件包括:

  • OwnTracks一个开源的地理跟踪应用程序,你可以安装在你的手机上。 OwnTracks将定期向您的MQTT服务器报告位置信息,然后您可以将其存储并显示在地图上,或者根据您的位置创建警报和激活物联网硬件。
  • Node-RED是一个基于浏览器的图形界面,用于“连接”物联网。您可以将一个节点的输出拖到另一个节点的输入中,并可以通过筛选器、不同协议之间的信息路由到数据库,等等。MQTT得到了Node-red的很好的支持.
  • ESP 8266是一种价格低廉的具有MQTT功能的wifi微控制器。

这些只是MQTT生态系统中几个流行的例子。外面有更多的硬件和软件来表达协议。如果您已经有了最喜欢的硬件平台或软件语言,那么它可能具有MQTT功能。腾讯云也开放物联网通信服务,腾讯云旨在提供一个安全、稳定、高效的连接平台,帮助开发者低成本、快速地实现“设备-设备”、“设备-用户应用”、“设备-云服务”之间可靠、高并发的数据通信。 总之,基于腾讯物联网通信,开发者可以低成本实现“设备-数据-应用-云服务”的连接,快速搭建物联网应用平台。 让你们的“东西”互相交谈,玩得开心!


参考文献:《How to Install and Secure the Mosquitto MQTT Messaging Broker on Ubuntu 16.04》

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 如何在Ubuntu 16.04上安装和配置Zabbix以安全地监视远程服务器

    Zabbix是用于web和应用程序的开源监控软件。它提供对从服务器,虚拟机和任何其他类型的网络设备收集的数千个指标的实时监控。这些指标可帮助确定IT基础架构的当...

    angel_郁
  • 如何在CentOS 7上安装和配置scponly

    scponly是匿名FTP的安全替代品。它使管理员能够设置具有受限远程文件访问权限且无法访问交互式shell的安全用户帐户。

    angel_郁
  • 如何在CentOS 7上使用uWSGI和Nginx为Flask应用程序提供服务

    在本指南中,我们将使用CentOS 7上的Flask微框架设置一个简单的Python应用程序。本文的大部分内容将是关于如何设置uWSGI应用程序服务器以启动应用...

    angel_郁
  • 作为程序猿/媛的你在5.20这一天都干了什么???

      今天是2017.5.20,也许你忙的都忘记了今天是网络情人节,因为5.20谐音我爱你,被称为网络情人节,也许身为菜鸟程序猿的你会写个小程序或者copy一个网...

    别先生
  • [快速入门]如何在Ubuntu 18.04上安装和保护Mosquitto MQTT消息传递代理

    MQTT是一种机器到机器的消息传递协议,旨在为“物联网”设备提供轻量级的发布/订阅通信。Mosquitto是一种流行的MQTT服务器(或MQTT中的代理),具有...

    信姜缘
  • Flutter进阶篇(6)-- PageStorageKey、PageStorageBucket和PageStorage使用详解

    本文所讲到的文件名称为:page_storage.dart,源码存放在本地的路径为:Flutter安装路径/packages/flutter/lib/src/w...

    AWeiLoveAndroid
  • 一文教你用 Neo4j 快速构建明星关系图谱

    本文将带你用 neo4j 快速实现一个明星关系图谱,因为拖延的缘故,正好赶上又一年的4月1日,于是将文中的几个例子顺势改成了“哥哥”张国荣。正所谓“巧妇难为无米...

    古柳_DesertsX
  • Tree - Information Theory

    This will be a series of post about Tree model and relevant ensemble method, inc...

    风雨中的小七
  • 网站建设明细:建一个网站要多少钱?

    互联网普及后,企业由于发展和宣传需要,都会建设自己企业的网站,但是建设一个网站费用问题是很模糊的概念。因为需求决定了价格。今天,小熊优化的小编就为大家说一说建...

    用户4831957
  • 云原生下的新 DevSecOps 实践

    云环境的安全跟企业内网的安全是不一样的,有可能我做一个网络分段,拔一根网线就安全了,但是云计算是不太一样的。先说一下在DevOps 的发展历程中安全相关的发展,...

    DevOps时代

扫码关注云+社区

领取腾讯云代金券