在嵌入式x86上构建我的智能家居(home assistant) (一)中安装了homeassistant系统。
home assistant中可以使用MQTT交换数据。
此篇安装MQTT服务。
关于MQTT参考
MQTT协议报文格式解析 - 知乎一、概述MQTT是一个客户端服务端架构的发布/订阅模式的消息传输协议。v3.1.1版本协议仅仅包含14个协议帧,它格式简单、规范且易于实现,非常适合物联网场景使用。 本文开始梳理MQTT协议的报文格式。官方的协议文档…
https://zhuanlan.zhihu.com/p/429891532安装mosquitto
apt-cache search mosquitto
sudo apt install mosquitto mosquitto-clients mosquitto-dev -y
安装后自动创建mosquitto账户作为mosquitto的操作账户。
常规配置
在使用之前,我们需要对mosquitto进行一些配置。首先打开配置文件
# vim.tiny /etc/mosquitto/mosquitto.conf
在文件中找到如下内容并按要求修改。
# 端口号设置
listener 1883
# 配置pid文件路径
pid_file /run/mosquitto/mosquitto.pid
# 消息持久存储
persistence true
persistence_location /var/lib/mosquitto/
# 日志文件
log_dest file /var/log/mosquitto/mosquitto.loginclude_dir /etc/mosquitto/conf.d
# 禁止匿名访问
allow_anonymous false
# 认证配置
password_file /etc/mosquitto/pwfile
# 权限配置
acl_file /etc/mosquitto/aclfile没有则创建文件
touch /etc/mosquitto/pwfile
设置用户名和密码
什么是密码文件
用来把需要访问mosquitto的用户名和密码放到单个文件中。当只有少量用户使用mosquitto时,这是一种有效的验证方法。
服务开启后,输入如下命令,根据提示输入两遍密码
mosquitto_passwd /etc/mosquitto/pwfile 用户名
创建密码文件并新增用户
生成一个名为mqtt,密码也为mqtt的用户。
$ mosquitto_passwd -c /etc/mosquitto/pwfile mqtt
执行该语句后需要两次输入密码。
再增加一个名为mqtt1,密码也为mqtt1的用户。
$ mosquitto_passwd /etc/mosquitto/pwfile mqtt1
执行该语句后需要两次输入密码。
创建角色权限
新增一个aclfile文件.
$ touch /etc/mosquitto/aclfile
在里面写入如下内容
# mqtt只能读取以test为前缀的topic消息
user mqtt
topic read test/#
# mqtt1只能往以test为前缀的topic中发消息
user mqtt1
topic write test/#
执行mosquitto 2
在mosquitto用户下,执行如下命令,可启动mosquitto。其中:
-c 指定配置文件
-d 后台运行
# su - mosquitto
$ mosquitto -c /etc/mosquitto/mosquitto.conf -d
systemctl start mosquitto
启动后程序应阻塞在控制台中。
- 查看运行状态
systemctl status mosquitto
- 开启/关闭
systemctl start/stop mosquitto
测试mosquitto 2
mosquitto在安装后,自带了两个小程序,一个是订阅端mosquitto_sub,一个是发布端mosquitto_pub。下面我们先启动订阅端,再使用发布端发布消息。
mosquitto_sub
执行如下命令
# su - mosquitto
$ mosquitto_sub -h 127.0.0.1 -p 1883 -t "test/#" -u mqtt -P mqtt -i "sub1"
参数含义如下:
-h mosquitto服务器地址。
-p mosquitto服务器端口号。
-t 需要发布的topic,此处需要匹配订阅端的topic通配符,否则订阅端无法接收。
-u 之前在aclfile中配置过的用户名,注意需要有write权限。
-P 用户名对应的密码,之前在pwfile中配置过。
-i 客户端id,这个字符串在mosquitto服务器中务必唯一。若不加该参数,mosquitto会默认给你唯一id。
启动后程序应阻塞在控制台中。
mosquitto_pub
执行如下命令
# su - mosquitto
$ mosquitto_pub -h 127.0.0.1 -p 1883 -t "test/iot" -u mqtt1 -P mqtt1 -i "pub1" -m "temp:36,humi:75"
参数含义如下:
-h mosquitto服务器地址。
-p mosquitto服务器端口号。
-t 需要发布的topic,此处需要匹配订阅端的topic通配符,否则订阅端无法接收。
-u 之前在aclfile中配置过的用户名,注意需要有write权限。
-P 用户名对应的密码,之前在pwfile中配置过。
-i 客户端id,这个字符串在mosquitto服务器中务必唯一。若不加该参数,mosquitto会默认给你唯一id。
-m 发送的内容正文。在例子中假设temp是温度,humi是湿度。
发布完成后,mosquitto_pub会立刻返回,mosquitto_sub的控制台应显示收到的消息:
若能正常收到消息,则说明mosquitto已经被正确配置。