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.鸿蒙南向开发方向

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/790705.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

上位机图像处理和嵌入式模块部署(qmacvisual亮度检测)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 前面我们说过&#xff0c;在机器视觉当中&#xff0c;对于光源的处理要非常小心。这里面不仅包括了选择什么样的光源&#xff0c;还取决于怎样使用…

WPF文本框TextEdit不以科学计数法显示

WPF文本框TextEdit不以科学计数法显示 一个float或者double类型的数值&#xff0c;如果小数点后0的个数≥4&#xff0c;在界面上就会自动以科学计数法显示&#xff0c; 比如&#xff1a;0.00003会显示成这样 但是很多时候我并不希望它这样显示&#xff0c;因为这样不方便编辑…

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单视频处理实战案例 之一 简单视频放大抖动效果

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单视频处理实战案例 之一 简单视频放大抖动效果 目录 Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单视频处理实战案例 之一 简单视频放大抖动效果 一、简单介绍 二、简单视频放大抖动效果实现原理 三、简单视频放大…

C# WPF编程-命令

C# WPF编程-命令 概述WPF命令模型ICommand接口RoutedCommand类RoutedUICommand类命令库 概述 使用路由事件可以响应广泛的鼠标和键盘事件&#xff0c;这些事件是低级的元素。在实际应用程序中&#xff0c;功能被划分成一些高级的任务。这些任务可通过各种不同的动作和用户界面…

Spring Boot 学习(2)——HelloWorld

HelloWorld&#xff01;全宇宙码农的第一个&#xff08;行&#xff09;程序&#xff08;代码&#xff09;。 1、创建项目 打开idea&#xff0c;新建一个maven项目。 1&#xff09;选择项目sdk&#xff08;本例是1.8&#xff09; 2&#xff09;输入GroupId&#xff08;co…

阿里云服务器租用价格表,100元可以买哪些配置?

2024年阿里云服务器优惠价格表&#xff0c;一张表整理阿里云服务器最新报价&#xff0c;阿里云服务器网aliyunfuwuqi.com整理云服务器ECS和轻量应用服务器详细CPU内存、公网带宽和系统盘详细配置报价单&#xff0c;大家也可以直接移步到阿里云CLUB中心查看 aliyun.club 当前最新…

CEF的了解

(14 封私信 / 80 条消息) CEF和Electron的区别是什么&#xff1f; - 知乎 (zhihu.com) Electron面向的开发者&#xff1a;会用JavaScript,HTML,CSS&#xff0c;不会C CEF面向的开发者&#xff1a;会用JavaScript,HTML,CSS&#xff0c;会C (14 封私信 / 80 条消息) liulun - …

认识什么是Git

目录 1. 认识Git 1.1. 问题引入 1.2. 概念 1.3. 作用 1.4. 如何学 1.5. Git 安装 1.6. Git配置用户信息 2. Git仓库 2.1. Git 仓库&#xff08;repository&#xff09; 2.2. 创建 2.3. 需求 3. Git的三个区域 3.1. Git 使用时的三个区域 3.2. 工作区的内容&#…

怎么快速上手虚拟化(容器)技术——以 Docker 为例

Docker 整体介绍 Docker 是一种使用 Go 语言开发的容器工具。所谓容器&#xff0c;实际上是一种虚拟化技术&#xff0c;用于为应用提供虚拟化的运行环境&#xff0c;相较于虚拟机具有轻量级、低延迟的特性。 下面是对上述介绍的说明&#xff1a; 应用程序运行需要一定的依赖…

HTML - 你如何使H5页面禁止手动缩放

难度级别:初级及以上 提问概率:40% 我们知道,这道题其实是在考察meta标签的viewport属性,正常情况下设置viewport的代码为 <head><meta name="viewport" content="width=device-width,initial-scale=1.0" …

【MATLAB】PSO_BP神经网络时序预测算法

有意向获取代码&#xff0c;请转文末观看代码获取方式~ 1 基本定义 PSO_BP神经网络时序预测算法是一种结合了粒子群优化(PSO)算法和反向传播(BP)神经网络的时序预测方法。它利用了PSO算法的全局搜索能力和BP神经网络的优化能力&#xff0c;能够更准确地预测时序数据。 具体步…

讲讲你对数据结构-线性表了解多少?

线性表 - 数组和矩阵 当谈到线性表时&#xff0c;数组和矩阵是两种常见的数据结构。 数组&#xff08;Array&#xff09;&#xff1a; 数组是有序的元素集合&#xff0c;可以通过索引来访问和操作其中的元素。它是最简单、最基本的数据结构之一。数组的特点包括&#xff1a; …

C++ | Leetcode C++题解之第7题整数反转

题目&#xff1a; 题解&#xff1a; class Solution { public:int reverse(int x) {int rev 0;while (x ! 0) {if (rev < INT_MIN / 10 || rev > INT_MAX / 10) {return 0;}int digit x % 10;x / 10;rev rev * 10 digit;}return rev;} };

wordpress课程项目主题电脑版+手机版自适应

这款主题适合做资源、课程、素材等&#xff0c;演示站&#xff1a;点击查看

八数码问题——A*算法的应用(A-Star)

文章目录 1 问题描述2 启发式搜索3 A*算法3.1 参考网址3.2 是什么3.3 为什么A*算法适用于八数码问题3.4 A* 算法的基本框架 4 A* 算法如何解决八数码问题4.1 八数码状态的存储4.2 启发式函数4.3 构造目标状态元素位置的字典4.4 在二维列表中查找目标元素4.5 A* 算法主体4.6 路径…

RUST语言函数的定义与调用

1.定义函数 定义一个RUST函数使用fn关键字 函数定义语法: fn 函数名(参数名:参数类型,参数名:参数类型) -> 返回类型 { //函数体 } 定义一个没有参数,没有返回类型的参数 fn add() {println!("调用了add函数!"); } 定义有一个参数的函数 fn add(a:u32)…

C++ //练习 11.12 编写程序,读入string和int的序列,将每个string和int存入一个pair中,pair保存在一个vector中。

C Primer&#xff08;第5版&#xff09; 练习 11.12 练习 11.12 编写程序&#xff0c;读入string和int的序列&#xff0c;将每个string和int存入一个pair中&#xff0c;pair保存在一个vector中。 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09; 工具&#x…

前端(动态雪景背景+动态蝴蝶)

1.CSS样式 <style>html, body, a, div, span, table, tr, td, strong, ul, ol, li, h1, h2, h3, p, input {font-weight: inherit;font-size: inherit;list-style: none;border-spacing: 0;border: 0;border-collapse: collapse;text-decoration: none;padding: 0;margi…

网站如何运用百度文心一言API进行AI内容创作?

网站如何运用百度文心一言API进行AI内容创作&#xff1f; 当我们做好一个网站的时候会因为创作内容而发愁&#xff0c;随着chatgpt的出现&#xff0c;内容创作已经不再是什么困难的事情&#xff0c;但是由于gpt是国外的&#xff0c;在国内使用有诸多不便&#xff0c;因此我们今…

06-编辑器

gedit编辑器 gedit是Ubuntu系统自带的编辑器&#xff0c;可以用来轻度编辑和记录一些内容。 在终端中我们通过以下命令打开&#xff1a; gedit 要打开或者新建的文件名虽然Ubuntu的图形界面也能通过gedit打开文件&#xff0c;但是用终端打开gedit可以动用更高的权限&#xff…