#2023盲盒+码# OpenHarmony中使用MQTT 原创 精华

中软小助手
发布于 2023-8-23 15:47
浏览
1收藏

作者:张明伟
【本文正在参加 2023「盲盒」+码有奖征文活动】 https://ost.51cto.com/posts/25284

一.前景摘要

DES版本:DevEco Studio 3.0 Release

SDK版本:3.2.2.5 ( API9)

npm版本:6.14.16

EMQX:Linux(Ubuntu)

MQTTX:Version: v1.9.2

二.了解MQTT

1.什么是MQTT?

​ MQTT**(**消息队列遥测传输)是ISO 标准(ISO/IEC PRF 20922)下基于发布/订阅范式的消息协议。它工作在TCP/IP协议族上,是为硬件性能低下的远程设备以及网络状况糟糕的情况下而设计的发布/订阅型消息协议,为此,它需要一个消息中间件

2.MQTT特性

MQTT协议是为大量计算能力有限,且工作在低带宽、不可靠的网络的远程传感器和控制设备通讯而设计的协议,它具有以下主要的几项特性:

1、使用发布/订阅消息模式,提供一对多的消息发布,解除应用程序耦合;

2、对负载内容屏蔽的消息传输;

3、使用 TCP/IP 提供网络连接;

4、有三种消息发布服务质量:QoS(定阅等级),分0、1、2三个等级,简单来说是等级越高越可靠。

5、小型传输,开销很小(固定长度的头部是 2 字节),协议交换最小化,以降低网络流量;

6、使用 Last Will 和 Testament 特性通知有关各方客户端异常中断的机制。

3.应用场景(多客户端,少量消息)

1.车联网

2.工业互联网

3.智能家居

4.视频直播弹幕

5.IM实时聊天(一对一聊天,群组聊天)

6.推送服务,比如推送实时新闻

7.金融交易数据订阅推送

4.基本名词

1.MQTT协议中的三种身份。

MQTT Broker:代理服务器

Publish:发布者,发布消息

Subscribe:订阅者,订阅消息

2.MQTT传输的消息.

主题(Topic),负载(payload)和QoS

1)Topic:消息的类型,订阅者订阅后就会收到该主题的消息内容(payload).

2)Payload:消息的内容,指订阅者具体要使用的内容。

3)QoS:服务质量.

“至多一次”(QoS0):消息发布完全依赖底层 TCP/IP 网络。会发生消息丢失或重复。这一级别可用于如下情况,环境传感器数据,丢失一次读记录无所谓,因为不久后还会有第二次发送。即是推送之后就完事了,至于对方有没有收到,收到是什么,数据有没有丢失,都不管。

“至少一次”(QoS1):确保消息到达,但消息重复可能会发生。即是你收到推送后,你还得返回一个puback给对方,告诉对方收到了,不然对方会以为你没收到,隔一段时间后重新给你推送,直到你给对方返回一个Puback为止。

“只有一次”(QoS2):确保消息到达一次。这一级别可用于如下情况,在计费系统中,消息重复或丢失会导致不正确的结果。

3.异常中断的机制。

使用 Last Will 和 Testament 特性通知有关各方客户端

Last Will:即遗言机制,用于通知同一主题下的其他设备发送遗言的设备已经断开了连接。

Testament:遗言机制,功能类似于Last Will。

三.MQTT的简单使用

1.搭建MQTT服务器EMQX

MQTT服务器有很多种,且部署方式也不一样。

1.Linux (Ubuntu)

安装命令

curl -s https://assets.emqx.com/scripts/install-emqx-deb.sh | sudo bash

sudo apt-get install emqx :安装

sudo systemctl start emqx :启动

下载链接:https://www.emqx.io/zh/downloads?os=Ubuntu

2.Docker:https://emqx.io/zh/downloads?os=Docker

3.Linux(CentOS):https://www.emqx.io/zh/downloads?os=CentOS

4.Windows:https://www.emqx.io/zh/downloads?os=Windows

测试:确保emqx已正常运行后,可在Linux本地浏览器中输入: http://127.0.0.1:18083

 #2023盲盒+码# OpenHarmony中使用MQTT-鸿蒙开发者社区
注意:未登录需修改密码,两次保持一致。

局域网其他电脑访问须知Linux的IP地址。

2.MQTTX

1.创建连接

 #2023盲盒+码# OpenHarmony中使用MQTT-鸿蒙开发者社区

2.创建subscription

 #2023盲盒+码# OpenHarmony中使用MQTT-鸿蒙开发者社区

3.收发消息

 #2023盲盒+码# OpenHarmony中使用MQTT-鸿蒙开发者社区

#代表通配符,代表订阅所有该类型的topic

3.在OpenHarmony使用MQTT

