从0开始搭建简单的MQTT物联网平台笔记(一):MQTT broker

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中来配置,有点麻烦且可扩展性不强(可能因为我目前太菜了),因此目前想着通过服务端来控制,如何让其进行二次鉴权后续学习后再来编写) 文档很简单,我们目前主要用到以下函数:

  1. server.authenticate:用于对客户端进行身份验证。可以通过在服务器上设置身份验证逻辑来使用该方法。
  2. server.authorizePublish:用于控制客户端是否可以发布消息到指定主题。可以在服务器上设置发布授权逻辑来使用该方法。
  3. server.authorizeSubscribe:用于控制客户端是否可以订阅指定主题。可以在服务器上设置订阅授权逻辑来使用该方法。
  4. server.published:用于监听消息发布事件。当有客户端发布消息时,可以通过该方法监听并处理消息。
  5. server.subscribe:用于订阅指定主题。可以在服务器上使用该方法来订阅特定主题,并处理接收到的消息。
  6. server.unsubscribe:用于取消订阅指定主题。可以在服务器上使用该方法来取消订阅特定主题。
  7. server.publish 是一个用于发布消息到指定主题的方法。它接受一个包含消息内容和主题的对象作为参数,并将该消息发布到指定的主题。

此外,还有server.on() 方法。该方法我认为可以代替上述的大多数函数。 server.on() 方法可以用于监听多种事件,并为每种事件指定不同的回调函数。以下是一些常用的事件和对应的监听方法:

  • ready:当 MQTT broker 准备就绪并开始监听连接时触发。

    js 复制代码
    server.on('ready', () => {
        console.log('Mosca server is up and running');
    });
  • clientConnected:当有新的客户端连接到服务器时触发。

    js 复制代码
    server.on('clientConnected', (client) => {
        console.log(`Client connected: ${client.id}`);
    });
  • clientDisconnected:当客户端断开连接时触发。

    js 复制代码
    server.on('clientDisconnected', (client) => {
        console.log(`Client disconnected: ${client.id}`);
    });
  • subscribed:当客户端订阅主题时触发。

    js 复制代码
    server.on('subscribed', (topic, client) => {
        console.log(`Client ${client.id} subscribed to topic: ${topic}`);
    });
  • unsubscribed:当客户端取消订阅主题时触发。

    js 复制代码
    server.on('unsubscribed', (topic, client) => {
        console.log(`Client ${client.id} unsubscribed from topic: ${topic}`);
    });
  • published:当有消息被发布到服务器时触发。

    js 复制代码
    server.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');
});
相关推荐
数据皮皮侠7 小时前
最新上市公司业绩说明会文本数据(2017.02-2025.08)
大数据·数据库·人工智能·笔记·物联网·小程序·区块链
Hy行者勇哥8 小时前
物联网软件开发过程中,数据流图(DFD),用例图,类图,活动图,序列图,状态图,实体关系图(ERD),BPMN(业务流程建模)详解分析
java·物联网·struts
wei_shuo10 小时前
时序数据库 Apache IoTDB:从边缘到云端Apache IoTDB 全链路数据管理能力、部署流程与安全特性解读
物联网·apache·时序数据库·iotdb
时序数据说16 小时前
时序数据库市场前景分析
大数据·数据库·物联网·开源·时序数据库
TDengine (老段)1 天前
TDengine IDMP 高级功能(4. 元素引用)
大数据·数据库·人工智能·物联网·数据分析·时序数据库·tdengine
David WangYang1 天前
基于 IOT 的安全系统,带有使用 ESP8266 的语音消息
物联网·安全·语音识别
AI精钢2 天前
H20芯片与中国的科技自立:一场隐形的博弈
人工智能·科技·stm32·单片机·物联网
shengyicanmou2 天前
深度解码格行无缝切网引擎:40%延迟降低背后的多网智能切换架构
人工智能·物联网·智能硬件
御控工业物联网2 天前
智能制造综合实训平台数据采集物联网解决方案
物联网·制造·工控·工业自动化·制造业
玩转以太网2 天前
3 种方式玩转网络继电器!W55MH32 实现网页 + 阿里云 + 本地控制互通
网络·物联网·阿里云