前言:最近公司有一个项目要用到MQTT,这就涉及到了我的知识盲区了,知识有限的我,立即查资料看文档学习一下,然后将学习心得整理记录一下。
MQTT是什么
MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)借用 官方 的话:轻量级物联网消息推送协议。从这句话中就可以提炼出几个重要的信息:
既然是一种轻量级的传输协议,那么必然是容易上手的,简单的。他是IBM开发的一个即时通讯协议,它是一种轻量级的、基于代理的“发布/订阅”模式的消息传输协议。与HTTP之类的协议相比,MQTT在通过网络传输数据时表现出众。 目前已经有PHP,JAVA,Python,C,C#,Go,JavaScript等多个语言版本,基本可以使用在任何平台上。当前我做的项目就是基于JavaScript版本支持的MQTT。
MQTT的历史
在官网中并没有提及MQTT的来历,也不知道是谁给创造出来的,既然要学习MQTT,最开始肯定是要了解一下其历史的,那么继续扒一扒MQTT的跟脚。
IBM公司的 安迪·斯坦福-克拉克 及 Cirrus Link公司的 阿兰·尼普 于 1999年 撰写了该协议的第一个版本。
上面这段是我再百度百科中找到的,这是地址
其应用范围及场景主要有:
MQTT的基本原理
在MQTT协议通讯中,有两个最为重要的角色。它们分别是服务端和客户端。
-
服务端 MQTT服务端其实就是一台服务器。它是MQTT信息传输的枢纽,负责将MQTT客户端发送来的信息传递给MQTT客户端。MQTT服务端还负责管理MQTT客户端。确保客户端之间的通讯顺畅,保证MQTT消息得以正确接收和准确投递。 -
客户端 MQTT客户端可以向服务端发布信息,也可以从服务端收取信息。我们把客户端发送信息的行为成为发布信息。而客户端要想从服务端收取信息,则首先要向服务端订阅信息。 例: “订阅” 信息这一操作很像我们在视频网站订阅某一部电视剧。当这部电视剧上新后,视频网站会向订阅了该剧的用户发送信息,告诉他们有新剧上线了。 -
主题 刚刚我们在讲解MQTT客户端订阅信息时,使用了用户在视频网站订阅电视剧这个例子。在MQTT通讯中,客户端所订阅的肯定不是一部部电视剧,而是一个个主题。上面例子中的电视剧名称其实就是这里所说的主题,MQTT服务端在管理MQTT信息通讯时,就是使用“主题”来控制的。 -
发布与订阅 从以上实例我们可以看到,MQTT通讯的核心枢纽是MQTT服务端。有了服务端对MQTT信息的接收、储存、处理和发送,客户端在发布和订阅信息时,可以相互独立,且在空间上可以分离,时间上可以异步。这里所说的相互独立、空间和时间分离具体指的是什么呢?
MQTT的特点
-
开放消息协议,简单且容易在客户端实现
因此,MQTT成为了当今世界上最受欢迎的物联网协议。它已广泛应用于车联网、智能家居、即时聊天应用和工业互联网等领域。目前通过MQTT协议连接的设备已经过亿,这些都得益于MQTT 协议为设备提供了稳定、可靠、易用的通信基础。
-
发布订阅模式,一对多消息发布 图示这里只有一台客户端客户端可以发布消息,但并不是最多只能一台客户端进行发布消息,而是所有的客户端都可以发布消息,所以这里就要具体分析具体处理,根据自身业务需求来定。 -
基于TCP/IP网络连接,提供有序,无损,双向连接。 -
1字节固定报头,2字节心跳报文,最小化传输开销和协议交换,有效减少网络流量。 -
消息QoS支持,可靠传输保证
MQTT都有哪些功能
-
准备工作
import MQTT from 'mqtt';
let client = {};
const connection = {
host: 'MQTT服务器IP地址',
port: '端口号',
endpoint: '/mqtt',
clean: true,
connectTimeout: 4000,
reconnectPeriod: 4000,
clientId: '客户端唯一ID标识',
username: '用户名',
password: '密码',
lastWillTopic: 'maker',
};
const subscription = {
topic: 'topic',
qos: 1,
};
const publish = {
topic: 'topic',
qos: 1,
payload: '{ "msg": "Hello, I am browser." }',
};
-
连接MQTT服务器 const creatConnectFun = async () => {
const { host, port, endpoint, ...options } = connection;
const connectUrl = `mqtt://${host}:${port}${endpoint}`;
try {
client = MQTT.connect(connectUrl, options);
} catch (error) {
console.log('mqtt.connect error', error);
}
client.on('connect', () => {
console.log('Connection succeeded!');
});
client.on('error', (error: any) => {
console.log('Connection failed', error);
});
client.on('message', (topic: any, message: any) => {
console.log('message', message);
});
};
这是连接MQTT服务器成功后返回客户端信息的对象数据 -
断开与MQTT服务器 const disConnectFun = async () => {
if (client?.connected) {
try {
client.end();
client = {};
console.log('Successfully disconnected!');
} catch (error: any) {
console.log('Disconnect failed', error.toString());
}
}
};
-
订阅消息 const doSubscribe = async () => {
const { topic, qos } = subscription;
client.subscribe(topic, { qos }, (error: any, res: any) => {
if (error) {
console.log('Subscribe to topics error', error);
return;
}
console.log('Subscribe to topics res', res);
});
};
-
发布消息 const pubFun = async () => {
const { topic, qos, payload } = publish;
client.publish(topic, payload, { qos }, (error: any) => {
if (error) {
console.log('Publish error', error);
} else {
console.log('已发布的消息:', publish);
}
});
};
这是订阅主题及发布消息。
注意:此处发布消息可以是字符串或者ArrayBuffer
public publish (topic: string, message: string | Buffer,
opts: IClientPublishOptions, callback?: PacketCallback): this
public publish (topic: string, message: string | Buffer,
callback?: PacketCallback): this
注意:此处客户端监听到发布的消息并进行接收到的数据是ArrayBuffer格式,需要对其进行数据转换。
client.on('message', (topic: any, message: any) => {
console.log('message', message.toString());
});
-
取消订阅 const doUnSubscribe = async () => {
const { topic } = subscription;
client.unsubscribe(topic, (error: any) => {
if (error) {
console.log('Unsubscribe error', error);
}
console.log('Unsubscribe success');
});
};
MQTT的通信质量
MQTT服务质量(Quality of Service 缩写 QoS)正是用于告知物联网系统,哪些信息是重要信息需要准确无误的传输,而哪些信息不那么重要,即使丢失也没有问题,因为很快下一次读记录就会产生。
MQTT协议有三种服务质量级别:
以上基本就是我学习MQTT以及在项目中应用的一些粗浅心得,可以说连他的冰山一角都没有碰到,因为时间有限,希望后面有时间再继续深度学习一下。
另外我再学习的过程中查看了一些前人的资料,我这里要特别感谢:太极创客 这个网站,因为有他我才学习的更加轻松自如。 这个网站对于MQTT讲解的还是比较的细致,有文章,也有视频讲解,真的是很贴心啊,另外我文章中也有引用到他们的文章段落,主要是他们的讲解描述确实是很通俗易懂。
|