搭建MQTT服务器和安装客户端软件进行连接,并进行消息的订阅与发布

MQTT客户端程序的编写请看博客mqtt客户端读取数据库发布消息,并订阅消息存入数据库(python编写)

一、MQTT协议介绍

MQTT是什么?
MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(Publish/Subscribe)模式的轻量级通讯协议,该协议构建于TCP/IP协议上,由IBM在1999年发布,目前最新版本为v3.1.1。MQTT最大的优点在于可以以极少的代码和有限的带宽,为远程设备提供实时可靠的消息服务。做为一种低开销、低带宽占用的即时通讯协议,MQTT在物联网、小型设备、移动应用等方面有广泛的应用。

当然,在物联网开发中,MQTT不是唯一的选择,与MQTT互相竞争的协议有XMPP和CoAP协议等,文章末尾会有一个比较和说明。

MQTT是哪一层的协议?
众所周知,TCP/IP参考模型可以分为四层:应用层、传输层、网络层、链路层。TCP和UDP位于传输层,应用层常见的协议有HTTP、FTP、SSH等。MQTT协议运行于TCP之上,属于应用层协议,因此只要是支持TCP/IP协议栈的地方,都可以使用MQTT。

MQTT消息格式
每条MQTT命令消息的消息头都包含一个固定的报头,有些消息会携带一个可变报文头和一个负荷。消息格式如下:

固定报文头 | 可变报文头 | 负荷

固定报文头(Fixed Header)
MQTT固定报文头最少有两个字节,第一字节包含消息类型(Message Type)和QoS级别等标志位。第二字节开始是剩余长度字段,该长度是后面的可变报文头加消息负载的总长度,该字段最多允许四个字节。

剩余长度字段单个字节最大值为二进制0b0111 1111,16进制0x7F。也就是说,单个字节可以描述的最大长度是127字节。为什么不是256字节呢?因为MQTT协议规定,单个字节第八位(最高位)若为1,则表示后续还有字节存在,第八位起“延续位”的作用。

例如,数字64,编码为一个字节,十进制表示为64,十六进制表示为0×40。数字321(65+2*128)编码为两个字节,重要性最低的放在前面,第一个字节为65+128=193(0xC1),第二个字节是2(0x02),表示2×128。

由于MQTT协议最多只允许使用四个字节表示剩余长度(如表1),并且最后一字节最大值只能是0x7F不能是0xFF,所以能发送的最大消息长度是256MB,而不是512MB。

在这里插入图片描述

二、MQTT服务器搭建

使用apollo搭建MQTT服务器,关于apollo

Apollo以ActiveMQ原型为基础,是一个更快、更可靠、更易于维护的消息代理工具。Apache称Apollo为最快、最强健的 STOMP(Streaming Text Orientated Message Protocol,流文本定向消息协议)服务器。

这里不便给出apollo的下载链接了,我用的版本是1.7.1

配置 apollo并创建broker

首先要注意一点,jdk的版本不能太高,不然将在启动Apollo时报错

java.lang.NoClassDefFoundError: javax/xml/bind/DatatypeConverter

具体版本不能超过多少我也不能说的准确,反正我原本时jdk11,我全部卸载掉,然后安装了jdk8,如果你恰巧也和我一样倒霉,那就赶紧去卸载吧,我在网上查找并没有什么好的办法。虽然理论上可以通过手动添加jar包的办法实现,但是不仅麻烦而且后续还是可能有错。

处理好jdk的版本问题后,进入到 apollo 下面的 bin 文件夹下,输入命令 apollo.cmd create mqttbroker(或者别的啥名字)

启动broker

使用 cmd 进入到 apache-apollo-1.7.1\bin\mybroker\bin 路径下,运行命令apollo create mybroker
运行成功如下图所示,会有一个apollo的图标。
在这里插入图片描述
看到给出INFO信息的最后两行,给出了目前访问服务器的IP及端口,我们任选其中一个复制,粘贴到浏览器,就可以看到登录界面了。
在这里插入图片描述
登录

输入Username:admin,Password:password
下面是登录成功后的界面
在这里插入图片描述
局域网连接

