不看后悔系列之一篇搞懂LinuxCentOS搭建MQTT服务器及客户端操作使用

简介: linux CentOS上搭建MQTT服务器并不难,主要就是用到了mosquitto这款消息代理服务软件。其采用发布/订阅模式传输机制,轻量、简单、开放并易于实现,被广泛应用于物联网之中。

摘要:

linux CentOS上搭建MQTT服务器并不难,主要就是用到了mosquitto这款消息代理服务软件。其采用发布/订阅模式传输机制,轻量、简单、开放并易于实现,被广泛应用于物联网之中。

MQTT是基于客户端-服务器的消息发布/订阅传输协议,在IoT的应用上比较广泛,主要有几个特点:

 1. 使用发布/订阅的传输模式,实现1对多的发布与接收,减少应用之间耦合度
 2. 能够对负载内容屏蔽传输。
 3. 支持订阅、发布不同账号,实现读写权限分离,确保数据发布安全
 4. 通过TCP/IP提供网络连接,实现方便,支持安全策略控制
 5. 协议头部长度短,网络传输开销小,节约流量
 6. 支持三种消息质量模式:
 7. 最多一次,只发送一次消息,不关注消息是否接受成功
 8. 至少一次,保证消息一定到达,单会有重复
 9. 只有一次,保证消息只有一次到达
 10. 通过last will和testament等特性通知客户端异常中断

我的linux版本为CentOS Linux release 7.9.2009 (Core)

一、安装软件

1.1 输入以下指令

yum install gcc-c++
yum install cmake
yum install openssl-devel

1.2、新建文件

新建个software文件夹,下载mosquitto,下个不高不低的版本,并解压:

mkdir software
cd software
wget http://mosquitto.org/files/source/mosquitto-1.4.10.tar.gz
tar -xzvf mosquitto-1.4.10.tar.gz

但这里还不能编译安装mosquitto

下面的三款扩展性软件,不安装也不影响mosquitto的使用:

1.4、安装c-areas(支持异步DNS查找的库)

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

1.5、安装lib-uuid(支持为每个连接客户端生成唯一uuid)

yum install libuuid-devel

1.6、安装libwebsockets(支持需使用websocket的应用)

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

但是我在执行cmake … -DLIB_SUFFIX=64的时候报了一个错误:

CMake Error: The source directory "*" does not appear to contain CMakeLists.txt.

如果想解决看这篇文章:解决CMake Error: The source directory “*” does not appear to contain CMakeLists.txt.

上面这个问题不处理也没事,并无大碍,只不过没有相应的功能。

1.7、修改mosquitto的配置

我们修改一下mosquitto的配置:

cd mosquitto-1.4.10
vim config.mk

将里面的WITH_SRV:=yes和WITH_UUID:=yes都用#号注释掉

1.8、安装mosquitto

接下来编译安装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

二、安全配置

2.1、创建用户

sudo groupadd mosquitto
sudo useradd -g mosquitto mosquitto

2.2、程序配置

创建配置文件

mv  /etc/mosquitto/mosquitto.conf.example  /etc/mosquitto/mosquitto.conf

2.3、修改默认配置

1.关闭匿名用户登录

打开mosquitto.conf文件( /etc/mosquitto/mosquitto.conf ),找到allow_anonymous节点,这个节点作用是,是否开启匿名用户登录。去掉前面的#,改为false。

2.设置用户密码文件路径

找到password_file节点,这个节点是告诉服务器你要配置的用户将存放在哪里。打开此配置并指定pwfile.example文件路径(注意是绝对路径),在669行左右。

password_file /etc/mosquitto/pwfile 或者 /pwfile.example

3.配置topic和用户

acl_file /etc/mosquitto/aclfile.example

4.添加用户信息

终端输入,最后面的是用户名,之后自动弹出密码和确认密码,输入即可。(注意第二次创建用户时不用加 -c 如果加 -c 会把第一次创建的用户覆盖。)

mosquitto_passwd -c /etc/mosquitto/pwfile admin203

然后进入到/etc/mosquitto/mosquitto.conf 将下面两个用户名和密码加上。


5.添加Topic和用户的关系
vim /etc/mosquitto/aclfile.example


1、如果要配置多个用户可以这样: 配置topic(话题)和用户 acl_file /etc/mosquitto/aclfile

保存退出,返回命令行 重建mqtt账号cpsmqtt,用于读写分离 mosquitto_passwd -c /etc/mosquitto/pwfile cpsmqtt

输入密码 Cps123.

2、重建mqtt账号cpsread,用于读写分离,注意第二次创建用户时不用加 -c 如果加 -c 会把第一次创建的用户覆盖。

mosquitto_passwd /etc/mosquitto/pwfile cpsread

输入密码 Cpsread123.

vim /etc/mosquitto/aclfile.example

屏蔽无用的,新增

user cpsmqtt

topic write cps/#

user cpsread

topic read cps/#

继续重启mosquitto -c /etc/mosquitto/mosquitto.conf -d

如果不通的话就可以直接设置这样
# This affects access control for clients with no username.
#user admin203
#topic read mtopic/#
#topic write mtopic/#
# This only affects clients with username "roger".
#user admin203
#topic write mtopic/#
#topic read mtopic/#
# This affects all clients.
#pattern write $SYS/broker/connection/%c/state
user admin203
topic read mtopic/#
topic write mtopic/#

这里一定要设置好,不然就一直抛**Connection Refused: not authorised.**异常。

6、设置用户名和密码

关闭匿名用户登录


配置账户密码

