林杰

让未来的你的感谢现在的自己!

  • 主页
  • 随笔
所有文章 友链 关于我

林杰

让未来的你的感谢现在的自己!

  • 主页
  • 随笔

MQTT 从0-1

阅读数:1295次 2023-04-12
字数统计: 2k字   |   阅读时长≈ 7分

最近在做机器人联网方向的工作。于是利用下班时间把之前 搭建的 MQTT demo 重新温习一遍。也借此把自己的技术极客再丰富一下。

MQTT应该是当今世界上最受欢迎的物联网协议了,没有之一。
MQTT主要应用在车联网,智能家居、即时聊天应用和工业互联网等领域。
目前MQTT连接的设备已经过亿,这些都得益于MQTT为设备提供了稳定、可靠、易用的通信基础。
MQTT跟HTTP类似,但由于轻量简单的传输效率可能是后者的10倍,所以也逐渐成为了物联网领域的最佳选择。
*** 其实你们可能用过MQTT,比如:你用手机解锁一辆共享单车的时候…… ***

今天我依然会要用尽可能简单易懂的文字来写这篇笔记。尽量做到入门小白也能看懂的程度。
也是 防止自己淡忘,容易重新激起记忆联想。

什么是MQTT?

官网的解释是:MQTT是一个客户端服务架构的发布/订阅模式的消息传输通信协议……(此处省略500字)
*** 讲人话 *** – 通信协议就是一种沟通方式,好比中国各地都有方言,但为了更好与人的打交道,我们会尽量说普通话。那普通话就是我们沟通的通信协议。

MQTT使用Publish/Subscribe发布订阅机制的通讯协议

*** 讲人话 *** – 就是要把 发布消息的人 和 收到消息的人给分开 通过一个中间人来沟通。

  • 我们先来代入一个情境:
    • 我是短视频UP主 —— (Publisher)
    • 关注我的人 —— (Subscriber)
    • 短视频平台 —— (Broker)
    • 当我发一条短视频的时候,短视频平台(Broker) 就会把我的视频推送给关注我的人。

*** 一、 讲到这里 MQTT 的三个重要角色就出现了*** (注意!不是刘关张)

  • 发布者 Publisher

  • 订阅者 Subscriber

  • 代理人 Broker

  • 需要注意的是 这里发布者和订阅者可以是任何装置,

  • 而代理人是一台服务器,用来接收发布者所发布的消息,把信息储存下来同时依照主题发布给所有该主题的 订阅者,代理人会将消息储存下来,所以当发布者突然间断线,也可以记住最后的状态

*** 二、主题 topic ***

  • Topic是消息发布(Pub)者和订阅(Sub)者之间的传输中介。设备可通过Topic实现消息的发送和接收,从而实现服务端与设备端的通信。为方便海量设备基于Topic进行通信,简化授权操作,物联网平台定义了产品Topic类和设备Topic。本文介绍产品和设备Topic的定义、使用和分类。

  • Topic类:产品维度的Topic,是同一产品下不同设备的Topic集合。一个ProductKey下有多个Topic类。一个Topic类对一个ProductKey下所有设备通用。

*** 讲人话 *** – 就是topic利用斜线(/)来分隔不同的层级,对于使用时,其实是没有太大的硬性规定,通常用来让我们区分不同的区域,或者是不同的类型的装置,来让我们分辨该装置是放在什么位置,或着是什么类别的内容.

例如我们可以像是这样,我家的客庭里面有个电灯,还有感应器
那topic传递的层级就是:`家/客厅/电灯`,`家/客厅/感应器`

但是各个层级的名称呢还是有一些细节必须要注意:

