OpenHarmony Neptune开发板-MQTT连接华为IoT平台

2024-04-04 03:12

本文主要是介绍OpenHarmony Neptune开发板-MQTT连接华为IoT平台,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本示例将演示如何在Neptune开发板上使用MQTT协议连接华为IoT平台,使用的是ATH20温湿度传感器模块与Neptune开发板

本示例实现AHT20温湿度数据上报华为IoT平台,IoT平台下发命令控制LED灯的开关

使用W800 SDK功能包中libemqtt来实现连接华为IoT平台

程序设计

初始化

一、MQTT初始化

void mqtt_init(mqtt_broker_handle_t* broker, const char* clientid);

初始化要连接到代理的信息

参数描述
broker代理数据结构,包含与代理的连接信息
clientIdclientId标识客户端ID
返回描述

二、写入username与password

void mqtt_init_auth(mqtt_broker_handle_t* broker, const char* username, const char* password);

启用身份验证以连接到代理。

参数描述
broker代理数据结构,包含与代理的连接信息
username用户名
password密码
返回描述

三、建立TCP连接

编写TCP连接函数,代码示例如下:
static int init_socket(mqtt_broker_handle_t *broker, const char *hostname, short port, int keepalive)
{int flag = 1;struct hostent *hp;// 创建套接字if((socket_id = socket(PF_INET, SOCK_STREAM, 0)) < 0)return -1;// 禁用Nagle算法if (setsockopt(socket_id, IPPROTO_TCP, 0x01, (char *)&flag, sizeof(flag)) < 0){close_socket(&mqtt_broker);return -2;}// 查询主机IP启动hp = gethostbyname(hostname);if (hp == NULL ){close_socket(&mqtt_broker);return -2;}struct sockaddr_in socket_address;memset(&socket_address, 0, sizeof(struct sockaddr_in));socket_address.sin_family = AF_INET;socket_address.sin_port = htons(port);memcpy(&(socket_address.sin_addr), hp->h_addr, hp->h_length);// 连接套接字if((connect(socket_id, (struct sockaddr *)&socket_address, sizeof(socket_address))) < 0){close_socket(&mqtt_broker);return -1;}// MQTT stuffsmqtt_set_alive(broker, mqtt_keepalive);broker->socketid = socket_id;broker->mqttsend = send_packet;return 0;
}

四、建立MQTT连接

int mqtt_connect(mqtt_broker_handle_t* broker);

参数描述
broker代理数据结构,包含与代理的连接信息
返回描述
1成功
0连接错误
-1输入输出错误

五、订阅MQTT

编写订阅MQTT主题函数,代码示例如下:

static int subscribe_topic(char *topic)//订阅主题
{unsigned short msg_id = 0, msg_id_rcv = 0;int packet_lengthgth = 0;int ret = -1;if(topic == NULL) {return -1;}ret = mqtt_subscribe(&mqtt_broker, topic, &msg_id);if( ret == -1 ) {close_socket(&mqtt_broker);return -1;}packet_lengthgth = read_packet(MQTT_DEMO_READ_TIME_SEC, MQTT_DEMO_READ_TIME_US);if(packet_lengthgth < 0){printf("Error(%d) on read packet!\n", packet_lengthgth);close_socket(&mqtt_broker);return -1;}if(MQTTParseMessageType(pcaket_buffer) != MQTT_MSG_SUBACK){printf("SUBACK expected!\n");close_socket(&mqtt_broker);return -2;}msg_id_rcv = mqtt_parse_msg_id(pcaket_buffer);if(msg_id != msg_id_rcv){printf("%d message id was expected, but %d message id was found!\n", msg_id, msg_id_rcv);close_socket(&mqtt_broker);return -3;}return 0;
}

数据推送与解析

采用cJSON封包与解包(使用W800 SDK功能包中cJSON实现),共有两个封包(一个设备属性上报,一个命令应答上报),一个解包解析IoT平台命令,其他不过多赘述具体详见华为IoTDA 设备接入文档:

例如设备属性上报,代码示例如下:

static int packPublishReq(char *jsonBuffer)//打包发布请求
{cJSON *jsRet = NULL;cJSON *jsArray = NULL;int ackLen = 0;jsRet = cJSON_CreateObject();if(jsRet){   jsArray = cJSON_CreateArray();cJSON_AddItemToObject(jsRet, "services", jsArray);{cJSON *arrayObj_1 = cJSON_CreateObject();cJSON_AddItemToArray(jsArray, arrayObj_1);cJSON_AddStringToObject(arrayObj_1, "service_id", "Temperature");cJSON *arrayObj_2 = cJSON_CreateObject();cJSON_AddItemToObject(arrayObj_1, "properties", arrayObj_2);cJSON_AddStringToObject(arrayObj_2, "temp", Temperature.temp);cJSON_AddStringToObject(arrayObj_2, "humi", Temperature.humi);cJSON_AddStringToObject(arrayObj_2, "led",  Temperature.ON_OFF);cJSON_AddStringToObject(arrayObj_1,"event_time", Temperature.timestamp);}char *databuf = cJSON_PrintUnformatted(jsRet);if(databuf) {if( jsonBuffer ) {ackLen = strlen(databuf);memcpy( jsonBuffer, databuf,ackLen);}tls_mem_free(databuf);}cJSON_Delete(jsRet); }return ackLen;
}

华为IoT平台配置(以导出模型model.zip直接导入即可)

登录

设备接入华为云平台之前,需要在平台注册用户账号,华为云地址:

在华为云首页单击产品,找到IoT物联网,单击设备接入IoTDA 并单击立即使用。

创建产品

在设备接入页面可看到总览界面,展示了华为云平台接入的协议与域名信息,根据需要选取MQTT通讯必要的信息备用。

接入协议(端口号):MQTT 1883

域名:iot-mqtts.cn-north-4.myhuaweicloud.com

选中侧边栏产品页,单击右上角“创建产品”

在页面中选中所属资源空间,并且按要求填写产品名称,选中MQTT协议,数据格式为JSON,并填写厂商名称,在下方模型定义栏中选择所属行业以及添加设备类型,并单击右下角“立即创建”如图:

创建完成后,在产品页会自动生成刚刚创建的产品,单击“查看”可查看创建的具体信息。

单击产品详情页的自定义模型,在弹出页面中新增服务

服务ID:Temperature(必须一致)

服务类型:senser(可自定义)

在“Temperature”的下拉菜单下点击“添加属性”填写相关信息“temp”,“humi”,“led”。

在“Temperature”的下拉菜单下点击“添加命令”填写相关信息。

注册设备

在侧边栏中单击“设备”,进入设备页面,单击右上角“注册设备”,勾选对应所属资源空间并选中刚刚创建的产品,注意设备认证类型选择“秘钥”,按要求填写秘钥。

修改代码中设备信息

在连接平台前需要获取CLIENT_ID、USERNAME、PASSWORD 这里,访问,填写注册设备时生成的设备ID和设备密钥生成连接信息(ClientId、Username、Password),并将修改代码对应位置。

在wifi_connecter.h修改wifi热点信息

示例代码编译烧录代码后,按下开发板的RESET按键:

点击设备右侧的“查看”,进入设备详情页面,可看到上报的数据

在华为云平台设备详情页,单击“命令”,选择同步命令下发,选中创建的命令属性,单击“确定”,即可发送下发命令控制设备

注意:!!!需要将libemqtt.h下!!!
MQTT_CONF_USERNAME_LENGTH 修改为64
MQTT_CONF_PASSWORD_LENGTH 修改为64+8
clientid[50]修改为clientid[64]

为了能让大家更好的学习鸿蒙(HarmonyOS NEXT)开发技术,这边特意整理了《鸿蒙开发学习手册》(共计890页),希望对大家有所帮助:https://qr21.cn/FV7h05

《鸿蒙开发学习手册》:

如何快速入门:https://qr21.cn/FV7h05

  1. 基本概念
  2. 构建第一个ArkTS应用
  3. ……

开发基础知识:https://qr21.cn/FV7h05

  1. 应用基础知识
  2. 配置文件
  3. 应用数据管理
  4. 应用安全管理
  5. 应用隐私保护
  6. 三方应用调用管控机制
  7. 资源分类与访问
  8. 学习ArkTS语言
  9. ……

