关于mqtt
mqtt是一个物联网常用的通讯协议,他的核心玩法跟http的不同,mqtt称为订阅与发布:
-
订阅:客户端向服务器端登记要订阅某主题,后续有以该主题发布的消息时,服务器端就会主动转发给该客户端
-
发布:客户端向服务器端发送一条消息,并说明要发布的主题,服务器就会将该消息转发给所有订阅了该主题的客户端
这里我们要安装配置一款mqtt服务器端软件mosquitto
,他由eclipse推出,开源
安装
- 使用apt直接安装
sudo apt install mosquitto
- 启用mosquitto,然后他会开机自启
sudo service mosquitto start
命令行收发测试
- 安装一个命令行版的mqtt客户端
sudo apt install mosquitto-clients
- 运行以下命令,订阅主题,有新信息就输出
-
-v
有信息就打印 -
-h 127.0.0.1
指定mqtt服务器的ip地址 -
-t "a/#"
订阅主题 a/#
mosquitto_sub -v -h 127.0.0.1 -t "a/#"
- 再打开一个新的命令行终端,运行以下命令发布一条信息
-
-h 127.0.0.1
指定mqtt服务器的ip地址 -
-t "a/#"
发布的主题 a/# -
-m "内容"
发布的内容
mosquitto_pub -h 127.0.0.1 -t "a/111" -m "内容"
测试结果如下:
配置mosquitto
1 基础配置文件
在/etc/mosquitto/conf.d/
路径下创建一个文件,比如my.conf
sudo vim /etc/mosquitto/conf.d/my.conf
在文件内存放如下内容
#修改端口
port 1800
# 不允许匿名访问,需要提供 用户名&密码 才能连接服务器
allow_anonymous false
# 指定要使用的 用户名&密码 文件,需手动创建该文件
password_file /etc/mosquitto/pwfile
# 指定权限控制文件存放路径,需手动创建该文件
acl_file /etc/mosquitto/aclfile
2 创建mqtt用户
客户端连接服务器时需要使用 用户名&密码,不是使用你linux系统的账户。
- 创建用于存放密码的文件,这个路径是刚刚的
my.conf
指定的
sudo touch /etc/mosquitto/pwfile
- 使用mosquitto_passwd命令来创建账号。以下命令的功能是创建
aaa
这个用户,输入命令后会要求你输入密码。
sudo mosquitto_passwd /etc/mosquitto/pwfile aaa
3 设置各用户的权限
使用vim创建并打开这个文件,这个路径是刚刚的my.conf
指定的
sudo vim /etc/mosquitto/aclfile
权限文件示例如下,a/#代表以a/开头的所有主题,如a/test,a/b/c/d
#用户 aaa
#可以订阅与发布 a/#
#只能订阅 b/#
#只能发布 n/#
user aaa
topic a/#
topic read b/#
topic write c/#
#用户bbb只能发布 b/#
user bbb
topic write b/#
#所有用户都可以发布hhh/#
pattern write hhh/#
4 重启服务使配置生效
sudo service mosquitto restart
命令行收发mqtt测试
因为我们修改了端口,创建了用户,所以这次的命令长了一点
- 运行以下命令,订阅主题,有新信息就输出
-
-v
有信息就打印 -
-h 127.0.0.1
指定mqtt服务器的ip地址 -
-p 1800
指定端口 -
-u aaa
登陆用户 -
-P 123
登陆密码 -
-t "a/#"
订阅主题 a/#
mosquitto_sub -v -h 127.0.0.1 -p 1800 -u aaa -P 123 -t "a/#"
- 再打开一个新的命令行终端,运行以下命令发布一条信息
-
-h 127.0.0.1
指定mqtt服务器的ip地址 -
-p 1800
指定端口 -
-u aaa
登陆用户 -
-P 123
登陆密码 -
-t "a/#"
发布的主题 a/# -
-m "内容"
发布的内容
mosquitto_pub -h 127.0.0.1 -p 1800 -u aaa -P 123 -t "a/111" -m "内容"
测试情况如下图: