MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议)
目前MQTT代理的主流平台有下面几个:
Mosquitto:https://mosquitto.org/
VerneMQ:https://vernemq.com/
EMQTT:http://emqtt.io/
这里我们选择mosquitto开源项目。
1 下载和编译mosquitto
这里我们主要讲解Linux Ubuntu系统安装Mosquitoo,其他平台请参考官方https://mosquitto.org说明。
1.1 安装mosquitto所需要依赖
sudo apt-get install uuid-dev
1.2 下载和编译安装源码包下载
wget https://mosquitto.org/files/source/mosquitto-2.0.15.tar.gz
解压源码
tar -zxvf mosquitto-2.0.15.tar.gz
cd mosquitto-2.0.15
编译与安装源码
make
sudo make install
1.3 编译过程中可能遇到的问题:
1.3.1编译找不到openssl/ssl.h或者报链接错误
【解决方法】——安装openssl,并且要注意版本,比如安装1.1.1a (我之前本地安装的1.1.1g版本不行,tag时间 21 Apr 2020)
git clone https://gitee.com/mirrors/openssl.git
cd openssl
git checkout OpenSSL_1_1_1a
./config
make
sudo make install
sudo ldconfig
$ openssl version
OpenSSL 1.1.1a 20 Nov 2018
覆盖已有的openssl版本,最后做备份
这一步很凶险(覆盖原有的openssl版本),如果是虚拟机请先创建快照,如果是云服务器也先在web控制台创建快照。`
sudo cp -arf /usr/local/lib/libcrypto.* /usr/lib/x86_64-linux-gnu/
sudo cp -arf /usr/local/lib/libssl.* /usr/lib/x86_64-linux-gnu/
然后在mqtt目录,一定要先make clean,再重新make。
1.3.2 编译过程找不到ares.h
sudo apt-get install libc-ares-dev
1.3.3 编译过程找不到uuid/uuid.h
sudo apt-get install uuid-dev
1.3.4 编译过程找不到: cjson/cJSON.h
git clone https://github.com/DaveGamble/cJSON.git
cd cJSON
make
sudo make install
1.3.5 使用过程中找不到libmosquitto.so.1error while loading shared libraries: libmosquitto.so.1: cannot open shared object file: No such file or directory
sudo ln -s /usr/local/lib/libmosquitto.so.1 /usr/lib/libmosquitto.so.1
【解决方法】——修改libmosquitto.so位置
创建链接
更新动态链接库
sudo ldconfig
2 匿名登录测试
2.1 启动服务器、开启发布、订阅终端
首先打开三个终端,
启动代理服务:mosquitto -v
-v 详细模式 打印调试信息
默认占用:1883端口
订阅主题:mosquitto_sub -v -t hello
-t 指定订阅的主题,主题为:hello
-v 详细模式 打印调试信息
发布内容:mosquitto_pub -t hello -m world
-t 指定订阅的主题,主题为:hello
-m 指定发布的消息的内容
发布内容后,在订阅主题窗口收到打印
2.2 启动服务端时指定配置文件
上面使用的都是默认配置,如需修改服务器的配置信息需要修改:mosquitto源码目录下的配置文件mosquitto.conf 或者/etc/mosquitto/mosquitto.conf文件在启动服务器时使用命令:mosquitto -c mosquitto.conf -d(在mosquitto安装目录下)这里-d是后台运行。
3 mosquitto用户名密码配置
基于Mosquitto服务器已经搭建成功,大部分都是采用默认的是允许匿名用户登录模式,正式上线的系统需要进行用户认证。
3.1 用户参数说明
Mosquitto服务器的配置文为/etc/mosquitto/mosquitto.conf,关于用户认证的方式和读取的配置都在这个文件中进行配置。
allow_anonymous 允许匿名
password_file密码文件
acl_file 访问控制列表
3.2 修改mosquitto.conf
先拷贝mosquitto.conf.example一份为mosquitto.conf
修改后比如
#不允许匿名
allow_anonymous false
#配置用户密码文件
password_file /etc/mosquitto/pwfile
#配置topic和用户
acl_file /etc/mosquitto/aclfile
3.3 添加用户信息
添加用户名 0voice_mqtt, 密码123456 (自己根据实际情况修改用户名和密码,这里只是演示)
sudo mosquitto_passwd -c /etc/mosquitto/pwfile 0voice_mqtt
按提示输入 0voice_mqtt对应的密码即可。
自动生成密码文件:/etc/mosquitto/pwfile , 对应mosquitto.conf配置的“password_file /etc/mosquitto/pwfile”路径。
3.4 添加topic和用户的关系
先创建aclfile
sudo cp aclfile.example aclfile
在该文件末尾添加以下内容
user 0voice_mqtt
# write发布权限, mtpic/#代表mtopic这个前缀的主题, 以/分割前缀/#
topic write mtopic/#
# read订阅权限, mtpic/#代表mtopic这个前缀的主题, 以/分割前缀
user 0voice_mqtt
topic read mtopic/#
比如主题
mtopic
mtopic/1
mtopic/2
mtopic/1/2
等
3.5 用户认证测试
重启Mosquitto
通过Ctrl+C关闭mosquitto,然后通过下面命令启动Mosquitto
mosquitto -v -c /etc/mosquitto/mosquitto.conf
(订阅端)客户端启动:
mosquitto_sub -h 127.0.0.1 -t mtopic -u 0voice_mqtt -P 123456
可以订阅多个主题
mosquitto_sub -h 127.0.0.1 -t mtopic -t mtopic/1 -u 0voice_mqtt -P 123456
(发布者)客户端启动:
mosquitto_pub -h 127.0.0.1 -t mtopic -u 0voice_mqtt -P 123456 -m "test, you canreceive"
可以发布给多个主题
mosquitto_pub -h 127.0.0.1 -t mtopic -t mtopic/1 -u 0voice_mqtt -P 123456 -m"test, you can receive"
即是如果需要发布多个主题则多个 -t mtopic -t mtopic/1
4 参考
mosquitto --用户配置 及权限管理 https://www.cnblogs.com/saryli/p/9820532.html
MQTT服务器搭建--Mosquitto用户名密码配置