文档结构  
翻译进度:已翻译     翻译赏金:0 元 (?)    ¥ 我要打赏

简介

在本系列文章的第二部分中(持续更新),我们将致力于在树莓派上配置MQTT消息代理服务Mosquitto. Mosquitto 是一个轻量级的软件, 但它拥有强大的消息发布/订阅系统,并且能够运行在各种不同的平台上. 本教程中我们的目标是在树莓派2上安装、配置和测试Mosquitto,并且让它不仅能在树莓派2上发布、订阅消息也可以在其他计算机上进行.

1107378/pi2-mqtt_spy-3.png

如果你还没有阅读本教程的第一部分,关于如何加载并配置操作系统的话,你可以在这里找到这篇教程 树莓派2,第一部分 - 初始设置  或这里 Code Project . 如果你是Linux或者树莓派新手,强烈建议先阅读一下.

第 1 段(可获 1.8 积分)

本文或多或少有些记录折腾过程的意思,关于折腾树莓派上使用Mosquitto配置MQTT消息代理服务的记录. 我借鉴了《SwitchDoc Labs[3]》 教程的内容,并且针对我的特殊需求做了一些修改. 接下来的文章中我打算加入一些各种各样的模块的折腾,例如; ESP8266-12E WiFi 模块, 嵌入式芯片版(开发板)像 Arduino UNO 并且也有可能用其他的, 并且希望在今年夏天开始实施(当远足和露营太热的时候,技术宅好项目。。。).

环境配置

我为这个项目搭建的开发环境清单如下;

第 2 段(可获 1.29 积分)
  • 64位Windows7桌面操作系统,AMD-FX-8350 8核处理器,32GB内存(炫富。。。).
  • 树莓派2开发板, 搭载BCM2709 ARMv7 4-核心芯片与 1GB 内存,运行Raspian Jesse 操作系统(最新版哦). 我最初是配置使用了下载网站列表上的一个 Raspbian Jessie 的轻量版本,但是它没有GUI界面,并且后面的文章我打算使用NginX和WebSockets来展示控制不同的设备. 因此我又回来继续使用完整版本并把它附加的软件都干掉了. 树莓派上的WiFi 使用 edimax dongle  提供的WIFI模块.
  • 运行Ubuntu 12.04 LTS的虚拟机软件VirtualBox, 我最近给它做了跟树莓派一样的设置,也针对Ubuntu系统做了几处修改. 虽然我自己配置了这些东西,但我并不打算解释配置他们的过程(我不教给你,你自己百度), 这些内容将留给你作为课外锻炼(自己摸索,自己学习). 所以祝你好运吧!
第 3 段(可获 2.13 积分)

首先 - 设置静态IP

虽然这一步是可选的,但我还是强烈建议你为树莓派. 如果不设置的话,每次重新树莓派可能会获取一个不同的IP,重启树莓派的时候那么你就要一遍一遍的修改配置文件(我突然想起一句话,没完没了的夏天). 不过这对我而言是无碍的,因为我使用了一个便宜的 edimax 适配器. 不过如果你愿意等的花,你可以花2刀从ebay上买一个 802.11标准的适配器(如果你愿意等待物流送货的话). 我买了几个用起来还不错,虽然我还没决定是不是要在生产环境中使用他们.

第 4 段(可获 1.46 积分)

这里介绍的使用edimax适配器的方法应该适用于任何兼容树莓派的WIFI模块. 在修改所需要的系统配置文件之前,先让我们来收集了解一些信息.

#To display current network info type;
ifconfig

输出内容;

wlan0   Link encap:Ethernet HWaddr b8:27:eb:a8:cf:a4
        inet addr:192.168.254.20 Bcast:192.168.254.255 Mask:255.255.255.0
        UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
        RX packets:161 errors:0 dropped:0 overruns:0 frame:0
        TX packets:227 errors:0 dropped:0 overruns:0 carrier:0
        collisions:0 txqueuelen:1000
        RX bytes:26075 (25.4 KiB) TX bytes:46356 (45.2 KiB)
第 5 段(可获 0.56 积分)

网络地址(inet addr )和 子网掩码的值(Mask values)是我们要找的,我的地址是192.168.254.20 子网掩码地址是 255.255.255.0 ,这两个地址在大多数情况都是这样(指IP地址为192.168.x.x,子网掩码为255.255.x.x). 下面来看一下网关地址.

#To display network gateway address type;            
netstat -n -r

输出如下;

Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  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
第 6 段(可获 0.66 积分)

通过这些我们能拿到目标地址或者网络地址是 192.168.254.0 网关地址是 192.168.254.254, 现在我们已经准备好配置网络了。

首先我们要修改 wpa_supplicant[12] 文件。wpa_supplicant[13] 文件实现了无线网络的安全协议内容。[13]

ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
    ssid="Your SSID Here"
    psk="YourPresharedKeyHere"
}

