OpenHarmony鸿蒙南向驱动开发实战:MQTT通信协议规范

94 篇文章 0 订阅
90 篇文章 0 订阅

相信MQTT这个名称大家都不陌生,物联网的开发必然会遇到MQTT相关知识的应用。那么什么是MQTT?它有什么特点?它能解决什么问题?它是如何工作的?OpenAtom OpenHarmony(以下简称“OpenHarmony”)的物联网开发者要如何使用及验证MQTT功能?接下来的内容将一一为你解答。下图为MQTT通信模型。

什么是MQTT

MQTT(Message Queuing Telemetry Transport消息队列遥测传输)是一种物联网协议,是一种客户端与服务端架构的发布/订阅模式的消息传输协议,旨在为低带宽和不稳定的网络环境中的物联网设备提供可靠的网络服务。MQTT是专门针对物联网开发的轻量级传输协议。MQTT协议针对低带宽网络,低计算能力的设备,做了特殊的优化,使得其能适应各种物联网应用场景。目前它已广泛应用于车联网、智能家居、即时聊天应用和工业互联网等领域。

MQTT的基本原理

在MQTT通讯中,有两个最为重要的角色。它们分别是服务端和客户端。

MQTT服务端

MQTT服务端通常是一台服务器。它是MQTT信息传输的枢纽,负责将MQTT客户端发送来的信息传递给MQTT客户端。MQTT服务端还负责管理MQTT客户端。确保客户端之间的通讯顺畅,保证MQTT消息得以正确接收和准确投递。

MQTT客户端

MQTT客户端可以向服务端发布信息,也可以从服务端收取信息。我们把客户端发送信息的行为称为“发布”信息。而客户端要想从服务端收取信息,则首先要向服务端“订阅”信息。“订阅”信息这一操作很像我们在视频网站订阅某一部电视剧。当这部电视剧上新后,视频网站会向订阅了该剧的用户发送信息,告诉他们有新剧上线了。

MQTT主题

刚刚我们在讲解MQTT客户端订阅信息时,使用了用户在视频网站订阅电视剧这个例子。在MQTT通讯中,客户端所订阅的肯定不是一部部电视剧,而是一个个“主题”。MQTT服务端在管理MQTT信息通讯时,就是使用“主题”来控制的。为了便于您更好理解服务端是如何通过主题来控制客户端之间的信息通讯,我们来看看下图示例:

以上图示中一共有三个MQTT客户端。它们分别是汽车、手机和电脑。在管理MQTT通讯时,MQTT服务端使用了“主题”来对信息进行管理。比如上图所示,假设我们需要利用手机和电脑获取汽车的速度,那么我们首先要利用电脑和手机向MQTT服务器订阅主题“汽车速度”。接下来,当汽车客户端向服务端的“汽车速度”主题发布信息后,服务端就会首先检查以下都有哪些客户端订阅了“汽车速度”这一主题的信息。当它发现订阅了该主题的客户端有一个手机和一台电脑,于是服务端就会将刚刚收到的“汽车速度”信息转发给订阅了该主题的手机和电脑客户端。

以上实例中,汽车是“汽车速度”主题的发布者,而手机和电脑则是该主题的订阅者。

值得注意的是,MQTT客户端在通讯时,往往角色不是单一的。它既可以作为信息发布者也可以同时作为信息订阅者。如下图所示:

上图中的所有客户端都是围绕“空调温度”这一主题进行通讯的。对于“空调温度”这一主题,手机和电脑客户端成为了MQTT信息的发布者而汽车则成为了MQTT信息的订阅者(接收者)。

可以看到,针对不同的主题,MQTT客户端可以切换自己的角色。它们可能对主题A来说是信息发布者,但是对于主题B就成了信息订阅者。

MQTT客户端开发流程

以下采用小熊派的Paho MQTT样例,简要说明MQTT的开发流程。

样例代码在OpenHarmony源码目录/device/board/bearpi/bearpi_hm_nano/app/D5_iot_mqtt,源码下载路径参考文章末尾。开发应用主要涉及以下几个API应用:

MQTT的流程主要由四个步骤组成:

1、创建客户端对象;

2、连接服务器;

3、订阅主题;

4、发布主题。

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

//订阅的回调函数

void messageArrived(MessageData *data)

{

    printf("Message arrived on topic %.*s: %.*s\n", data->topicName->lenstring.len,

        data->topicName->lenstring.data, data->message->payloadlen, data->message->payload);

}

