MQTT是一个基于客户端-服务器的消息发布/订阅传输协议,提供一对多的消息发布,解除应用程序耦合。MQTT协议是轻量、简单、开放和易于实现的。对负载内容屏蔽的消息传输。使用 TCP/IP 提供网络连接等。这些特点使它适用范围非常广泛。在很多情况下,包括受限的环境中,如:机器与机器(M2M)通信和物联网(IoT)。其在通过卫星链路通信传感器、偶尔拨号的医疗设备、智能家居、及一些小型化设备中已广泛使用。
环境搭建
以我的Linux版本CentOS 7.6 64bit
安装相关的插件软件:
1、安装gcc插件:yum install gcc-c++
2、安装跨平台的安装(编译)工具Cmake:yum install cmake
3、安装连接库openssl-devel:yum install openssl-devel
下载Mosquitto
为了方便我们后维护和文件管理,可以先创建一个mqtt文件:mkdir mqtt
cd ./mqtt进入刚新建的文件目录下:
下载mosquitto:wget http://mosquitto.org/files/source/mosquitto-1.6.8.tar.gz
解压:tar -zxvf mosquitto-1.6.8.tar.gz,解压后先不进行编译安装mosquitto。
扩展软件安装(可以不安装,不影响MQTT Mosquitto使用):
1、安装c-areas
# 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
2、安装lib-uuid
# yum install libuuid-devel
3、安装libwebsockets
# 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 mosquitto-1.6.8进入mosquitto-1.6.8目录下:输入以下命令
make
sudo make install
注:如果在后续步骤提示找不到libmosquitto.so.1,在/mqtt目录下输入以下指令修改一下libmosquitto.so的位置:
sudo ln -s /usr/local/lib/libmosquitto.so.1 /usr/lib/libmosquitto.so.1
sudo ldconfig
启动测试:(这里我们可以重新打开一个新的命令窗口)
sudo groupadd mosquitto
sudo useradd -g mosquitto mosquitto
程序配置:
mv /etc/mosquitto/mosquitto.conf.example /etc/mosquitto/mosquitto.conf
启动程序:
mosquitto -c /etc/mosquitto/mosquitto.conf -d
如果没有提示错误,那就说明成功了。
尝试匿名发布订阅主题(无需账号、密码)
订阅:mosquitto_sub -t mqtt
发布:mosquitto_pub -t mqtt -h localhost -m "hello mqtt!"
注:订阅和发布的主题要相同。
修改默认配置:
修改mosquitto.conf文件,关闭匿名登录使用。
cd ./mosquitto-1.6.8进入mosquitto-1.6.8目录下:输入以下命令:
打开mosquitto.conf文件:vim /etc/mosquitto/mosquitto.conf
点击键盘“插入”进入编辑状态。
找到allow_anonymous,去掉前面的#,改为false。找到password_file配置保存用户密码的文件存放路径。按下图修改即可。
修改mosquitto.conf文件
修改后点击键盘“退出”,输入命令:“:wq!”回车保存修改。
创建自定义用户名、密码
输入命令:mosquitto_passwd -c /etc/mosquitto/pwfile.example 用户名
根据提示输入密码和二次确认密码即可。
重启mosquitto让文件生效
关闭程序:kill -9 $(pidof mosquitto)
运行程序:mosquitto -c /etc/mosquitto/mosquitto.conf -d
此时再用如下命令发布订阅:
订阅:mosquitto_sub -t mqtt
发布:mosquitto_pub -t mqtt -h localhost -m "hello mqtt!"
你会发现不能连接:Could not connect: CONNECTION_REFUSED_NOT_AUTHORIZED
出现这个情况是因为修改了上述文件,不能匿名使用了。
正确订阅:mosquitto_sub -h localhost -t test -u "用户名" -P "密码"
正确发布:mosquitto_pub -h localhost -t test -m "测试" -u "用户名" -P "密码"
一般先启动订阅者,再启动发布者。
默认端口:1883
一般我们服务器防火墙是没有打开1883端口的,如果没有开放1883端口安全组,上面命令订阅发布在服务器本地是可以正常使用的,但不能远程连接使用。
打开防火墙中的端口1883:
打开新的服务器连接窗口输入以下命令:
添加端口:firewall-cmd --zone=public --add-port=1883/tcp --permanent
重载:firewall-cmd --reload
注:到这里你可能还不能远程连接使用
你还需在你服务器的所属云服务商(例如:阿里云、腾讯云、华为云等),登录云服务商平台,为你的服务器添加安全组,开放进出端口:1883
到此就可以了。如下图:
本地远程连接服务器订阅主题
服务器订阅主题
发布主题
#Linux# #mqtt# #Mosquitto#