1.安装依赖

依赖地址:https://gitee.com/openharmony-tpc/ohos_mqtt

有所不同的是我用的npm安装的依赖npm install @ohos/mqtt

2.创建Mqtt客户端

1.创建mqtt客户端并建立连接

 const clientOptions: MqttClientOptions =  {
  url: '192.168.xxx.xxx/:1883',
  clientId: 'client_id_' + new Date().getTime(),
  persistenceType: 1,
}

 const connectOptions: MqttConnectOptions = {
  userName: '',
  password: '',
  connectTimeout: 30,
}
  this.mqClient = MqttAsync.createMqtt(this.clientOptions);
  this.mqClient.connect(this.connectOptions,  (data: MqttResponse) => {
      console.log(TAG+"  data: "+JSON.stringify(data));
      if (data.code == 0) {
        this.messageArrived();
        this.subscribe('主设备号/#');
      }
    });

2.监听

//接收消息,使用此接口后,当订阅的主题有消息发布时,会自动接收到消息。

public messageArrived(): void {
  this.mqClient.messageArrived((err, data) => {
    console.log(TAG+"messageArrived!!!!!!!!!!!");
    console.log(TAG+"messageArrived data:"+JSON.stringify(data));
  });
}

3.订阅消息

// 订阅消息
public subscribe(topic: string, qos: QoS = 1): void {
  const subscribeOption: MqttSubscribeOptions = { topic, qos };
  this.mqClient.subscribe(subscribeOption, (err, data)=>{
      this.handleMessage(data)
  });
}

4.发布消息

  // 发布消息
  public publish<T>(topic: string, payload: string | Record<string, any>,  qos: QoS = 0): void {
    if (typeof payload !== 'string') {
      payload = JSON.stringify(payload)
    }
    const payloadLen = payload.length;
    const publishOption: MqttPublishOptions = { topic, payload, qos, payloadLen };
    console.log(TAG, 'publishOption data: ' + JSON.stringify(publishOption));
    this.mqClient.publish(publishOption, (err, data)=>{
       console.log(TAG+"publish!!!!!!!!!!!");
    console.log(TAG+"publish data:"+JSON.stringify(data));
  }));
  }

5.根据订阅的消息的主题的不同进行不同的处理

handleMessage(data:any){
     console.log(TAG+"subscribe!!!!!!!!!!!");
    console.log(TAG+"subscribe data:"+JSON.stringify(data));
  //根据data的不同进行不同的处理
}

四.扩展

mqtt与MQ中间件的关系

消息中间件是基于队列与消息传递技术,在网络环境中为应用系统提供同步或异步、可靠的消息传输的支撑性软件系统

MQTT 与消息队列有一定的区别,队列是一种先进先出的数据结构,消息队列常用于应用服务层面,实现参考如 RabbitMQ Kafka RocketMQ;

MQTT 是传输协议,绝大部分 MQTT Broker 不保证消息顺序(Queue),常用语物联网、消息传输等。

参考资料:

OpenHarmony-TPC/ohos_mqtt

EMQX官网

MQTT服务器( emqx )搭建

MQTT

更多原创内容请关注:中软国际 HarmonyOS 技术团队

入门到精通、技巧到案例,系统化分享HarmonyOS开发技术,欢迎投稿和订阅,让我们一起携手前行共建鸿蒙生态。

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
已于2023-8-24 09:23:55修改
6
收藏 1
回复
举报
7条回复
按时间正序
/
按时间倒序
中软应用小开发
中软应用小开发

MQTT在物联网领域有着广泛的应用,尤其适用于需要实时通信和数据共享的场景,此文章的实现方案带来了很大的帮助以及对MQTT的了解。

回复
2023-8-23 17:06:15
红叶亦知秋
红叶亦知秋

老师,图片好像挂了,方便补下吗

回复
2023-8-23 18:09:51
中软小助手
中软小助手 回复了 红叶亦知秋
老师,图片好像挂了,方便补下吗

好的 感谢反馈

回复
2023-8-24 09:16:49
香菜太难吃了
香菜太难吃了

随着5G的推行和硬件性能的提升,MQTT会被淘汰吗

回复
2023-8-24 11:13:42
带带小老弟
带带小老弟

很完整的实现流程

回复
2023-8-24 17:21:51
liurick
liurick 回复了 香菜太难吃了
随着5G的推行和硬件性能的提升,MQTT会被淘汰吗

5G还没那么强大

回复
2023-8-25 11:32:35
安苒anran0
安苒anran0 回复了 香菜太难吃了
随着5G的推行和硬件性能的提升,MQTT会被淘汰吗

不会,性能越高,价格越高。低成本的需求会一直存在。

回复
2023-8-29 17:40:09
回复
    相关推荐