在嵌入式x86上构建我的智能家居(home assistant) (一)中安装了homeassistant系统。

home assistant中可以使用MQTT交换数据。

此篇安装MQTT服务。

关于MQTT参考

MQTT协议报文格式解析 - 知乎一、概述MQTT是一个客户端服务端架构的发布/订阅模式的消息传输协议。v3.1.1版本协议仅仅包含14个协议帧,它格式简单、规范且易于实现,非常适合物联网场景使用。 本文开始梳理MQTT协议的报文格式。官方的协议文档…

home assistant 安装 samba share homeassistant可以安装在哪些设备上?_服务器

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已经被正确配置。