在默认情况下,CentOS 7没有mosquitto程序包。首先我们将安装一个额外的软件软件包,即Epel。这个存储库囊括了安装在CentOS、RedHat和其他面向企业的Linux发行版上的附加软件。
使用yum包管理器来安装epel-release包。
sudo yum -y install epel-release
这条命令会将Epel存储库信息添加到我们的系统中,-y选项在整个过程中对一些提示自动回答“是”。现在我们可以安装mosquitto包。
sudo yum -y install mosquitto
这个包附带了一个简单的默认配置,所以让我们运行它来测试我们的安装。
sudo systemctl start mosquitto
我们还需要启用服务,以确保它在重新启动系统时启动:
sudo systemctl enable mosquitto
现在让我们测试默认配置。mosquitto包附带了一些MQTT客户端命令行。我们将使用其中一个订阅代理上的主题。
主题是您发布消息并订阅的标签。它们按等级排列,你可以有sensors/outside/temp和sensors/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,不要关闭其他终端哦,后面我们还要进行测试。
Mosquitto包含一个工具,用于生成一个特殊的密码文件,名为mosquitto_passwd。此工具将提示您输入指定用户名的密码,并将结果放在/etc/mosquitto/passwd.
sudo mosquitto_passwd -c /etc/mosquitto/passwd sammy
现在,我们将替换默认的配置文件,并告诉Mosquito使用这个密码文件来要求所有连接的登录。首先,删除现有的mosquitto.conf.
sudo rm /etc/mosquitto/mosquitto.conf
现在打开一个新的空配置。
sudo vi /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加密来修复这个问题。