注意这里没有空格 "network={", 这是故意这么写的(逼死某些强迫症?)。 把ssid 和 psk的值替换成你的无线网络的值,然后保存并关闭文件. 我使用 nano 编辑器编辑这些文件,要退出的话先按下 ctrl+X  然后输入 "Y" 保存并退出(而我用vim)。

第 7 段(可获 1.38 积分)

接下来我们继续来配置网络接口文件(Linux中,一切皆文件),也就是wlan0无线网络适配器。使用上面收集到的数据并把他们放在下面的文件的适当位置中。

allow-hotplug wlan0
iface default inet static
    wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf
    address 192.168.254.20
    netmask 255.255.255.0
    network 192.168.254.0
    gateway 192.168.254.254

然后重启树莓派,并用另外的电脑ping182.168.254.20或者用浏览器打开这个地址(哪种方法都行,主要确定网络是否畅通,设置是否生效)。 IceWeasel, 预装在 Jessie 上的火狐浏览器分支版. 如果一切照计划进行那么现在设备应该是在线的了,如果不行就查看上面的步骤然后百度+谷歌找到适合你的硬件配置的解决办法。

第 8 段(可获 1.34 积分)

安装 Mosquitto

安装 Mosquitto 是相当简单的(就像windows下闭着眼点击下一步一样?),为了测试我们将使用1883端接口配置Mosquitto代理, 默认是 80 端口。

在树莓派上打开终端窗口并输入以下命令(复制&黏贴)

sudo wget http://repo.mosquitto.org/debian/mosquitto-repo.gpg.key
sudo apt-key add mosquitto-repo.gpg.key
cd /etc/apt/sources.list.d/
sudo wget http://repo.mosquitto.org/debian/mosquitto-jessie.list
sudo apt-get update
sudo apt-get install mosquitto mosquitto-clients
  1. wget[4] 代表 "web 请求",weget 是一个实用程序,它可以递归从网站上下载文件和目录结构. 这里我们要获取一个 GPG 文件, Gnu Privacy Guard密钥,允许提供商使用多功能密钥系统加密和签名您的数据和通信。
  2. apt-key[3] 是apt用来管理密钥列表的, 一些高级的封装工具需要验证包信息。
  3. 变更当前目录用于apt下载代码库。
  4. 获取代码库文件, 通过使用一个下载链接来提供包路径。
  5. 使用 apt-get[5] 更新 apt 信息。
  6. 最后安装 Mosquitto 和客户端. 客户端里有 mosquitto_pub 和 mosquitto_sub 工具. 我们将在测试阶段使用他们!
第 9 段(可获 2.13 积分)

如果一切按步骤进行,那么上述步骤完成后,Mosquitto就安装好了,默认情况下它也已经启动。因为我们需要再对它进行配置,所以先要停止运行它。参考下一节学习如何停止Mosquitto。

启动/停止 Mosquitto

当树莓派启动时Mosquitto随系统同时启动,因此我们需要知道如何启动、停止和重启Mosquiitto。

#To start the Mosquitto service
sudo /etc/init.d/mosquitto start
#To stop the Mosquitto service
sudo /etc/init.d/mosquitto stop
#To restart the Mosquitto service
sudo /etc/init.d/mosquitto restart
第 10 段(可获 0.81 积分)

配置前提 - 安装 mqtt_spy

这一步同样是可选的,不过我发现 mqtt_spy[7] 工具在配置/测试阶段简直是无价之宝(原文就是这么写的)。mqtt-spy 是一个 JavaFX 应用, 所以理论上可以在任何安装了Java 8 的操作系统上运行。

当 mqtt_spy 首次启动时,会展示下面的窗口给用户,细心的用户可能会发现下面报了个错,说我的版本不是最新?(我tm可是刚刚才下载的), 真的么? 随便啦,反正显示连接配置的部分是我们需要关心的。它默认预加载了几种常见的配置例如localhost等。

第 11 段(可获 1.45 积分)

1107378/pi2-mqtt_spy-0.png

要配置一个连接的话,单击连接( Connections)=>新连接(New Connection )。 然后会显示下面的窗口 ,输入适当信息并起一个合适的名字然后保存。

1107378/pi2-mqtt_spy-1.png

一旦建立连接成功,我们就可以愉快的玩耍了。之前我们说过MQTT 协议是一种发布/订阅的类型,因此下面的窗口分割为两部分; 上面是发布部分,下面是订阅部分。

首先点击New按钮来建立一个订阅者,然后输入在弹出的对话框输入topic信息, 输入完成后点击订阅按钮。

第 12 段(可获 1.53 积分)

接下来我们要发布一个消息给刚刚配置好的话题(topic),在发布区域输入话题(topic)名称,信息并点击发布按钮. 消息将在订阅者区域的文本框中显示. 就酱, 酷不酷? 快说

1107378/pi2-mqtt_spy-2.png

本教程的剩余部分,我将介绍下mqtt_spy这个工具,如果你没安装或者忽略安装了的话(都跟你说了这是无价之宝了),我也会提供Mosquitto客户端命令行的测试配置信息。 当要配置 mqtt_spy 时点击主窗口的连接按钮断开连接(要接线,先断电), 这样的话按钮就会变成红色, 设置完成之后再次点击连接按钮,连接成功的话按钮就会变成绿色。