//主流程函数

static void MQTTDemoTask(void)

{

    WifiConnect("BearPi""123456789");

    printf("Starting ...\n");

    int rc, count = 0;

    MQTTClient client;

    NetworkInit(&network);

    printf("NetworkConnect  ...\n");

    NetworkConnect(&network, MQTT_SERVERIP, MQTT_SERVERPORT);//本地电脑作为消息代理 此处为电脑IP

    printf("MQTTClientInit  ...\n");

    //1-------------创建客户端对象

    MQTTClientInit(&client, &network, MQTT_CMD_TIMEOUT_MS, sendBuf, sizeof(sendBuf), readBuf, sizeof(readBuf));

    MQTTString clientId = MQTTString_initializer;

    clientId.cstring = "bearpi";

    MQTTPacket_connectData data = MQTTPacket_connectData_initializer;

    data.clientID = clientId;

    data.willFlag = 0;

    data.MQTTVersion = MQTT_VERSION;

    data.keepAliveInterval = MQTT_KEEP_ALIVE_MS;

    data.cleansession = 1;

    printf("MQTTConnect  ...\n");

    //2-------------连接服务端

    rc = MQTTConnect(&client, &data);

    if (rc != 0) {

        printf("MQTTConnect: %d\n", rc);

        NetworkDisconnect(&network);

        MQTTDisconnect(&client);

        osDelay(MQTT_DELAY_2S);

    }

    printf("MQTTSubscribe  ...\n");

    //3-------------订阅主题substopic

    rc = MQTTSubscribe(&client, "substopic", MQTT_QOS, messageArrived);

    if (rc != 0) {

        printf("MQTTSubscribe: %d\n", rc);

        osDelay(MQTT_DELAY_2S);

    }

    while (++count) {

        MQTTMessage message;

        char payload[30];

        message.qos = MQTT_QOS;

        message.retained = 0;

        message.payload = payload;

        (void)sprintf_s(payload, sizeof(payload), "message number %d", count);

        message.payloadlen = strlen(payload);

    //4------------发布pubtopic主题

        if ((rc = MQTTPublish(&client, "pubtopic", &message)) != 0) {

            printf("Return code from MQTT publish is %d\n", rc);

            NetworkDisconnect(&network);

            MQTTDisconnect(&client);

        }

        osDelay(MQTT_DELAY_500_MS);

    }

}

  

小熊派开发板MQTT客户端代码一直循环发送主题为pubtopic的信息,信息内容为("message number %d", count),每次信息count++;

同时开发板客户端也在订阅主题为substopic的信息,一旦接收到substopic信息就会调用回调函数,串口打印出substopic主题的内容。

MQTT实操验证

如何验证MQTT客户端代码是否正常?验证过程主要涉及以下几点:

1、下载消息代理Mosquitto软件,并配置Mosquitto;

2、下载EclipsePahoMQTT工具,并用该工具创建一个客户端,我们简称客户A;

3、修改小熊派客户端MQTT代码相关配置,与第一步配置Mosquitto相匹配,小熊派客户端我们简称客户B。

简要说明下本次验证中涉及的各个模块的作用:

1、消息代理Mosquitto:可以理解为它就是MQTT服务器,所有客户端的消息(发布/订阅)都是与它通信;它负责接收及分发所有信息;

2、EclipsePahoMQTT工具创建的客户端A:我们用来与小熊派创建的客户端B进行信息交互(发布/订阅)。

详细细节:

1、下载消息代理Mosquitto软件,并配置Mosquitto:

(1)点击下载网址(https://mosquitto.org/download/),选择合适的版本,并安装(记录安装路径);

(2)安装好后,配置Mosquitto,并开启Mosquitto服务:

在Mosquitto软件的安装路径找到mosquitto.conf,打开并作如下修改:

192.168.120.137是本电脑的IP;1883指本次用来验证的服务端口号(本电脑IP192.168.120.137可以有多个服务端口);allow_anonymous true指允许客户端匿名登录;

修改配置后,在安装目录打开命令窗口,输入.\mosquitto -c .\mosquitto.conf -v。服务器启动成功后,如下图显示mosquitto version 2.0.11 starting.

2、下载EclipsePahoMQTT工具,创建客户端A,并连接服务器:

3、修改小熊派客户端MQTT代码相关配置,与第一步配置Mosquitto相匹配,小熊派客户端我们简称客户B:

修改连接端代码:

1

2

NetworkConnect(&network, 192.168.120.137, 1883);//本地电脑作为消息代理 此处为电脑IP Mosquitto相匹配

  

4、烧录代码,并操作(发布\订阅)通信:

客户端B做了两件事情:1、一直循环发送主题为pubtopic的信息,信息内容是("message number %d", count);2、订阅了主题为substopic的信息,一旦服务器有该主题信息就会发送给客户端B,客户端B会把substopic的内容打印。

客户端A也做了两件事:1、订阅主题为pubtopic的信息;2、发布一条主题为substopic的信息,内容为“Hello OpenHarmony!”。

结合客户端B(小熊派开发板)部分代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

printf("Starting ...\n");

NetworkInit(&network);

printf("NetworkConnect  ...\n");

NetworkConnect(&network, MQTT_SERVERIP, MQTT_SERVERPORT);//本地电脑作

printf("MQTTClientInit  ...\n");

//1-------------创建客户端对象

MQTTClientInit(&client, &network, MQTT_CMD_TIMEOUT_MS, sendBuf, sizeof(sendBuf), readBuf, sizeof(readBuf));

printf("MQTTConnect  ...\n");

//2-------------连接服务端

rc = MQTTConnect(&client, &data);

     

printf("MQTTSubscribe  ...\n");

//3-------------订阅主题substopic

rc = MQTTSubscribe(&client, "substopic", MQTT_QOS, messageArrived);

(void)sprintf_s(payload, sizeof(payload), "message number %d", count);

 //4------------循环发布pubtopic主题 内容为message number+connt的计数值

 MQTTPublish(&client, "pubtopic", &message)

//订阅的回调函数输出以下内容

printf("Message arrived on topic %.*s: %.*s\n", data->topicName->lenstring.len,

        data->topicName->lenstring.data, data->message->payloadlen, data->message->payload);

客户B:开发板烧录好代码后,电脑串口工具连接开发板,会有连接MQTT及订阅的信息(参照以上代码),如下图:

客户A:显示如下图:

总结

本文从讲解MQTT它是什么?原理是什么?到MQTT的应用开发(API函数接口调用例程),再到MQTT的验证(Mosquitto软件及EclipsePahoMQTT工具的使用)三个方面介绍了MQTT。希望通过本文介绍让大家对MQTT有个感性认识。

需要说明的是通常我们使用的是MQTT的解决方案,即MQTT的一系列操作被封装了,例如知识体系的智慧家居样例,在与华为IOT平台通信中,它们内部实现是基于MQTT协议搭建的。(智慧家居与华为IOT平台的相关介绍,请查看文末链接)

本文章是OpenHarmony知识体系工作组(相关链接在文章末尾)为广大开发者分享的文章。同时知识体系工作组结合日常生活,给开发者规划了各种场景的Demo样例,如智能家居场景、影音娱乐场景、运动健康场景等;欢迎广大开发者一同参与OpenHarmony的开发,一起完善样例,相互学习,相互进步。


最后

有很多小伙伴不知道学习哪些鸿蒙开发技术?不知道需要重点掌握哪些鸿蒙应用开发知识点?而且学习时频繁踩坑,最终浪费大量时间。所以有一份实用的鸿蒙(HarmonyOS NEXT)资料用来跟着学习是非常有必要的。 

点击领取→【纯血版鸿蒙全套最新学习资料】(安全链接,放心点击希望这一份鸿蒙学习资料能够给大家带来帮助,有需要的小伙伴自行领取,限时开源,先到先得~无套路领取!!

这份鸿蒙(HarmonyOS NEXT)资料包含了鸿蒙开发必掌握的核心知识要点,内容包含了(ArkTS、ArkUI开发组件、Stage模型、多端部署、分布式应用开发、音频、视频、WebGL、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、(南向驱动、嵌入式等)鸿蒙项目实战等等)鸿蒙(HarmonyOS NEXT)技术知识点。


 鸿蒙(HarmonyOS NEXT)最新学习路线

有了路线图,怎么能没有学习资料呢,小编也准备了一份联合鸿蒙官方发布笔记整理收纳的一套系统性的鸿蒙(OpenHarmony )学习手册(共计1236页)与鸿蒙(OpenHarmony )开发入门教学视频,内容包含:ArkTS、ArkUI、Web开发、应用模型、资源分类…等知识点。

获取以上完整版高清学习路线,请点击→纯血版全套鸿蒙HarmonyOS学习资料

HarmonyOS Next 最新全套视频教程

 《鸿蒙 (OpenHarmony)开发基础到实战手册》

OpenHarmony北向、南向开发环境搭建

《鸿蒙开发基础》

  • ArkTS语言
  • 安装DevEco Studio
  • 运用你的第一个ArkTS应用
  • ArkUI声明式UI开发
  • .……

《鸿蒙开发进阶》

  • Stage模型入门
  • 网络管理
  • 数据管理
  • 电话服务
  • 分布式应用开发
  • 通知与窗口管理
  • 多媒体技术
  • 安全技能
  • 任务管理
  • WebGL
  • 国际化开发
  • 应用测试
  • DFX面向未来设计
  • 鸿蒙系统移植和裁剪定制
  • ……

《鸿蒙进阶实战》

  • ArkTS实践
  • UIAbility应用
  • 网络案例
  • ……

大厂面试必问面试题

鸿蒙南向开发技术

鸿蒙APP开发必备

鸿蒙生态应用开发白皮书V2.0PDF


请点击→纯血版全套鸿蒙HarmonyOS学习资料

总结
总的来说,华为鸿蒙不再兼容安卓,对中年程序员来说是一个挑战,也是一个机会。只有积极应对变化,不断学习和提升自己,他们才能在这个变革的时代中立于不败之地。 

                   

  • 7
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是爬取某音评论区的 Python 代码: ```python import requests import json # 设置请求头 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'} # 模拟登录并获取cookies session = requests.session() login_url = 'https://passport.xiaomi.com/oauth2/login' session.get(login_url, headers=headers) login_api = 'https://account.xiaomi.com/pass/serviceLoginAuth2?_json=true' post_data = { 'sid': 'passport.xiaomi.com', 'callback': 'https://www.xiaomiyoupin.com/callback', 'qs': '%3FredirectUrl%3Dhttps%253A%252F%252Fm.xiaomiyoupin.com%252Fcomment%252Flist%253FgoodsId%253D118280%2526pageIndex%253D1%2526pageSize%253D10', '_sign': 'yR4M%2Fq%2BMFbqzFYjxZyJ3n9yMx7M%3D', 'serviceParam': '{"checkSafePhone":false}', 'service': 'mipay', 'loginTime': '1629805765', 'showExtra': 'true', 'callbackUrl': 'https://www.xiaomiyoupin.com/callback', 'qsStamp': 'eyJpdiI6InRnWU9pV1B0NzJQcHRoV3h1Zll1TlE9PSIsInZhbHVlIjoiWnZPRjN0bGY1QWpCQng5UWtWc1p4Zz09IiwibWFjIjoiYTJhMzg1ZjdhZjIwNmYzYzk0ZGJmMDY1ZjhhODM3YjQ0MjBhNjQ3YzhlZjM2NzczZjhiZmE5OGJjYjczMjBjZSJ9', 'sidTimeout': '1h', '_json': 'true', 'qsToken': 'eyJpdiI6IjJiNTdUZ21haE1aZzZmQ0xlQXh4dEE9PSIsInZhbHVlIjoiYStGXC9WQzBtRmZ1NU1Wb0tqT1ZUZz09IiwibWFjIjoiYzY2NTk0MjRlNDg0ZmY0ODRmNzU1ZGEyNTUzNzAzNzIzOWUyMzgyMjYzYjlkNjQ2ZDQ1MmRjZjNiNTQ2ZjEyZCJ9', 'deviceId': 'c7b4f0e9-b9da-31da-9c77-9b15a6b64a14', 'pwdMethod': 'pwd', 'user': 'your_account', # 替换成你的账号 'hash': 'your_password' # 替换成你的密码 } session.post(login_api, headers=headers, data=post_data) # 获取评论列表 comment_url = 'https://m.xiaomiyoupin.com/comment/list?goodsId=118280&pageIndex=1&pageSize=10' response = session.get(comment_url, headers=headers) if response.status_code == 200: result = json.loads(response.text) comments = result['data']['list'] for comment in comments: print(comment['content']) else: print('获取评论失败') ``` 需要注意的是,这个代码中的 `your_account` 和 `your_password` 需要替换成你自己的某音账号和密码。同时,由于某音评论区需要登录才能访问,所以在代码中我们先模拟登录并获取 cookies,然后再通过 cookies 访问评论列表。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值