MQTT是基于客户端-服务器的消息发布/订阅传输协议,在IoT的应用上比较广泛,主要有几个特点:
1、使用发布/订阅的传输模式,实现1对多的发布与接收,减少应用之间耦合度
2、能够对负载内容屏蔽传输,
3、支持订阅、发布不同账号,实现读写权限分离,确保数据发布安全
4、通过TCP/IP提供网络连接,实现方便,支持安全策略控制
5、协议头部长度短,网络传输开销小,节约流量
6、支持三种消息质量模式:
最多一次,只发送一次消息,不关注消息是否接受成功
至少一次,保证消息一定到达,单会有重复
只有一次,保证消息只有一次到达
7、通过last will和testament等特性通知客户端异常中断
一、安装
yum install gcc-c++
yum install cmake
yum install openssl-devel
新建个mqtt文件夹,下载mosquitto,下个不高不低的版本,并解压:
mkdir mqtt
cd mqtt
wget http://mosquitto.org/files/source/mosquitto-1.4.10.tar.gz
tar -xzvf mosquitto-1.4.10.tar.gz
但这里还不能编译安装mosquitto
下面的三款扩展性软件,不安装也不影响mosquitto的使用:
安装c-areas(支持异步DNS查找的库):
[root@localhost build]# cd /usr/local/mqtt
wget http://c-ares.haxx.se/download/c-ares-1.10.0.tar.gz
tar xvf c-ares-1.10.0.tar.gz
cd c-ares-1.10.0
./configure
make
sudo make install
安装lib-uuid(支持为每个连接客户端生成唯一uuid):
yum install libuuid-devel
安装libwebsockets(支持需使用websocket的应用):
[root@localhost build]# cd /usr/local/mqtt
wget https://github.com/warmcat/libwebsockets/archive/v1.3-chrome37-firefox30.tar.gz
tar zxvf v1.3-chrome37-firefox30.tar.gz
cd libwebsockets-1.3-chrome37-firefox30
mkdir build
cd build
cmake .. -DLIB_SUFFIX=64
make install
修改一下mosquitto的配置:
cd /usr/local/mqtt/mosquitto-1.4.10
vim config.mk
将里面的WITH_SRV:=yes和WITH_UUID:=yes都用#号注释掉
接下来编译安装mosquitto:
make
sudo make install
注意:如果在后续使用过程中找不到libmosquitto.so.1的话,在software下输入以下指令修改一下libmosquitto.so的位置:
sudo ln -s /usr/local/lib/libmosquitto.so.1 /usr/lib/libmosquitto.so.1
sudo ldconfig
二、启动测试
1、创建用户:
sudo groupadd mosquitto
sudo useradd -g mosquitto mosquitto
这里要是出现什么存在不存在的问题,一定是你copy错了
2、程序配置:
mv /etc/mosquitto/mosquitto.conf.example /etc/mosquitto/mosquitto.conf
启动程序:
mosquitto -c /etc/mosquitto/mosquitto.conf -d
默认端口为1883
3、测试,最后我们再打开一个服务器窗口,在一个(订阅)窗口输入:
mosquitto_sub -t hello
另一个(发布)窗口输入:
mosquitto_pub -t hello -h localhost -m "hello world"
三、mqtt安全设置
1、配置账户密码
Mosquitto服务器的配置文件为/etc/mosquitto/mosquitto.conf,关于用户认证的方式和读取的配置都在这个文件中进行配置。
配置文件内容
[root@localhost ~]# vi /etc/mosquitto/mosquitto.conf
不允许匿名用户
allow_anonymous false
配置用户密码文件
password_file /etc/mosquitto/pwfile
修改默认端口
port 20885
配置topic(话题)和用户
acl_file /etc/mosquitto/aclfile
保存退出,返回命令行
重建mqtt账号cpsmqtt,用于读写分离
mosquitto_passwd -c /etc/mosquitto/pwfile cpsmqtt
输入密码
Cps123.
重建mqtt账号cpsread,用于读写分离,注意第二次创建用户时不用加 -c 如果加 -c 会把第一次创建的用户覆盖。
mosquitto_passwd /etc/mosquitto/pwfile cpsread
输入密码
Cpsread123.
重启mosquitto
[root@localhost ~]# ps -ef|grep mosquitto
[root@localhost ~]# kill -9 进程号
启动
mosquitto -c /etc/mosquitto/mosquitto.conf -d
提示没有1595821445: Error opening acl file "/etc/mosquitto/aclfile".
创建一个,这里复制已有的改改
cp /etc/mosquitto/aclfile.example /etc/mosquitto/aclfile
屏蔽无用的,新增
user cpsmqtt
topic write cps/#
user cpsread
topic read cps/#
继续重启mosquitto -c /etc/mosquitto/mosquitto.conf -d
四、防火墙
firewall-cmd --zone=public --add-port=20885/tcp --permanent
firewall-cmd --reload
五、连接测试
(订阅端)客户端(用户名,密码)启动
mosquitto_sub -h IP地址 -t cps/1 -u cpsread -P Cpsread123. -k keepalive -p 20885
(发布者)客户端启动:
mosquitto_pub -h IP地址 -t cps/1 -u cpsmqtt -P Cps123. -m "test" -p 20885