基于ArkTS 开发:https://qr21.cn/FV7h05

  1. Ability开发
  2. UI开发
  3. 公共事件与通知
  4. 窗口管理
  5. 媒体
  6. 安全
  7. 网络与链接
  8. 电话服务
  9. 数据管理
  10. 后台任务(Background Task)管理
  11. 设备管理
  12. 设备使用信息统计
  13. DFX
  14. 国际化开发
  15. 折叠屏系列
  16. ……

鸿蒙开发面试真题(含参考答案):https://qr18.cn/F781PH

鸿蒙开发面试大盘集篇(共计319页):https://qr18.cn/F781PH

1.项目开发必备面试题
2.性能优化方向
3.架构方向
4.鸿蒙开发系统底层方向
5.鸿蒙音视频开发方向
6.鸿蒙车载开发方向
7.鸿蒙南向开发方向

这篇关于OpenHarmony Neptune开发板-MQTT连接华为IoT平台的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/874667

相关文章

Redis客户端连接机制的实现方案

《Redis客户端连接机制的实现方案》本文主要介绍了Redis客户端连接机制的实现方案,包括事件驱动模型、非阻塞I/O处理、连接池应用及配置优化,具有一定的参考价值,感兴趣的可以了解一下... 目录1. Redis连接模型概述2. 连接建立过程详解2.1 连php接初始化流程2.2 关键配置参数3. 最大连

Linux之platform平台设备驱动详解

《Linux之platform平台设备驱动详解》Linux设备驱动模型中,Platform总线作为虚拟总线统一管理无物理总线依赖的嵌入式设备,通过platform_driver和platform_de... 目录platform驱动注册platform设备注册设备树Platform驱动和设备的关系总结在 l

Python实现MQTT通信的示例代码

《Python实现MQTT通信的示例代码》本文主要介绍了Python实现MQTT通信的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 安装paho-mqtt库‌2. 搭建MQTT代理服务器(Broker)‌‌3. pytho

C#连接SQL server数据库命令的基本步骤

《C#连接SQLserver数据库命令的基本步骤》文章讲解了连接SQLServer数据库的步骤,包括引入命名空间、构建连接字符串、使用SqlConnection和SqlCommand执行SQL操作,... 目录建议配合使用:如何下载和安装SQL server数据库-CSDN博客1. 引入必要的命名空间2.

Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式

《Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式》本文详细介绍如何使用Java通过JDBC连接MySQL数据库,包括下载驱动、配置Eclipse环境、检测数据库连接等关键步骤,... 目录一、下载驱动包二、放jar包三、检测数据库连接JavaJava 如何使用 JDBC 连接 mys

Qt使用QSqlDatabase连接MySQL实现增删改查功能

《Qt使用QSqlDatabase连接MySQL实现增删改查功能》这篇文章主要为大家详细介绍了Qt如何使用QSqlDatabase连接MySQL实现增删改查功能,文中的示例代码讲解详细,感兴趣的小伙伴... 目录一、创建数据表二、连接mysql数据库三、封装成一个完整的轻量级 ORM 风格类3.1 表结构

Java MQTT实战应用

《JavaMQTT实战应用》本文详解MQTT协议,涵盖其发布/订阅机制、低功耗高效特性、三种服务质量等级(QoS0/1/2),以及客户端、代理、主题的核心概念,最后提供Linux部署教程、Sprin... 目录一、MQTT协议二、MQTT优点三、三种服务质量等级四、客户端、代理、主题1. 客户端(Clien

MySQL中的表连接原理分析

《MySQL中的表连接原理分析》:本文主要介绍MySQL中的表连接原理分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、环境3、表连接原理【1】驱动表和被驱动表【2】内连接【3】外连接【4编程】嵌套循环连接【5】join buffer4、总结1、背景

如何在Spring Boot项目中集成MQTT协议

《如何在SpringBoot项目中集成MQTT协议》本文介绍在SpringBoot中集成MQTT的步骤,包括安装Broker、添加EclipsePaho依赖、配置连接参数、实现消息发布订阅、测试接口... 目录1. 准备工作2. 引入依赖3. 配置MQTT连接4. 创建MQTT配置类5. 实现消息发布与订阅

SpringBoot连接Redis集群教程

《SpringBoot连接Redis集群教程》:本文主要介绍SpringBoot连接Redis集群教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 依赖2. 修改配置文件3. 创建RedisClusterConfig4. 测试总结1. 依赖 <de