前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >非GO--物联网平台emqx和mqtt在Vue和Nodejs里面的使用

非GO--物联网平台emqx和mqtt在Vue和Nodejs里面的使用

原创
作者头像
言志志
发布2023-11-09 22:13:37
5010
发布2023-11-09 22:13:37
举报
文章被收录于专栏:Go语言学习笔记Go语言学习笔记

前言

本文是探讨的是"物联网平台emqx和mqtt在Vue和Nodejs里面的使用"

学习归纳,如有不对, 还望斧正, 感谢!

最近搞过物联网相关的,也顺带归纳一下,我的个人Go项目还在进行中,欢迎关注

mqtt协议的粗识

MQTT(Message Queuing Telemetry Transport)是一种轻量级的通信协议,专为物联网设备和应用程序之间的通信而设计。它是一种发布/订阅模式的协议,允许设备和应用程序通过一个中间代理(broker)进行通信。

  1. 轻量级:MQTT协议非常轻量级,协议头部只有几个字节,传输数据量小,适合在带宽有限的网络环境中使用。
  2. 发布/订阅模式:MQTT使用发布/订阅模式进行消息传递。设备可以发布(publish)消息到一个特定的主题(topic),而其他设备可以订阅(subscribe)这个主题,以接收相关的消息。
  3. 可靠性:MQTT协议支持三种级别的消息传递质量(QoS):QoS 0表示最多一次的传递,QoS 1表示至少一次的传递,QoS 2表示只有一次的传递。通过选择适当的QoS级别,可以确保消息的可靠性和传递保证。
  4. 异步通信:MQTT协议支持异步通信,设备可以在不同的时间发送和接收消息,而不需要实时的连接。
  5. 灵活的连接方式:MQTT协议支持多种连接方式,包括TCP/IP、WebSocket等,可以适应不同的网络环境和设备类型。
  6. 安全性:MQTT协议支持基于TLS/SSL的加密通信,可以确保消息的安全性和隐私性。
  7. 低功耗:MQTT协议设计时考虑了物联网设备的低功耗需求,能够有效地利用设备的能源。

MQTT协议的工作原理如下:

  1. 设备通过TCP/IP或WebSocket等协议与MQTT代理(broker)建立连接。
  2. 设备可以发布消息到一个特定的主题(topic),或者订阅一个主题以接收相关的消息。
  3. MQTT代理负责接收和路由消息,将消息传递给订阅了相应主题的设备。
  4. 订阅了某个主题的设备会收到与该主题相关的消息。
  5. 设备可以根据需要选择适当的QoS级别来确保消息的可靠性。

MQTT非常适用于物联网设备和应用程序之间通信的协议,已经被广泛应用于物联网领域,为设备之间的通信提供了一种高效和可靠的解决方案。

关于mqtt细解

  1. 主题(Topic)和通配符: MQTT使用主题(Topic)来标识消息的内容。主题类似于一个路径,可以是层级结构的字符串,用斜杠(/)分隔。例如,"home/livingroom/temperature"是一个主题。

