MQTT协议的简单介绍
MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅
(publish/subscribe
)模式的"轻量级"通讯协议,该协议构建于TCP/IP协议上。 其最大优点在于,用极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务。作为一种低开销、低带宽占用的即时通讯协议,使其在物联网、小型设备、移动应用等方面有较广泛的应用。
发布和订阅
MQTT
使用的发布/订阅消息模式,它提供了一对多的消息分发机制,从而实现与应用程序的解耦。
这是一种消息传递模式,消息不是直接从发送器发送到接收器 (即点对点),而是由MQTT Broker
分发的。可以这么理解,目前有个公告栏,这个公告栏就是MQTT broker
, 发布消息就是在公告栏上贴公告。而订阅消息就是从公告栏上获取公告。
主题
MQTT传输的消息分为: 主题(Topic) 和 负载(payload)两部分 还是以上述的例子,公告栏上会贴很多公告,例如有关 JS、HTML、CSS的,但是我们只想看JS的,那么公告的类型我们就可以将其视为主题。而负载就是具体的内容。
Client
MQTT
通信可以通俗的理解成多个client
之间通过broker
来进行通信。在我们的平台中,client
可以是某个用户,也可以是某个硬件设备。
MQTT broker搭建
由于之前毕设用的mosca
搭建的(好像不维护了),因此在这里我们还是使用mosca
来搭建一个简易的MQTT broker
附上找到的文档:www.mosca.io/docs/lib/se... (权限管理我觉得在broker中来配置,有点麻烦且可扩展性不强(可能因为我目前太菜了),因此目前想着通过服务端来控制,如何让其进行二次鉴权后续学习后再来编写) 文档很简单,我们目前主要用到以下函数:
server.authenticate
:用于对客户端进行身份验证。可以通过在服务器上设置身份验证逻辑来使用该方法。server.authorizePublish
:用于控制客户端是否可以发布消息到指定主题。可以在服务器上设置发布授权逻辑来使用该方法。server.authorizeSubscribe
:用于控制客户端是否可以订阅指定主题。可以在服务器上设置订阅授权逻辑来使用该方法。server.published
:用于监听消息发布事件。当有客户端发布消息时,可以通过该方法监听并处理消息。server.subscribe
:用于订阅指定主题。可以在服务器上使用该方法来订阅特定主题,并处理接收到的消息。server.unsubscribe
:用于取消订阅指定主题。可以在服务器上使用该方法来取消订阅特定主题。server.publish
是一个用于发布消息到指定主题的方法。它接受一个包含消息内容和主题的对象作为参数,并将该消息发布到指定的主题。
此外,还有server.on() 方法。该方法我认为可以代替上述的大多数函数。 server.on()
方法可以用于监听多种事件,并为每种事件指定不同的回调函数。以下是一些常用的事件和对应的监听方法:
-
ready
:当 MQTT broker 准备就绪并开始监听连接时触发。jsserver.on('ready', () => { console.log('Mosca server is up and running'); });
-
clientConnected
:当有新的客户端连接到服务器时触发。jsserver.on('clientConnected', (client) => { console.log(`Client connected: ${client.id}`); });
-
clientDisconnected
:当客户端断开连接时触发。jsserver.on('clientDisconnected', (client) => { console.log(`Client disconnected: ${client.id}`); });
-
subscribed
:当客户端订阅主题时触发。jsserver.on('subscribed', (topic, client) => { console.log(`Client ${client.id} subscribed to topic: ${topic}`); });
-
unsubscribed
:当客户端取消订阅主题时触发。jsserver.on('unsubscribed', (topic, client) => { console.log(`Client ${client.id} unsubscribed from topic: ${topic}`); });
-
published
:当有消息被发布到服务器时触发。jsserver.on('published', (packet, client) => { console.log(`Published: ${packet.topic}`); });
在node环境下搭建简单的MQTT broker 具体代码如下: 安装mosca npm install mosca
js
const mosca = require('mosca');
// 创建 Mosca 服务器
const settings = {
port: 1883 // MQTT 默认端口
};
const server = new mosca.Server(settings);
// 监听客户端连接事件
server.on('clientConnected', (client) => {
console.log(`Client connected: ${client.id}`);
});
// 监听客户端断开事件
server.on('clientDisconnected', (client) => {
console.log(`Client disconnected: ${client.id}`);
});
// 监听 MQTT 消息发布事件
server.on('published', (packet, client) => {
console.log(`Published: ${packet.topic}`);
});
// 监听 Mosca 服务器就绪事件
server.on('ready', () => {
console.log('Mosca server is up and running');
});