第 13 段(可获 1.78 积分)

配置 Mosquitto

下一节我们将讨论配置Mosquitto的不同的方式和测试配置的技巧。当Mosquitto启动时,它在/etc/mosquitto/conf.d目录中查找具有.conf扩展名的任何文件[10],如果找到就使用它们配置Mosquitto. 我们将创建一个文件 /etc/mosquitto/conf.d/mosquitto.conf  然后输入以下代码部分中概述的数据。

配置不使用安全选项的 Mosquitto

这是最基本的不适用安全选项的配置方式, 在本地地址监听80端口。 编辑配置文件/etc/mosquitto/conf.d/mosquitto.conf , 用你爱的编辑器..., 保存并 Mosquitto。

第 14 段(可获 1.51 积分)

测试 Mosquitto 配置 - 不使用安全选项

使用 mqtt_spy 工具只需要在服务URI文本框中输入IP地址, 然后点击应用和连接按钮. 然后打开发布/订阅( pub/sub )窗口并输入适当的命令。

当在命令行下测试时需要打开两个窗口; 一个发布一个订阅. 并输入以下命令。

#In the publish terminal window
sudo mosquitto_pub -d -t hello/world -m 'The message'
                
#In the subscribeterminal window
sudo mosquitto_sub -d -t hello/world
第 15 段(可获 0.84 积分)

配置Mosquitto - 使用密码认证

要使用密码认证,需要编辑 mosquitto.conf  文件,并且要把pwfile路径添加到password_file指令中.

# Boolean value that determines whether clients that connect without providing a username are 
# allowed to connect. If set to false then another means of connection should be created to 
# control authenticated client access. Defaults to true. 
allow_anonymous false
#
# Listen for incoming network connection on the specified port. A second optional argument 
# allows the listener to be bound to a specific ip address/hostname. If this variable is used 
# and neither the global bind_address nor port options are used then the default listener will 
# not be started.
#listener port [bind address/host]
listener 1883 192.168.254.20
#
# Set the path to a password file. If defined, the contents of the file are used to control 
# client access to the broker. The file can be created using the mosquitto_passwd(1) utility.
# If mosquitto is compiled without TLS support (it is recommended that TLS support is 
# included), then the password file should be a text file with each line in the format 
# "username:password", where the colon and password are optional but recommended. 
# If allow_anonymous is set to false, only users defined in this file will be able to connect. 
# Setting allow_anonymous to true when password_fileis defined is valid and could be used with 
# acl_file to have e.g. read only guest/anonymous accounts and defined users that can publish.
#password_file file path
password_file /etc/mosquitto/pwfile
第 16 段(可获 0.41 积分)

下一步我们需要使用 mosquitto_passwd 工具创建 pwfile文件, 在终端输入命令.

sudo mosquitto_passwd -c /etc/mosquitto/pwfile username

执行命令时会要求输入密码并且有确认执行提示.

Mosquitto 使用密码认证做测试

打开 mqtt_spy 选择菜单项 Connections=>Manage Connections, 然后选择 Security 选项卡, 然后 User auth. 选项卡. 打开启用用户认证复选项,并输入之前配置pwfile文件时配置过的用户密码. 然后连接并配置 pub/sub 信息.

第 17 段(可获 1.1 积分)

在 pub/sub 终端中输入以下命令;

#In the publish terminal window
sudo mosquitto_pub -d -t hello/world -p 1883 -u 'username' -P 'password' -m 'The message'
                
#In the subscribeterminal window
sudo mosquitto_sub -d -t hello/world -p 1883 -u 'username' -P 'password'

总结

我觉得折腾 Mosquitto 还是比较简单的, 并且它功能强大、拥有丰富的文档教程、可以让你在短时间内就对它有只管的认识了解(安装和配置好Mosquitto).  跟着这个教程做几次之后脑子里就有印象了, 因此我的想法是在接下来的文章中使用Mosquitto, 并且我的最终目标是, 用它来完成家庭物联网系列项目 .

参考内容

[1] mosquitto.org, Mosquitto, 一个开源消息代理 MQTT v3.1/v3.1.1 
[2] raspberry.org, Raspbian Jesse 轻量版
[3] switchdoc.com, 教程: 在树莓派上安装和测试物联网项目 / MQTT
[4] computerhope.com, Linux 、Unix wget 命令
[5] man.he.net, apt-key 参考
[6] help.ubuntu.com, Apt-Get
[7] github.com, mqtt_spy
[8] jeffgeerling, 在树莓派的Jessie 操作系统中配置静态IP
[9] mosquitto.org, 文档
[10] mosquitto.org, conf file 文档
[11] modmpi.com, 教程 - 如何为树莓派设置静态IP
[12] wi.fi,  wpa_配置示例文件
[13] wikipedia.org, wpa_supplicant
[14] github.com, kamilfb/mqtt_spy

第 18 段(可获 2.54 积分)

文章评论