MQTT还支持通配符来进行更灵活的订阅。有两种通配符:单层级通配符(+)和多层级通配符(#)。单层级通配符可以匹配一个层级,而多层级通配符可以匹配零个或多个层级。例如,订阅"home/+/temperature"可以匹配"home/livingroom/temperature"和"home/bedroom/temperature"等主题。

  1. 连接和会话: MQTT协议使用基于会话的连接模型。设备在连接到MQTT代理时可以选择保持会话。会话可以跟踪设备的订阅和发布状态,以便在断开连接后重新连接时恢复之前的订阅和发布。

会话还可以设置清除标志,用于指示代理是否应该保留设备的订阅和发布状态。如果清除标志被设置为true,则断开连接后会话将被删除,设备的订阅和发布状态将被清空。

  1. QoS级别: MQTT协议支持三种级别的消息传递质量(QoS):
  • QoS 0:最多一次的传递。消息发送后不进行确认,不保证消息的可靠性和传递。
  • QoS 1:至少一次的传递。消息发送后需要收到确认,如果没有收到确认,则会重新发送消息,确保消息至少被传递一次。
  • QoS 2:只有一次的传递。消息发送后需要进行两次确认,确保消息只被传递一次。这是最高的可靠性级别,但也会带来更多的网络开销。

设备可以根据需要选择适当的QoS级别。较高的QoS级别会带来更多的网络开销。

  1. 消息保留(Retained Messages): MQTT支持消息保留机制,即设备可以发布一个保留消息。当有设备订阅了某个主题时,代理会将最新的保留消息发送给订阅者。这样,订阅者可以获取到最新的状态或信息,即使在订阅之前已经有消息发布。
  2. 服务质量和延迟: MQTT协议通过控制QoS级别来实现服务质量和延迟的平衡。较高的QoS级别可以提供更可靠的消息传递,但会增加网络开销和延迟。较低的QoS级别可以减少网络开销和延迟,但可能会牺牲消息的可靠性。
  3. 安全性: MQTT协议支持基于TLS/SSL的加密通信,确保消息的安全性和隐私性。设备和代理之间的通信可以通过安全套接字层(SSL)进行加密,防止数据的窃听和篡改。
  4. MQTT代理(Broker): MQTT代理是MQTT协议的核心组件,负责接收和路由消息。代理可以处理多个设备的连接和消息传递,并确保消息按照订阅关系进行正确的传递。代理还可以支持订阅和发布的身份验证、访问控制等功能。

关于emqx平台

EMQ X 是一个开源的分布式 MQTT 消息代理服务器,它实现了 MQTT 协议的 V3.1 和 V3.1.1 版本,并支持 MQTT over WebSocket、MQTT over TLS、MQTT over TCP 等多种协议。

EMQ X 的设计目标是为物联网(IoT)和实时消息传输提供高性能、可靠性和可伸缩性。它支持数百万级别的并发连接,能够处理大量的消息流量。

EMQ X 的架构采用了分布式的设计,可以通过水平扩展来增加容量和吞吐量。它提供了多种集群模式,包括主从模式、多主模式和集群模式,可以根据实际需求选择合适的模式。

EMQ X 还提供了强大的消息路由和消息转发功能,可以根据不同的规则将消息路由到不同的主题或者客户端。它支持基于主题的通配符订阅,可以实现灵活的消息过滤和订阅模式。

EMQ X 还提供了丰富的插件系统,可以扩展其功能。它提供了很多常用的插件,包括数据库插件、认证插件、WebHook 插件等,可以满足不同场景下的需求。

综上,EMQ X 是一个高性能、可靠性和可扩展性的分布式 MQTT 消息代理服务器,适用于物联网和实时消息传输场景。它提供了丰富的功能和灵活的架构设计,可以满足不同规模和需求的应用场景。

emqx的安装

首先就是下载emqx,下载好了之后是压缩包,然后解压就行

安装好了之后,到bin目录,输入emqx start然后回车启动服务,这个emqx实际上就是在你本地上搭建了一个mqtt服务器

验证是否启动成功,我们可以在本地浏览器输入http://localhost:18083/ ,看到如下图,就说明服务启动成功了,然后输入用户名和密码 默认用户名是admin,默认密码是public,进去之后会让你设置用户名和密码,你自己看着办

进去之后就是

我们可以在里面测试链接

然后在客户端可以看到我们自己的链接

使用 Vue2中链接本地emqx服务端

首先先安装mqtt,

npm官网地址如下:

mqtt - npm (npmjs.com)

代码语言:txt
复制
npm i mqtt 

安装好了之后,在Vue组件中导入,这是es6的语法

代码语言:html
复制
import * as mqtt from 'mqtt'

导入之后,就封装函数,在methods里面,封装一个init函数,然后在生命周期函数mounted里面进行调用

代码语言:html
复制
    // 链接mqtt
    init() {
        console.log('启动了');
      // 连接配置选项
      let options = {
        connectTimeout: 4000, // 超时时间
        // 认证信息
        clientId: "111", //不填默认随机生成一个ID
        username: "adminVue", //用户名
        password: "123456", //密码
      };
      this.client = mqtt.connect("ws://localhost:8083/mqtt", options); //调用连接的api
      //连接成功
      this.client.on("connect", (e) => {
        console.log("连接成功", e);
      });
      //重连提醒
      this.client.on("reconnect", (error) => {
        console.log("正在重连", error);
      });
      //连接失败提醒
      this.client.on("error", (error) => {
        console.log("连接失败", error);
      });
    },

再封装一个函数end,用于断开链接,然后在组件销毁前的beforeDestroy生命周期函数中调用

代码语言:html
复制
end(){
    this.client.end()
    this.client = null
    console.log('已断开连接');
}

现在我们运行项目,然后可以在控制台看到如下

emqx中也可以看到

然后我们再封装一个函数sub,用于订阅消息,也在mounted里面调用

代码语言:html
复制
    //订阅一个信息
  sub() {
      let str = 'text'
      this.client.subscribe(str, { qos: 0 }, (err) => {
        if (!err) {
          console.log(`主题为:"${str}" 的消息订阅成功`)
        } else {
          console.log('消息订阅失败')
        }
      })
    },

然后运行之后,可以看到

使用 nodejs中连接本地emqx服务器

原理和上面类似,具体请直接看代码,我写了注释的,就在此不做解释了,要先安装mqtt,然后此处的导入,我是通过npm i mqtt 之后,然后把mqtt包中的mqtt文件单独复制出来使用了,其中监听函数可以多次使用,方便在其他地方进行数据的监听和使用

代码语言:txt
复制
const express = require('express')
const server = new express()
const mqtt = require('mqtt')  //此处导入,请参考npm官网中的mqtt导入方式,我这不是规范的

// 链接配置
const options = {
    clean: true, // true: 清除会话, false: 保留会话
    connectTimeout: 4000, // 超时时间
    // 认证信息
    clientId: '222222',
    username: 'test',
    password: '1234'
}
//ws://localhost:8083/mqtt
const connectUrl = 'mqtt://localhost:8083/mqtt'  
const client = mqtt.connect(connectUrl, options)


client.on('connect', () => {
    console.log('连接成功')
})
client.on('reconnect', (error) => {
    console.log('正在重连:', error)
})

client.on('error', (error) => {
    console.log('连接失败:', error)
})

const i = ['setM2','setM3']
//订阅setM3消息
// client.subscribe(i, (err) => {
//     console.log('订阅setM2成功')
// })

// client.on('message', (topic, message) => {
//     // const formattedTime = dayjs().format('YYYY-MM-DD HH:mm:ss')
//     console.log('收到消息:', topic, message.toString())
//     const data = JSON.parse(message)
//     console.log(data)
//   })

server.listen(6666, () => {
    console.log('正在监听6666端口');
})

连接emqx平台提供的免费云服务器

值得一提的是,我们可以使用emqx平台提供的云服务,就是说我们只要用npm的安装了mqtt的包之后,就可以进行进行云服务,然后双方都链接这个免费的云服务,然后双方订阅同一个主题,就可以实现信息交互了。

如果是连本地的mqtt服务器的话,要求双方在同一个局域网下面,而云服务的方便许多,无视距离的限制

上面的都是基于本地的,其实比较不方便,而且emqx平台也提供给个人一个免费的个人专有的云服务器,也可以进行连接,下面将演示使用免费的云服务,在vue中,其实也就是把本地的,改为云地址

代码语言:html
复制
    this.client = mqtt.connect("ws://broker.emqx.io:8083/mqtt", options); //调用连接的api

在nodejs中,地址如下,有所差异

代码语言:javascript
复制
        mqttClient = mqtt.connect('mqtt://broker.emqx.io:1883', options)

注意,这两种方式连接之前,都需要先安装好前面所提到的依赖。

我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
    • mqtt协议的粗识
      • 关于mqtt细解
        • 关于emqx平台
          • emqx的安装
            • 使用 Vue2中链接本地emqx服务端
              • 使用 nodejs中连接本地emqx服务器
                • 连接emqx平台提供的免费云服务器
                相关产品与服务
                物联网通信
                腾讯云物联网通信(Internet of Things Hub, IoT Hub)旨在提供一个安全、稳定、高效的连接平台,帮助开发者低成本、快速地实现“设备-设备”、“设备-用户应用”、“设备-云服务”之间可靠、高并发的数据通信。物联网通信平台不仅可以实现设备之间的互动、设备的数据上报和配置下发,还可以基于规则引擎和腾讯云产品打通,方便快捷地实现海量设备数据的存储、计算以及智能分析。
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档