从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');
});
相关推荐
产品人卫朋23 分钟前
卫朋:IPD流程落地 - 市场地图拆解篇
大数据·人工智能·物联网
TDengine (老段)1 小时前
通过云服务 快速体验 TDengine
大数据·数据库·物联网·时序数据库·tdengine·涛思数据·iotdb
安科瑞解决方案一站通1 小时前
LoRaWAN在能源物联网中的电能计量应用:架构设计与实战案例
物联网·能源
三佛科技-134163842122 小时前
FT61E13x家族解析(FT61E131/3F/32/33/35)8位AD型MCU之间的区别
单片机·嵌入式硬件·物联网·智能家居·pcb工艺
阿钱真强道6 小时前
11 JetLinks MQTT 直连设备功能调用完整流程与 Python 实现
服务器·开发语言·网络·python·物联网·网络协议
todoitbo7 小时前
时序数据库选型指南:面向工业物联网的工程视角,以 Apache IoTDB 为例
物联网·apache·时序数据库·iotdb
cnbestec7 小时前
物联网天线新选择:Flexoo印刷天线实现轻薄、柔性、高集成
物联网·智能汽车·柔性传感器·flexoo·flexoo印刷天线·柔性电子技术
上海合宙LuatOS7 小时前
LuatOS ——fota 升级教程
开发语言·人工智能·单片机·嵌入式硬件·物联网·php·硬件工程
AAAAA92407 小时前
物联网海外网络摄像头市场分析:技术、合规与商业模式新趋势
网络·物联网
上海合宙LuatOS8 小时前
LuatOS 框架的设计原理
java·开发语言·单片机·嵌入式硬件·物联网·硬件工程