现在服务器IP是我主机的本地地址,要想使用局域网连接服务器,就要修改Ip
我这里使用的校园网的局域网IP
在这里插入图片描述

选择 configration 下选择 apollo.xml 文件,修改 <host_name> 属性为服务器 ip(10.60.232.117),<web_admin> 同步修改,以及 tcp 节点下将默认的 tcp://0.0.0.0:61613 修改为服务器的 ip

在这里插入图片描述

修改完成后,点击save即可。

然后就用局域网ip就可以访问服务器了
在这里插入图片描述

三、用客户端软件连接

这里给出客户端软件的下载连接
链接:https://pan.baidu.com/s/1A_M8LOUsgdqfcltx-9Fb3w
提取码:tg17
下载解压后,双击即可运行可执行文件paho.exe
点击左上角绿色加号新建一个连接
点击选项
在这里插入图片描述

勾选开启登录,填入用户名跟密码(admin、password)

点击MQTT输入局域网IP
在这里插入图片描述
点击连接
在这里插入图片描述
连接成功
这时就可以在服务器看到连接的IP和端口号了
在这里插入图片描述

四、订阅和发布消息

这里我就在我的本机上新建一个客户机测试连接(因为我还没有具体的实验环境)
按上面的步骤,我又新建了一个连接并连接成功了
在这里插入图片描述
可以在服务器看到
在这里插入图片描述
两个连接使用的相同的IP不同的端口号

先在第一个客户机订阅一个消息,主题设为hello
在这里插入图片描述
然后在第二个客户机发布这个消息,并填上内容hello world
在这里插入图片描述
然后客户机1成功收到这个消息
在这里插入图片描述

这样就完成了一个消息的订阅与发布

五、总结

在学习了之前的有关网络通信编程的知识之后,上手MQTT才觉得这个真的是简单方便性能又强。由于MQTT在物联网应用中有着很高的地位,所以还要接着探索与学习MQTT以及实践以下它更多的应用。
MQTT客户端程序的编写请看博客mqtt客户端读取数据库发布消息,并订阅消息存入数据库(python编写)

六、参考

apollo安装与创建
Apollo MQTT在windows上面环境部署与连接测试

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用 Qt 来搭建 MQTT 服务器客户端。下面是一个简单的示例代码,演示了如何使用 Qt MQTT 模块来实现一个基本的 MQTT 客户端: ```cpp #include <QtMqtt/QMqttClient> #include <QCoreApplication> #include <QDebug> int main(int argc, char *argv[]) { QCoreApplication app(argc, argv); QMqttClient mqttClient; mqttClient.setHostname("mqtt.example.com"); // 设置 MQTT 服务器的主机名 mqttClient.setPort(1883); // 设置 MQTT 服务器的端口 QObject::connect(&mqttClient, &QMqttClient::connected, [&]() { qDebug() << "Connected to MQTT server"; mqttClient.subscribe("topic/example"); // 订阅主题 }); QObject::connect(&mqttClient, &QMqttClient::disconnected, [&]() { qDebug() << "Disconnected from MQTT server"; }); QObject::connect(&mqttClient, &QMqttClient::messageReceived, [&](const QByteArray &message, const QMqttTopicName &topic) { qDebug() << "Received message:" << message << "on topic:" << topic.name(); }); mqttClient.connectToHost(); // 连接MQTT 服务器 return app.exec(); } ``` 上面的示例代码创建了一个 `QMqttClient` 对象,并设置了 MQTT 服务器的主机名和端口。然后,通过连接相关的信号和槽,实现了连接服务器订阅主题以及接收消息的功能。最后,通过调用 `connectToHost` 函数来连接MQTT 服务器。 你还需要在项目文件中添加以下语句,以确保正确链接 Qt MQTT 模块: ``` QT += mqtt ``` 关于如何搭建 MQTT 服务器,你可以使用一些开源的 MQTT 服务器实现,如 Mosquitto、EMQ X 等。你可以在它们的官方文档中找到详细的安装和配置步骤。 希望这个简单的示例能够帮助你开始搭建 MQTT 服务器客户端。如有更多问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值