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配置保存用户密码的文件存放路径。按下图修改即可。

mqtt服务器搭建(如何搭建自己的mqtt服务器)(1)

修改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

到此就可以了。如下图:

mqtt服务器搭建(如何搭建自己的mqtt服务器)(2)

本地远程连接服务器订阅主题

mqtt服务器搭建(如何搭建自己的mqtt服务器)(3)

服务器订阅主题

mqtt服务器搭建(如何搭建自己的mqtt服务器)(4)

发布主题

#Linux# #mqtt# #Mosquitto#