介绍
在这篇文章中,我们将使用 Mosquitto 将 Pi 配置为一个 MQTT 消息代理,这是一个正在进行的系列文章中的第二篇,专门介绍令人惊叹的 Raspberry Pi。Mosquitto 是一个轻量级但功能强大的发布/订阅模型消息传递系统,可以安装在各种平台上。我们在本教程中的目标是在 Rasspberry Pi 2 上安装、配置和测试该软件,并且不仅能够在 Pi 上发布和订阅消息,而且还能够在其他计算机上发布和订阅消息。
如果您尚未阅读描述如何加载和配置操作系统的第一篇文章,您可以在Raspberry Pi 2, 1 of n - Initial setup或Code Project上找到它。虽然不是必需阅读,但如果您是 Linux 或 Pi 的新手,我鼓励您查看它。
本文或多或少是我使用 Mosquitto 将 Raspberry Pi 设置为 MQTT 消息代理的步骤的抄本。我使用 SwitchDoc Labs [3]的教程作为参考,但对其进行了修改以满足我的特定需求。在以后的文章中,我计划悬挂各种设备,例如;ESP8266-12E WiFi 模块,嵌入式处理器板,如 Arduino UNO 和可能的其他板,希望能在今年夏天趁热徒步和露营的时候去做。
环境
我为这个项目设置的开发环境是;
- Windows Desktop 运行 64 位 Windows 7 操作系统,配备 AMD-FX-8350 8 核处理器和 32GB 内存。
- Raspberry Pi 2,BCM2709 ARMv7 4 核,1GB RAM,运行 Raspian Jesse 操作系统。我最初为这个项目加载和配置的下载站点上有一个新的 Raspbian Jessie Lite 版本,但它没有 GUI,我计划在以后的文章中使用 NginX 和 WebSockets 来提供用于控制各种设备的前端所以我恢复使用完整版,只是去掉了垃圾软件。Pi 上的 WiFi 由edimax 加密狗提供。
- VirtualBox VM 运行 Ubuntu 12.04 LTS,我的配置几乎与 Pi 相同,但修改了一些特定于 Ubuntu 的项目。虽然我已经为自己的使用设置了这个,但我不会详细介绍我是如何做到的,我会把它留给你作为额外的功劳练习。祝蚱蜢好运!
先决条件 - 设置静态 IP 地址
尽管此步骤是可选的,但我强烈建议您在 Pi [8,11]上设置静态 IP 地址。如果您不这样做,Pi 可能会在启动时选择不同的 IP 地址,并且每次启动 Pi 时都必须编辑配置文件将是一个 PITA。对我来说,这是一个使用便宜的edimax 加密狗的无痛程序。如果您愿意等待,可以通过 ebay 以每单位 2 美元左右的价格购买 802.11 加密狗。我订购了其中一些,它们工作得相当好,虽然我还没有确定我是否会在生产环境中使用它们。
此处描述的过程使用 edimax 加密狗,但适用于 Pi 支持的任何兼容 WiFi 加密狗。在我们可以编辑配置网络所需的系统文件之前,我们需要收集一些信息。
<span style="color:#000000"><span style="background-color:#fbedbb">#显示当前网络信息类型;
如果配置</span></span>
输出应该与此类似;
wlan0 链路封装:以太网 HWaddr b8: 27 :eb:a8:cf:a4
网络地址:192。168 . 254 . 20广播:192。168 . 254 . 255面具:255。255 . 255 . 0
UP BROADCAST RUNNING MULTICAST MTU:1500度量:1
RX 数据包:161错误:0丢弃:0超限:0帧:0
TX 数据包:227错误:0丢弃:0超限:0运营商:0次
冲突:0 txqueuelen:1000
RX 字节:26075(25 . 4 KiB) TX 字节:46356(45 . 2 KiB)
inet addr 和 Mask 值是我们正在寻找的,在我的例子中,地址是 192.168.254.20,Mask 是 255.255.255.0,在大多数情况下都是这样。接下来我们需要找到网关地址。
<span style="color:#000000"><span style="background-color:#fbedbb">#显示网络网关地址类型;
网络统计 -n -r</span></span>
输出应该是这样的;
内核IP路由表
目标网关 Genmask 标志 MSS 窗口 irtt Iface
0 . 0 . 0 . 0 192。168 . 254 . 254 0 . 0 . 0 . 0 UG 0 0 0 eth0
192。168 . 254 . 0 0。0 . 0 . 0 255。255 . 255 . 0 U 0 0 0 eth0
从这里我们得到目标或网络地址是 192.168.254.0和网关地址是 192.168.254.254,现在我们准备好配置我们的网络。
我们需要修改的第一个文件是 wpa_supplicant [12]文件。wpa_supplicant [13]实现了无线网络的安全协议。[13]
<span style="color:#000000"><span style="background-color:#fbedbb">ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
更新配置= <span style="color:#000080">1</span>
网络={
ssid= <span style="color:#800080">“</span><span style="color:#800080">您的 SSID 在这里”</span>
psk= <span style="color:#800080">“ </span><span style="color:#800080">YourPresharedKeyHere”</span>
}</span></span>
请注意,“network={”中没有空格,这是故意的。用您的无线网络值替换 ssid 和 psk 值,保存并关闭文件。我使用nano来编辑这些文件,当被要求保存文件时,保存和退出的过程是ctrl+X和“Y” 。
接下来我们将转到网络接口文件,我们将在其中配置 wlan0 无线网络适配器。使用您在前面步骤中收集的值并将它们插入文件中的适当区域,如下所示。
<span style="color:#000000"><span style="background-color:#fbedbb">允许热插拔 wlan0
iface<span style="color:#0000ff">默认</span>inet<span style="color:#0000ff">静态</span>
wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf
地址<span style="color:#000080">192</span>。<span style="color:#000080">168</span> . <span style="color:#000080">254</span> . <span style="color:#000080">20</span>
网络掩码<span style="color:#000080">255</span>。<span style="color:#000080">255</span> . <span style="color:#000080">255</span> . <span style="color:#000080">0</span>
网络<span style="color:#000080">192</span> . <span style="color:#000080">168</span> . <span style="color:#000080">254</span> . <span style="color:#000080">0</span>
网关<span style="color:#000080">192</span>。<span style="color:#000080">168</span> . <span style="color:#000080">254</span> . <span style="color:#000080">254</span></span></span>
重新启动 Pi 并尝试从另一台机器 ping 或尝试使用您选择的浏览器访问网站。Jessie 预装了 IceWeasel,即 Firefox。如果一切按计划进行,那么您应该在线并准备好继续,如果没有重新访问前面的步骤或谷歌搜索适合您特定硬件配置的解决方案。
安装蚊子
安装 Mosquitto 相当简单,我们将配置代理侦听端口 1883 进行测试,默认为端口 80。
在 Pi 上打开一个终端并一次输入以下命令。
<span style="color:#000000"><span style="background-color:#fbedbb">sudo wget <span style="color:#008000"><em>http://repo.mosquitto.org/debian/mosquitto-repo.gpg.key</em></span>
sudo apt-key <span style="color:#0000ff">add</span> mosquitto- <span style="color:#008000"><em>repo.gpg.key</em></span>
cd /etc/apt/sources.list.d/<span style="color:#008000"><em>sudo</em></span>
wget <span style="color:#008000"><em>http://repo.mosquitto.org/debian/mosquitto-jessie.list</em></span>
sudo apt-get 更新
sudo apt-get install mosquitto mosquitto-clients</span></span>
- wget [4]代表“web get”,是一个从网站递归下载文件和目录结构的实用程序。在这种情况下,我们将获得 GPG,即 Gnu 隐私保护密钥,它允许提供商使用通用密钥系统加密和签署您的数据和通信。
- apt-key [3]用于管理 apt 使用的密钥列表,apt 是用于验证包的高级打包工具。
- 更改目录并使存储库可用于 apt。
- 获取存储库文件,其中包含指向下载包的 URL 的链接。
- 使用 apt-get [5]更新 apt 信息
- 最后安装 Mosquitto 和客户端。客户端提供 mosquitto_pub 和 mosquitto_sub 实用程序。我们将在稍后的测试阶段使用这些!
如果一切按计划进行,应该安装 Mosquitto,默认情况下会启动它,因为我们需要配置它,所以我们需要停止它。请参阅下一节以了解如何阻止 Mosquitto。
启动/停止 Mosquitto
当 Pi 启动时,它会自动启动 Mosquitto,因此我们想学习如何启动、停止和重新启动应用程序。
<span style="color:#000000"><span style="background-color:#fbedbb">#启动Mosquitto服务
sudo /etc/init.d/mosquitto 启动
#停止Mosquitto服务
sudo /etc/init.d/mosquitto 停止
#重启Mosquitto服务
sudo /etc/init.d/mosquitto 重启</span></span>
配置先决条件 - 安装 mqtt_spy
这也是一个可选步骤,但我发现 mqtt_spy [7]实用程序在配置/测试阶段非常有用。mqtt-spy 是一个 JavaFX 应用程序,因此理论上应该可以在任何安装了适当版本的 Java 8 的操作系统上运行。
当 mqtt_spy 首次启动时,用户会看到以下窗口,其中敏锐的观察者会注意到应用程序认为我拥有的版本不是最新的,但它是?无论如何,显示已配置连接的部分是我们主要关心的部分。该应用程序预装了几种常见的配置,例如 localhost 等。
要为我们的目的配置连接,请从主菜单中选择 Connections=>New Connection 菜单项。这将显示所显示的窗口并输入与您的配置相关的信息并以适当的名称保存。
一旦建立连接,我们就可以开始做生意了。如本教程前面所述,MQTT 协议是一个发布订阅模型,因此下面显示的窗口分为 2 个部分;顶部是发布部分,底部是订阅部分。
首先让我们通过单击新建按钮创建一个新订阅,并在弹出的对话框中输入主题信息,当您输入主题后单击订阅按钮。
接下来,我们将向我们刚刚配置的主题发布一条消息,因此在发布部分输入主题、一条消息并单击发布按钮。该消息应显示在订阅部分的数据文本框中。瞧,这就是它的全部,不是很酷吗?
如果您没有安装 mqtt_spy 实用程序,我将在本教程的其余部分中提及它,请忽略它,因为我还将提供 Mosquitto 客户端命令行命令以从 Linux 终端测试配置。配置 mqtt_spy 时,点击主窗口中的连接按钮断开连接,这将导致按钮变为红色,进行适当的更改然后再次单击连接按钮,如果连接成功,按钮将变为绿色。
配置蚊子
在接下来的部分中,我们将讨论 Mosquitto 可以配置为运行的各种方式以及我们将用于测试配置的技术。当 Mosquitto 启动时,它会在 /etc/mosquitto/conf.d 目录中查找任何带有 .conf 扩展名的文件[10],如果找到,则使用它们来配置 Mosquitto。我们将创建一个文件 /etc/mosquitto/conf.d/mosquitto.conf 并输入以下代码部分中概述的数据。
配置 Mosquitto - 没有安全性
这是没有安全性的基本配置,在端口 80 上侦听 IP 地址 localhost。使用您选择的编辑器编辑 /etc/mosquitto/conf.d/mosquitto.conf 文件,保存并重新启动 Mosquitto。
<span style="color:#000000"><span style="background-color:#fbedbb">#<span style="color:#339999">布尔</span> <span style="color:#339999">值</span>,用于确定在不提供用户名的情况下连接的客户端是否是
# 允许连接。如果<span style="color:#0000ff">设置</span>为<span style="color:#0000ff">false</span>则应创建另一种连接方式
# 控制经过身份验证的客户端访问。默认为<span style="color:#0000ff">true</span>。
allow_anonymous<span style="color:#0000ff">真</span>
#
# 在指定端口监听<span style="color:#0000ff">传入</span>的网络连接。第二个可选参数
# 允许监听器绑定到特定的 IP 地址/主机名。如果使用<span style="color:#0000ff">此</span>变量<span style="color:#0000ff">_</span>
# 并且既不使用<span style="color:#0000ff">全局</span>绑定地址也不使用端口选项,则<span style="color:#0000ff">默认</span>侦听器将
# 未启动。
# 监听端口 [绑定地址/主机]
听众<span style="color:#000080">1883 </span> <span style="color:#000080">192</span>。<span style="color:#000080">168</span> . <span style="color:#000080">254</span> . <span style="color:#000080">20</span></span></span>
测试 Mosquitto 配置 - 没有安全性
使用 mqtt_spy 实用程序,只需在服务器 URI 文本框中输入 IP 地址,应用并连接。然后转到发布/订阅窗口并输入适当的信息。
从命令行进行测试时,您需要打开 2 个窗口;一个用于发布,另一个用于下标。在端口 1883 上输入以下内容,其中 topic = 'hello/world'。
<span style="color:#000000"><span style="background-color:#fbedbb">#在发布终端窗口中
sudo mosquitto_pub -d -t hello/world -m <span style="color:#800080">'</span><span style="color:#800080">消息'</span>
#在订阅终端窗口中
sudo mosquitto_sub -d -t 你好/世界</span></span>
配置 Mosquitto - 使用密码验证
为了使用密码验证,我们需要编辑 mosquitto.conf 文件并添加 password_file 指令和 pwfile 的路径。