当前位置: 首页 > 科技观察

OpenHarmonyNeptune开发板-MQTT对接华为物联网平台

时间:2023-03-12 00:41:45 科技观察

更多内容请访问:鸿蒙科技社区https://harmonyos.51cto.com与华为联合打造官方前言:之前发过Neptune开发板-MQTT连接华为物联网平台文章,但是发现写的程序有很大的BUG,导致程序运行到开发板经常出现CPU异常(直接无法运行)和平台命令下发错误,这个和之前使用程序写了发生的问题抱歉,这次修改程序解决了CPU异常(直接无法运行)和平台命令问题错误,并测试了20~30分钟保证稳定运行,并介绍了遇到的一些问题.介绍:本示例将演示如何在Neptune开发板上使用MQTT协议连接华为IoT平台,使用ATH20温湿度传感器模块和Neptune开发板。本例中将AHT20温湿度数据上报给华为IoT平台,IoT平台下发命令控制LED灯的开关,使用W800SDK功能包中的libemqtt实现对接华为IoT平台。程序设计1.MQTT初始化voidmqtt_init(mqtt_broker_handle_t*broker,constchar*clientid);初始化连接broker的信息2.写入用户名和密码voidmqtt_init_auth(mqtt_broker_handle_t*broker,constchar*username,constchar*password);启用身份验证以连接到代理。3.建立TCP连接,编写TCP连接函数。代码示例如下:staticintinit_socket(mqtt_broker_handle_t*broker,constchar*hostname,shortport,intkeepalive){intflag=1;structhostent*hp;//创建socketif((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;}structsockaddr_insocket_address;memset(&socket_address,0,sizeof(structsockaddr_in));socket_address.sin_family=AF_INET;socket_address.sin_port=htons(port);memcpy(&(socket_address.sin_addr),hp->h_addr,hp->h_length);//连接socketif((connect(socket_id,(structsockaddr*)&socket_address,sizeof(socket_address)))<0){close_socket(&mqtt_broker);return-1;}//MQTTstuffsmqtt_set_alive(broker,mqtt_keepalive);broker->socketid=socket_id;broker->mqttsend=send_packet;fourreturn0;},建立MQTT连接intmqtt_connect(mqtt_broker_handle_t*经纪人);5.订阅MQTT编写一个函数来订阅MQTT主题。代码示例如下:staticintsubscribe_topic(char*topic)//订阅主题{unsignedshortmsg_id=0,msg_id_rcv=0;intpacket_lengthgth=0;intret=-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)(packet_lengthgth<0){printf("错误(%d)onreadpacket!\n",packet_lengthgth);close_socket(&mqtt_broker);return-1;}if(MQTTParseMessageType(pcaket_buffer)!=MQTT_MSG_SUBACK){printf("SUBACKexpected!\n");close_socket(&mqtt_broker);return-2;}msg_id_rcv=mqtt_parse_msg_id(pcaket_buffer);if(msg_id!=msg_id_rcv){printf("%dmessageid是预期的,但是%dmessageid被找到了!\n",msg_id,msg_id_rcvocket);close_&mqtt_broker);return-3;}return0;}数据推送和分析采用cJSON封装和解包(W800SDK功能包中的cJSON实现)。该包解析物联网平台命令,其他不详述。详见华为IoTDA设备接入文档:设备接入IoTDA文档,如设备属性请注意,请注意:/***************************准备车牌*******************/staticintpackPublishReq(char*jsonBuffer){cJSON*jsRet=NULL;cJSON*jsArray=NULL;intackLen=0;jsRet=cJSON_CreateObject();if(jsRet){jsArray=cJSON_CreateArray();cJSON_AddItemToObject(jsRet,"服务“,jsArray);{cJSON*arrayObj_1=cJSON_CreateObject();cJSON_AddItemToArray(jsArray,arrayObj_1);cJSON_AddStringToObject(arrayObj_1,”service_id”,”Temperature”);arrayObj_2);cJSON_AddStringToObject(arrayObj_2,"temp",Temperature.temp);温度。时间戳);}char*databuf=cJSON_PrintUnformatted(jsRet);如果(databuf){如果(jsonBuffer){ackLen=star(databuf););}tls_mem_free(databuf);}cJSON_Delete(jsRet);}returnackLen;}数据响应(重点)根据华为云物联网设备平台的命令下发文件,需要复制request_id={request_id}在下行链路到上行链路。下行和上行的request_id相同,保证平台命令数据下发成功0'接收平台下发;len=mqtt_parse_publish_msg(pcaket_buffer,&msg);strncpy(request_id,topic+63,47);sprintf(ACK_TOPIC,"%s%s",MQTT_DEMO_ACK_TOPIC,request_id);//复制request_id={request_id}我这里的问题是->strncpy(request_id,topic+63,47);之前是topic+62,之前自己创建了一个demo平台,交付成功,所以没想到,但是我这几天测试的时候发现这个问题,所以说明CPUinterruptabnormalityduetoimproperuseofthetimer,resultinginCPUinterruptabnormality,resultinginprogramcrash(tochange)HuaweiIoTplatformconfiguration,pleasereferto:BearPi-HM_NanodevelopmentboardWiFiprogrammingdevelopment-MQTTconnectionHuaweiIoTplatform(DemoIusetoexportthemodel)添加华为云IoT参数:(这只是示例,无法使用)#defineMQTT_DEMO_CLIENT_ID"616268529fff74057ddd731b_202110101314_0_0_2021101006"//ID#defineMQTT_DEMO_DEVICE_ID"616268529fff74057ddd731b_202110101314"#defineMQTT_DEMO_PASSWORD"b6fd9631cd69eee9ce565a36564b93d26760a49ace05be96cbe9dfaab91f275d"#defineMQTT_DEMO_SUB_TOPIC"$oc/devices/616268529fff74057ddd731b_202110101314/sys/commands/#"//订阅主题#defineMQTT_DEMO_PUB_TOPIC"$oc/devices/616268529fff74057ddd731b_202110101314/sys/properties/report"//发布主题#defineMQTT_DEMO_ACK_TOPIC"$oc/devices/616268529fff74057ddd731b_202110101314/sys/commands/response/"在wifi_connecter.h修改wifi热点信息示例代码Aftercompilingandburningthecode,presstheRESETbuttonofthedevelopmentboard:click"View"ontherightsideofthedevicetoenterthedevicedetailspage,andyoucanseethereporteddata.OnthedevicedetailspageoftheHUAWEICLOUDplatform,clickCommand,selectSynchronouscommanddelivery,selectthecreatedcommandattribute,andclickOKtosendandissuecommandstocontrolthedevice.总结:解决CPU频繁异常(直接无法运行)和平台命令下发错误,同时创建并使用两个定时器,一个20秒上报AHT20数据,另一个一分钟ping一次(保活),稳定运行,支持1.0和1.1版本。笔记:!!??!需要修改libemqtt.h!!!MQTT_CONF_USERNAME_LENGTH为64MQTT_CONF_PASSWORD_LENGTH为64+8clientid[50]为clientid[64]更多信息请访问:鸿蒙科技与华为共建社区https://harmonyos.51cto.com