1. 最好不要使用中文。虽然可以用,但是为了避免编码的问题还是建议不要使用更好
2. 最好不要使用空白,虽然有时候使用空格没有问题,甚至你可以什么都不输入使用空层级,但为了编码时更容易理解他们代指着什么尽量用语义化的拼写规则
3. 不能使用($) (#) (+)等特殊字符,也最好不要使用符号来当层级的名称
4. 名称的长度不能超过2的16次方个字节

*** Payload承载的消息 ***

payload 就是你发布的消息内容,一般会是Sting字符串或是 JSON类型,

  1. 要注意的是不要传送超过256MB的内容

一般来说我们只要知道会传送的是什么内容,在获取或者控制时使用相对应的格式就好

*** QoS(Quality of service)服务质量 ***

  • MQTT的QoS只有3个值可以设定

    1. 分别是0最多传送一次 — QoS = 0 — 可能会漏传,但速度最快
    2. 最少传送一次 — QoS = 1 — 可能多传 速度适中
    3. 确实的传送一次 — QoS = 2 — 肯定会收到 速度最慢

这里底层复杂的原理我们都不需要去了解,只要想好什么情况要用哪一种服务品质就好

- 纸上得到终学浅, 我们动手试一下

现在我们来看看在vue中,怎么样可以用websocket和mqtt在网页跟你的硬件设备做交互
这里首先默认大家都已经熟悉掌握了如何用js, vue, 和vuecli等等等等相关技术栈,
用脚手架搭建项目框架后。启动你的本地服务,

首先安装 mqtt库 我本地是用^4.3.7版本

1
2
3
npm install mqtt
// or
yarn mqtt

话不多讲直接撸代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
// do someting... 此处省略一万行代码

data(){
return{
connection: {
host: 'host.io',// host 地址
port: 9527, // 端口号
clean: true, // 保留会话
connectTimeout: 4000, // 连接超时时间
reconnectPeriod: 4000, // 重连时间间隔
// 认证信息
clientId: 'mqtt_' + Math.random().toString(16).substr(2,8),// 随机生成一个的clientId
username: 'linjie',
password: 'password'
},
subscription: {
topic: 'topic/mqttx',//机器人设备的主题
qos: 2
},
publish: {
topic: 'topic/browser',//客户端浏览器的主题
qos: 2,
payload: '{ "msg": "Hello, I am browser." }'
}
}
}
// do someting... 此处省略一万行代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
// do someting... 此处省略一万行代码
methods: {
// 创建连接
createConnection() {
// 连接字符串, 通过协议指定使用的连接方式
// ws 未加密 WebSocket 连接
// wss 加密 WebSocket 连接
// mqtt 未加密 TCP 连接
// mqtts 加密 TCP 连接
const { host, port, endpoint, ...options } = this.connection;
const connectUrl = `ws://${host}:${port}${endpoint}`;//WebSocket地址
try {
this.client = mqtt.connect(connectUrl, options);
} catch (error) {
console.log('mqtt.connect error', error);
}
// 连接监听 等待与服务器建立连接
this.client.on('connect', (error) => {
console.log('Connection succeeded!');
});
// 重连监听
this.client.on('reconnect', () => {
console.log('reconnect正在重连',error);
});
// 错误监听
this.client.on('error', error => {
console.log('Connection failed', error);
});
// 消息监听
/**
* topic @param topic as String 主题
* message @param message as String | Object 内容
*/
this.client.on('message', (topic, message) => {
this.receiveNews = this.receiveNews.concat(message);
console.log(`Received message ${message} from topic ${topic}`);
});
},
// 订阅主题 等待完成订阅
doSubscribe() {
const { topic, qos } = this.subscription;
this.client.subscribe(topic, { qos }, (error, res) => {
if (error) {
//do someting...
console.log('Subscribe to topics error', error);
return;
}
this.subscribeSuccess = true;
console.log('Subscribe to topics res', res);
});
},
// 取消订阅
doUnSubscribe() {
const { topic } = this.subscription;
this.client.unsubscribe(topic, error => {
if (error) {
//do someting...
console.log('Unsubscribe error', error);
}
});
},
// 发送消息
doPublish() {
/**
* MQTT客户端发送消息请求,发送完成后返回应用程序线程。
* topic @param topic as String 主题
* payload @param message as String | Object 内容
* qos @param qos as Number => 0 | 1 | 2 服务质量
*/
const { topic, qos, payload } = this.publish;
this.client.publish(topic, payload, qos, error => {
if (error) {
//do someting...
console.log('Publish error', error);
}
});
},
// do someting... 此处省略一万行代码
}

今天先写到这吧。咱们有空再续 …… 至于什么有空?看缘份吧

赏

谢谢你请我吃糖果

微信
  • 本文作者: 林杰
  • 本文链接: http://linjiefe.github.io/2023/04/12/MQTT/
  • 技术分享
  • 技术分享

扫一扫,分享到微信

土味正则系列之——负向前瞻断言
土味正则
© 2018-2024 林杰
GitHub:hexo-theme-yilia-plus by Litten
本站总访问量1299次 | 本站访客数1219人
  • 所有文章
  • 友链
  • 关于我

tag:

  • javascript
  • 学习笔记
  • 技术分享
  • 随笔
  • react-native
  • vue
  • typescript
  • react

    缺失模块。
    1、请确保node版本大于6.2
    2、在博客根目录(注意不是yilia-plus根目录)执行以下命令:
    npm i hexo-generator-json-content --save

    3、在根目录_config.yml里添加配置:

      jsonContent:
        meta: false
        pages: false
        posts:
          title: true
          date: true
          path: true
          text: false
          raw: false
          content: false
          slug: false
          updated: false
          comments: false
          link: false
          permalink: false
          excerpt: false
          categories: false
          tags: true
    

  • webGL之three.js

    2024-03-27

  • vue3-ts-admin脚手架搭建

    2024-02-18

    #vue#typescript

  • 关于vue3

    2024-01-11

  • Observer Pattern(观察者模式)和Publisher-Subscriber Pattern(发布者/订阅者模式)

    2023-11-15

    #随笔

  • 土味正则系列之——负向前瞻断言

    2023-11-14

    #学习笔记

  • MQTT 从0-1

    2023-04-12

    #技术分享

  • 土味正则

    2021-07-16

    #学习笔记

  • react 环境搭建

    2016-10-20

    #react

  • react-native 第一个demo

    2016-10-20

    #学习笔记#react-native

  • Javascript 严格模式

    2016-02-01

    #javascript#学习笔记

  • 关于IE的下的haslayout问题

    2016-01-26

    #学习笔记

  • 技术笔记
  • typescript
  • 掘金
  • nonejs
  • node js中文网
  • 同事良祥
一位来自祖国最东端乌苏里江边境的
挨踢攻城狮。
希望在这里结识更多爱好前端的同学!
初次见面,请多多打赏!