7、用户认证测试
mosquitto -c /etc/mosquitto/mosquitto.conf
1638589039: mosquitto version 1.4.10 (build date 2021-12-04 09:32:52+0800) starting
1638589039: Config loaded from /etc/mosquitto/mosquitto.conf.
1638589039: Opening ipv4 listen socket on port 1883.
1638589039: Opening ipv6 listen socket on port 1883
启动程序:默认端口为1883
mosquitto -c /etc/mosquitto/mosquitto.conf -d

再开一个(发布)窗口输入:

生产者:

mosquitto_pub -h localhost -t mtopic -u admin203 -P admin203 -m "hello,word,nihao" -p 1883
或者
mosquitto_pub -h localhost -t mtopic -u admin203 -P admin203 -m "test"

另外打开一个服务器窗口,在一个(订阅)窗口输入:

消费者:

mosquitto_sub -h localhost -t mtopic -u admin203 -P admin203
test
hello,word,nihao


三、错误解决

3.1、libmosquitto.so.1 No such file or directory

./mosquitto_sub: error while loading shared libraries: libmosquitto.so.1: cannot open shared object file: No such file or directory


解决办法:

编译完mosquitto之后,进入到lib目录下,将编译之后的libmosquitto.so.1 拷贝到目录/usr/local/lib下,执行如下命令:

cp libmosquitto.so.1 /usr/local/lib

然后再执行:

执行命令:

sudo ln -s /usr/local/lib/libmosquitto.so.1 /usr/lib/libmosquitto.so.1

最后执行

ldconfig

即可

四、MQTTX客户端收发消息

1.下载客户端软件安装包,点击安装包直接安装 MQTTX

2.界面一开始是英文,可以显示中文


3.创建连接,这两个地方都可以创建


4.主要填写名称,Client ID,服务器地址这三项,连接


5.同样的步骤,创建一个test2连接


6.在test1中添加一个订阅


7.在test2中输入test1订阅主题的名称,输入内容发送,test1可以接收 一定要注意写Topic的位置。


发布


接收


反之,test1也可以给test2发布消息。

到这里MQTT就全部弄完了,可以开心的玩耍了,是不是SoEasy~

相关实践学习
消息队列RocketMQ版:基础消息收发功能体验
本实验场景介绍消息队列RocketMQ版的基础消息收发功能,涵盖实例创建、Topic、Group资源创建以及消息收发体验等基础功能模块。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
相关文章
|
9天前
|
存储 人工智能 自然语言处理
ChatMCP:基于 MCP 协议开发的 AI 聊天客户端,支持多语言和自动化安装 MCP 服务器
ChatMCP 是一款基于模型上下文协议(MCP)的 AI 聊天客户端,支持多语言和自动化安装。它能够与多种大型语言模型(LLM)如 OpenAI、Claude 和 OLLama 等进行交互,具备自动化安装 MCP 服务器、SSE 传输支持、自动选择服务器、聊天记录管理等功能。
75 15
ChatMCP:基于 MCP 协议开发的 AI 聊天客户端,支持多语言和自动化安装 MCP 服务器
|
29天前
|
开发框架 .NET C#
在 ASP.NET Core 中创建 gRPC 客户端和服务器
本文介绍了如何使用 gRPC 框架搭建一个简单的“Hello World”示例。首先创建了一个名为 GrpcDemo 的解决方案,其中包含一个 gRPC 服务端项目 GrpcServer 和一个客户端项目 GrpcClient。服务端通过定义 `greeter.proto` 文件中的服务和消息类型,实现了一个简单的问候服务 `GreeterService`。客户端则通过 gRPC 客户端库连接到服务端并调用其 `SayHello` 方法,展示了 gRPC 在 C# 中的基本使用方法。
39 5
在 ASP.NET Core 中创建 gRPC 客户端和服务器
|
2月前
|
Python
Socket学习笔记(二):python通过socket实现客户端到服务器端的图片传输
使用Python的socket库实现客户端到服务器端的图片传输,包括客户端和服务器端的代码实现,以及传输结果的展示。
165 3
Socket学习笔记(二):python通过socket实现客户端到服务器端的图片传输
|
2月前
|
JSON 数据格式 Python
Socket学习笔记(一):python通过socket实现客户端到服务器端的文件传输
本文介绍了如何使用Python的socket模块实现客户端到服务器端的文件传输,包括客户端发送文件信息和内容,服务器端接收并保存文件的完整过程。
175 1
Socket学习笔记(一):python通过socket实现客户端到服务器端的文件传输
|
2月前
使用Netty实现文件传输的HTTP服务器和客户端
本文通过详细的代码示例,展示了如何使用Netty框架实现一个文件传输的HTTP服务器和客户端,包括服务端的文件处理和客户端的文件请求与接收。
76 1
使用Netty实现文件传输的HTTP服务器和客户端
|
2月前
|
网络协议 Unix Linux
一个.NET开源、快速、低延迟的异步套接字服务器和客户端库
一个.NET开源、快速、低延迟的异步套接字服务器和客户端库
|
2月前
|
网络协议 Java API
【网络】TCP回显服务器和客户端的构造,以及相关bug解决方法
【网络】TCP回显服务器和客户端的构造,以及相关bug解决方法
68 2
|
2月前
|
存储 网络协议 Java
【网络】UDP回显服务器和客户端的构造,以及连接流程
【网络】UDP回显服务器和客户端的构造,以及连接流程
60 2
|
2月前
|
安全 区块链 数据库
|
2月前
|
存储 网络协议 Unix
docker的底层原理一:客户端-服务器架构
本文详细解释了Docker的客户端-服务器架构,包括常驻后台的Docker守护进程、通过命令行接口发送请求的Docker客户端、以及它们之间通过Unix socket或网络接口进行的通信。
26 0