-
连接IoT平台的业务场景有哪些?
-
1. 前言随着智能家居的快速发展,智能门锁作为家庭安全的重要组成部分,受到了越来越多用户的关注和需求。为了满足用户对安全和便捷的需求,决定设计一款基于STM32的智能门锁,并将其与华为云IOT平台相结合。传统的门锁存在一些弊端,比如使用钥匙容易丢失、开锁过程繁琐等。而智能门锁的出现,有效地解决了这些问题。我选择使用STM32作为智能门锁的核心控制器,因为STM32系列具有低功耗、高性能和丰富的外设接口等优点,非常适合嵌入式应用。华为云IOT平台作为一个强大的云服务平台,提供了丰富的物联网解决方案和强大的数据处理能力。将智能门锁与华为云IOT平台相结合,可以实现远程控制、数据监测和智能化的功能,为用户带来更加便捷和安全的居家体验。智能门锁设计具有以下主要特点和功能:安全可靠:采用先进的加密算法和身份验证机制,确保门锁的安全性。用户可以通过手机APP、指纹识别或密码等方式进行开锁,有效防止非法入侵。远程控制:通过与华为云IOT平台的连接,用户可以通过手机APP在任何地方实现对门锁的远程控制。比如,可以远程开关门锁、查看开锁记录等。多种开锁方式:除了传统的钥匙开锁方式外,我们的智能门锁还支持多种开锁方式,如指纹识别、密码输入、手机APP控制等。用户可以根据自己的需求选择最方便的开锁方式。实时监测:智能门锁可以实时监测门锁状态、开锁记录等信息,并将这些数据上传到华为云IOT平台进行存储和分析。用户可以通过手机APP查看相关数据,了解家庭安全状况。智能化功能:基于华为云IOT平台的数据处理能力,我们的智能门锁还可以实现一些智能化的功能。比如,可以设置自动开锁时间、远程授权开锁等。2. 设备硬件与功能介绍这篇文章就介绍如何使用华为物联网云平台实现智能锁的应用场景构建,硬件采用STM32F103ZET6 + ESP8266+步进电机实现。在华为云IOT物联网平台构建智能锁项目,配置好云端,设备端通过ESP8266连接华为物联网平台,实现数据上报,交互,实现远程开锁、关锁、获取锁的状态等功能,不用担心忘记出门关锁,也不用担心忘记带钥匙无法开门的情况。ESP8266是物联网解决方案里比较热门的WIFI设备,支持串口+AT指令控制,任意支持串口的单片机都可以使用ESP8266快速实现联网。步进电机采用常规28BYJ-48来模拟当做门锁的电机,驱动板采用ULN2003。3. 创建云端设备登录官网: cid:link_3直接搜索物联网,打开页面。选择设备接入:选择免费试用:在产品页面,点击右上角创建产品:填上产品信息:得到产品ID,保存好ID,点击查看详情:产品ID为:61b9ba3a2b2aa20288c1e7f1.点击设备页面,注册设备:填充信息进行注册:保存设备密匙和设备ID,点击保存关闭会自动下载文件保存,后面生成密码和登录账号需要使用关闭后就看到创建好的设备了:点击产品页面,选择刚才创建的产品:选择自定义模型---创建数据模型服务:选择新增属性,创建设备的属性4. 创建MQTT登录账号和密匙设备创建完成接来下生成MQTT登录账号、密匙,方便设备登录云端平台。官网工具地址: cid:link_1打开刚才创建设备时,下载的密匙文件,把内容复制出来对应的填进去,生成即可。5. 拼接主题订阅与发布的格式官方文档介绍: cid:link_0在产品页面可以,看到主题的全部格式:总结的格式如下: 格式: $oc/devices/{device_id}/sys/messages/down //订阅主题: 平台下发消息给设备 $oc/devices/61b9ba3a2b2aa20288c1e7f1_QQ1126626497_0_0_2021121510/sys/messages/down 格式: $oc/devices/{device_id}/sys/properties/report //设备上报数据 $oc/devices/61b9ba3a2b2aa20288c1e7f1_QQ1126626497_0_0_2021121510/sys/properties/report 上属性的数据格式: //上报的属性消息 (一次可以上报多个属性,在json里增加就行了) {"services": [{"service_id": "lock","properties":{"门锁":1}}]}上面属性里的服务ID和属性里的名称,在设备页面,影子设备页面查看。6. MQTT客户端模拟设备登录云端下面使用MQTT客户端模拟设备登录服务器测试,看设备创建的是否OK。服务器的IP地址是: 121.36.42.100端口号是: 1883打开MQTT客户端软件,按照提示,输入相关参数后,点击连接,然后再点击订阅主题,发布主题即可:查看云端服务器的情况: 可以看到设备已经在线了,并且收到上传的数据。修改一下锁的状态,上报属性再查看:发现云端的状态也已经改变,现在设备上报已经OK。接下来测试命令下发,实现远程开锁关锁的功能:打开产品页面,新增加命令:命令添加成功:在设备页面,选择同步命令下发:点击确定后,查看MQTT客户端,发现已经收到数据了:$oc/devices/61b9ba3a2b2aa20288c1e7f1_QQ1126626497/sys/commands/request_id=88e2626f-290d-405e-962d-51554445a8fd{"paras":{"lock":1},"service_id":"lock","command_name":"lock"}设备端解析收到的数据,就可以完成多步进电机的控制,完成开锁关锁。7. STM32+ESP8266连接云端工程是keil5工程项目源码与视频演示:cid:link_2main函数代码如下: #include "stm32f10x.h" #include "led.h" #include "delay.h" #include "key.h" #include "usart.h" #include < string.h > #include "timer.h" #include "bluetooth.h" #include "esp8266.h" #include "mqtt.h" //华为物联网服务器的设备信息 #define MQTT_ClientID "61b9ba3a2b2aa20288c1e7f1_QQ1126626497_0_0_2021121510" #define MQTT_UserName "61b9ba3a2b2aa20288c1e7f1_QQ1126626497" #define MQTT_PassWord "385ce91dfe7da5b7431868d5d87e7998163c493344040935d5a00024d6324242" //订阅与发布的主题 #define SET_TOPIC "$oc/devices/61b9ba3a2b2aa20288c1e7f1_QQ1126626497_0_0_2021121510/sys/messages/down" //订阅 #define POST_TOPIC "$oc/devices/61b9ba3a2b2aa20288c1e7f1_QQ1126626497_0_0_2021121510/sys/properties/report" //发布 char mqtt_message[200];//上报数据缓存区 int main() { u32 time_cnt=0; u32 i; u8 key; LED_Init(); BEEP_Init(); KEY_Init(); USART1_Init(115200); TIMER1_Init(72,20000); //超时时间20ms USART2_Init(9600);//串口-蓝牙 TIMER2_Init(72,20000); //超时时间20ms USART3_Init(115200);//串口-WIFI TIMER3_Init(72,20000); //超时时间20ms USART1_Printf("正在初始化WIFI请稍等.\\n"); if(ESP8266_Init()) { USART1_Printf("ESP8266硬件检测错误.\\n"); } else { //非加密端口 USART1_Printf("WIFI:%d\\n",ESP8266_STA_TCP_Client_Mode("CMCC-Cqvn","99pu58cb","121.36.42.100",1883,1)); } //2. MQTT协议初始化 MQTT_Init(); //3. 连接华为服务器 while(MQTT_Connect(MQTT_ClientID,MQTT_UserName,MQTT_PassWord)) { USART1_Printf("服务器连接失败,正在重试...\\n"); delay_ms(500); } USART1_Printf("服务器连接成功.\\n"); //3. 订阅主题 if(MQTT_SubscribeTopic(SET_TOPIC,0,1)) { USART1_Printf("主题订阅失败.\\n"); } else { USART1_Printf("主题订阅成功.\\n"); } while(1) { key=KEY_Scan(0); if(key==2) { time_cnt=0; sprintf(mqtt_message,"{"services": [{"service_id": "lock","properties":{"门锁":1}}]}"); MQTT_PublishData(POST_TOPIC,mqtt_message,0); USART1_Printf("发送状态1\\r\\n"); } else if(key==3) { time_cnt=0; sprintf(mqtt_message,"{"services": [{"service_id": "lock","properties":{"门锁":0}}]}"); MQTT_PublishData(POST_TOPIC,mqtt_message,0); USART1_Printf("发送状态0\\r\\n"); } if(USART3_RX_FLAG) { USART3_RX_BUFFER[USART3_RX_CNT]='\\0'; for(i=0;i< USART3_RX_CNT;i++) { USART1_Printf("%c",USART3_RX_BUFFER[i]); } USART3_RX_CNT=0; USART3_RX_FLAG=0; } //定时发送心跳包,保持连接 delay_ms(10); time_cnt++; if(time_cnt==500) { MQTT_SentHeart();//发送心跳包 time_cnt=0; } } }
-
物联网鸿蒙应用入门级开发者认证(HCCDA–IoT HarmonyOS Apps)实验资源,详见附件;请登录个人华为帐号,然后下载附件。
-
一、项目背景随着智能家居技术的不断发展,人们对于家居生活的需求也越来越高。智能窗帘作为智能家居领域的重要组成部分,为用户提供了更便捷、舒适的生活体验。本项目基于STM32主控芯片和华为云物联网平台,设计一款智能窗帘控制系统,以满足家庭和商业场所的需求。在本项目中,选择了STM32F103ZET6作为主控芯片具有强大的处理能力和丰富的外设接口,适合用于物联网设备的控制和通信。通过与ESP8266-WIFI模块的连接,可以实现智能窗帘与华为云物联网平台的互联互通,实现远程控制和监测。为了方便用户的操作和控制,使用Qt开发了Android手机APP和Windows上位机软件,用户可以通过这些应用程序进行窗帘的远程控制。同时,本地窗帘也支持手动控制,用户可以通过物理按钮或开关来操作窗帘的开关、升降等功能。在智能化方面,引入了语音识别技术(LD3320模块),用户可以通过语音指令来控制窗帘的运行。这为用户提供了更加便捷、智能的控制方式,使得窗帘的操作更加自然和智能化。除了远程控制和智能化功能,还引入了自动模式。在自动模式下,系统会根据环境条件进行智能判断和控制。例如,当检测到阳光强度超过设定阈值时,系统会自动关闭窗帘,以避免阳光直射室内;在晚上时,系统也会自动拉上窗帘,提供更好的隐私和安全性。本智能窗帘控制系统基于STM32主控芯片和华为云物联网平台,结合语音识别、智能家居控制等功能,为家庭和1商业场所提供便捷、舒适的智能化服务。通过远程控制、自动模式和智能化功能,用户可以实现对窗帘的灵活、智能的控制,提升生活质量和用户体验。二、硬件选型在设计智能窗帘控制系统的硬件方案时,需要考虑主控芯片、通信模块和传感器等关键组件的选型。以下是当前系统的具体硬件选型:【1】主控芯片:采用STM32F103ZET6作为主控芯片。具备强大的处理能力和丰富的外设接口,适合用于物联网设备的控制和通信。可以驱动各种传感器和执行器,并与ESP8266-WIFI模块和LD3320语音识别模块进行通信。【2】通信模块:选择了ESP8266-WIFI模块作为通信模块,用于连接华为云物联网平台。ESP8266-WIFI模块具有低功耗、高集成度和稳定的无线连接能力,能够实现智能窗帘与互联网的互联互通。【3】光照传感器:采用BH1750光照传感器来检测光照强度。BH1750是一种数字式光强度传感器,能够准确测量环境光的强度。通过获取光照强度数据,系统可以根据设定的阈值来判断是否需要自动拉窗帘。【4】语音识别模块:选择了LD3320语音识别模块,用于实现语音控制功能。LD3320是一种高性能语音识别芯片,能够实现对语音指令的识别和解析。通过语音识别模块,用户可以通过语音指令来控制窗帘的开合和模式切换。【5】电机和驱动模块:选择了28BYJ40步进电机作为窗帘控制的电机,并使用ULN2003驱动模块来驱动电机。28BYJ40步进电机具有较高的精度和稳定性,适合用于窗帘的控制。ULN2003是一种高电压、高电流驱动芯片,能够提供足够的电流和电压来驱动步进电机。【6】用户界面设备:采用Qt开发Android手机APP和Windows上位机来实现用户界面。通过这两个界面,用户可以进行远程控制窗帘的操作,包括开关窗帘、调整窗帘的开合程度和切换窗帘的工作模式。三、系统设计智能窗帘控制系统的软件设计主要包括主控程序、通信模块驱动、传感器驱动和用户界面等部分。以下是系统软件设计的思路:【1】主控程序:主控程序是系统的核心,负责控制窗帘的运行、处理传感器数据、与通信模块进行通信等。主控程序需要实现以下功能:初始化各个硬件模块,包括通信模块、传感器和电机驱动等。循环读取传感器数据,根据数据进行窗帘的控制和判断。处理用户的控制指令,包括远程控制指令和本地控制指令。与通信模块进行通信,实现与华为云物联网平台的互联互通。实现自动模式下的智能判断和控制逻辑。【2】通信模块驱动:通信模块驱动负责与华为云物联网平台进行通信,实现远程控制和数据传输。通信模块驱动需要实现以下功能:初始化通信模块,建立与华为云物联网平台的连接。接收来自云平台的控制指令,解析指令内容。将传感器数据和窗帘状态等信息上传到云平台,实现实时监测和数据传输。【3】传感器驱动:传感器驱动负责与光敏传感器、时间传感器等传感器进行交互,获取环境数据。传感器驱动需要实现以下功能:初始化传感器,配置传感器的工作模式和参数。定期读取传感器数据,包括光敏传感器的光强度和时间传感器的时间信息。将传感器数据传递给主控程序,供其进行判断和控制。【4】用户界面:用户界面是用户与系统进行交互的界面,可以通过Android手机APP或Windows上位机软件实现。用户界面需要实现以下功能:显示窗帘的状态和实时数据,如光强度、时间。提供远程控制窗帘的功能,包括开关、升降和自动模式的切换。接收用户的控制指令,将指令传递给主控程序进行处理。三、部署华为云物联网平台华为云官网: cid:link_12打开官网,搜索物联网,就能快速找到 设备接入IoTDA。3.1 物联网平台介绍华为云物联网平台(IoT 设备接入云服务)提供海量设备的接入和管理能力,将物理设备联接到云,支撑设备数据采集上云和云端下发命令给设备进行远程控制,配合华为云其他产品,帮助我们快速构筑物联网解决方案。使用物联网平台构建一个完整的物联网解决方案主要包括3部分:物联网平台、业务应用和设备。物联网平台作为连接业务应用和设备的中间层,屏蔽了各种复杂的设备接口,实现设备的快速接入;同时提供强大的开放能力,支撑行业用户构建各种物联网解决方案。设备可以通过固网、2G/3G/4G/5G、NB-IoT、Wifi等多种网络接入物联网平台,并使用LWM2M/CoAP、MQTT、HTTPS协议将业务数据上报到平台,平台也可以将控制命令下发给设备。业务应用通过调用物联网平台提供的API,实现设备数据采集、命令下发、设备管理等业务场景。3.2 开通物联网服务地址: cid:link_10进来默认会提示开通标准版,在2023的1月1号年之后没有基础版了。开通之后,点击总览,查看接入信息。 我们当前设备准备采用MQTT协议接入华为云平台,这里可以看到MQTT协议的地址和端口号等信息。总结:端口号: MQTT (1883)| MQTTS (8883) 接入地址: 7445c6bcd3.st1.iotda-app.cn-north-4.myhuaweicloud.com根据域名地址得到IP地址信息:Microsoft Windows [版本 10.0.19044.2728](c) Microsoft Corporation。保留所有权利。C:\Users\11266>ping 7445c6bcd3.st1.iotda-device.cn-north-4.myhuaweicloud.com正在 Ping 7445c6bcd3.st1.iotda-device.cn-north-4.myhuaweicloud.com [117.78.5.125] 具有 32 字节的数据:来自 117.78.5.125 的回复: 字节=32 时间=42ms TTL=30来自 117.78.5.125 的回复: 字节=32 时间=35ms TTL=30来自 117.78.5.125 的回复: 字节=32 时间=36ms TTL=30来自 117.78.5.125 的回复: 字节=32 时间=36ms TTL=30117.78.5.125 的 Ping 统计信息: 数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),往返行程的估计时间(以毫秒为单位): 最短 = 35ms,最长 = 42ms,平均 = 37msC:\Users\11266>MQTT协议接入端口号有两个,1883是非加密端口,8883是证书加密端口,单片机无法加载证书,所以使用1883端口比较合适。 接下来的ESP8266就采用1883端口连接华为云物联网平台。3.3 创建产品(1)创建产品点击产品页,再点击左上角创建产品。(2)填写产品信息根据自己产品名字填写。(3)产品创建成功(4)添加自定义模型产品创建完成之后,点击进入产品详情页面,翻到最下面可以看到模型定义。先点击自定义模型。再创建一个服务ID。接着点击新增属性。3.4 添加设备产品是属于上层的抽象模型,接下来在产品模型下添加实际的设备。添加的设备最终需要与真实的设备关联在一起,完成数据交互。(1)注册设备(2)根据自己的设备填写(3)保存设备信息创建完毕之后,点击保存并关闭,得到创建的设备密匙信息。该信息在后续生成MQTT三元组的时候需要使用。(4) 设备创建完成3.5 MQTT协议主题订阅与发布(1)MQTT协议介绍当前的设备是采用MQTT协议与华为云平台进行通信。MQTT是一个物联网传输协议,它被设计用于轻量级的发布/订阅式消息传输,旨在为低带宽和不稳定的网络环境中的物联网设备提供可靠的网络服务。MQTT是专门针对物联网开发的轻量级传输协议。MQTT协议针对低带宽网络,低计算能力的设备,做了特殊的优化,使得其能适应各种物联网应用场景。目前MQTT拥有各种平台和设备上的客户端,已经形成了初步的生态系统。MQTT是一种消息队列协议,使用发布/订阅消息模式,提供一对多的消息发布,解除应用程序耦合,相对于其他协议,开发更简单;MQTT协议是工作在TCP/IP协议上;由TCP/IP协议提供稳定的网络连接;所以,只要具备TCP协议栈的网络设备都可以使用MQTT协议。 本次设备采用的ESP8266就具备TCP协议栈,能够建立TCP连接,所以,配合STM32代码里封装的MQTT协议,就可以与华为云平台完成通信。华为云的MQTT协议接入帮助文档在这里: cid:link_8业务流程:(2)华为云平台MQTT协议使用限制描述限制支持的MQTT协议版本3.1.1与标准MQTT协议的区别支持Qos 0和Qos 1支持Topic自定义不支持QoS2不支持will、retain msgMQTTS支持的安全等级采用TCP通道基础 + TLS协议(最高TLSv1.3版本)单帐号每秒最大MQTT连接请求数无限制单个设备每分钟支持的最大MQTT连接数1单个MQTT连接每秒的吞吐量,即带宽,包含直连设备和网关3KB/sMQTT单个发布消息最大长度,超过此大小的发布请求将被直接拒绝1MBMQTT连接心跳时间建议值心跳时间限定为30至1200秒,推荐设置为120秒产品是否支持自定义Topic支持消息发布与订阅设备只能对自己的Topic进行消息发布与订阅每个订阅请求的最大订阅数无限制(3)主题订阅格式帮助文档地址:cid:link_8对于设备而言,一般会订阅平台下发消息给设备 这个主题。设备想接收平台下发的消息,就需要订阅平台下发消息给设备 的主题,订阅后,平台下发消息给设备,设备就会收到消息。如果设备想要知道平台下发的消息,需要订阅上面图片里标注的主题。以当前设备为例,最终订阅主题的格式如下:$oc/devices/{device_id}/sys/messages/down最终的格式:$oc/devices/6419627e40773741f9fbdac7_dev1/sys/messages/down(4)主题发布格式对于设备来说,主题发布表示向云平台上传数据,将最新的传感器数据,设备状态上传到云平台。这个操作称为:属性上报。帮助文档地址:cid:link_3根据帮助文档的介绍, 当前设备发布主题,上报属性的格式总结如下:发布的主题格式:$oc/devices/{device_id}/sys/properties/report 最终的格式:$oc/devices/6419627e40773741f9fbdac7_dev1/sys/properties/report发布主题时,需要上传数据,这个数据格式是JSON格式。上传的JSON数据格式如下:{ "services": [ { "service_id": <填服务ID>, "properties": { "<填属性名称1>": <填属性值>, "<填属性名称2>": <填属性值>, .......... } } ]}根据JSON格式,一次可以上传多个属性字段。 这个JSON格式里的,服务ID,属性字段名称,属性值类型,在前面创建产品的时候就已经介绍了,不记得可以翻到前面去查看。根据这个格式,组合一次上传的属性数据:{"services": [{"service_id": "stm32","properties":{"DS18B20":18,"motor_water":1,"motor_oxygen":1,"temp_max":10,"water_hp":130,"motor_food":0,"time_food":0,"oxygen_food":3}}]}3.6 MQTT三元组MQTT协议登录需要填用户ID,设备ID,设备密码等信息,就像我们平时登录QQ,微信一样要输入账号密码才能登录。MQTT协议登录的这3个参数,一般称为MQTT三元组。接下来介绍,华为云平台的MQTT三元组参数如何得到。(1)MQTT服务器地址要登录MQTT服务器,首先记得先知道服务器的地址是多少,端口是多少。帮助文档地址:cid:link_2MQTT协议的端口支持1883和8883,它们的区别是:8883 是加密端口更加安全。但是单片机上使用比较困难,所以当前的设备是采用1883端口进连接的。根据上面的域名和端口号,得到下面的IP地址和端口号信息: 如果设备支持填写域名可以直接填域名,不支持就直接填写IP地址。 (IP地址就是域名解析得到的)华为云的MQTT服务器地址:114.116.232.138域名:7445c6bcd3.st1.iotda-device.cn-north-4.myhuaweicloud.com华为云的MQTT端口号:1883(2)生成MQTT三元组华为云提供了一个在线工具,用来生成MQTT鉴权三元组: cid:link_9打开这个工具,填入设备的信息(也就是刚才创建完设备之后保存的信息),点击生成,就可以得到MQTT的登录信息了。下面是打开的页面:填入设备的信息: (上面两行就是设备创建完成之后保存得到的)直接得到三元组信息。得到三元组之后,设备端通过MQTT协议登录鉴权的时候,填入参数即可。ClientId 6419627e40773741f9fbdac7_dev1_0_0_2023032108Username 6419627e40773741f9fbdac7_dev1Password 861ac9e6a579d36888b2aaf97714be7af6c77017b017162884592bd68b086a6e3.7 模拟设备登录测试经过上面的步骤介绍,已经创建了产品,设备,数据模型,得到MQTT登录信息。 接下来就用MQTT客户端软件模拟真实的设备来登录平台。测试与服务器通信是否正常。(1)填入登录信息打开MQTT客户端软件,对号填入相关信息(就是上面的文本介绍)。然后,点击登录,订阅主题,发布主题。(2)打开网页查看完成上面的操作之后,打开华为云网页后台,可以看到设备已经在线了。点击详情页面,可以看到上传的数据。到此,云平台的部署已经完成,设备已经可以正常上传数据了。四、上位机开发为了方便查看设备上传的数据,对设备进行远程控制,接下来利用Qt开发一款Android和windows系统的上位机。使用华为云平台提供的API接口获取设备上传的数据,也可以给设备下发指令,控制设备。为了方便查看设备上传的数据,对设备进行远程控制,接下来利用Qt开发一款Android和windows系统的上位机。使用华为云平台提供的API接口获取设备上传的数据,也可以给设备下发指令,控制设备。4.1 Qt开发环境安装Qt的中文官网: cid:link_13QT5.12.6的下载地址:cid:link_11打开下载链接后选择下面的版本进行下载:qt-opensource-windows-x86-5.12.6.exe 13-Nov-2019 07:28 3.7G Details软件安装时断网安装,否则会提示输入账户。安装的时候,第一个复选框里勾选一个mingw 32编译器即可,其他的不管默认就行,直接点击下一步继续安装。说明: 我这里只是介绍PC端的环境搭建(这个比较简单)。 Android的开发环境比较麻烦,可以去我的博客里看详细文章。选择MinGW 32-bit 编译器:4.2 创建IAM账户创建一个IAM账户,因为接下来开发上位机,需要使用云平台的API接口,这些接口都需要token进行鉴权。简单来说,就是身份的认证。 调用接口获取Token时,就需要填写IAM账号信息。所以,接下来演示一下过程。地址: cid:link_4获取Token时,除了AIM账号外,还需要项目凭证:faa0973835ab409ab48182e2590f4ad3鼠标点击自己昵称,点击统一身份认证。点击左上角创建用户。创建成功:4.3 获取影子数据帮助文档:cid:link_5设备影子介绍:设备影子是一个用于存储和检索设备当前状态信息的JSON文档。每个设备有且只有一个设备影子,由设备ID唯一标识设备影子仅保存最近一次设备的上报数据和预期数据无论该设备是否在线,都可以通过该影子获取和设置设备的属性简单来说:设备影子就是保存,设备最新上传的一次数据。我们设计的软件里,如果想要获取设备的最新状态信息,就采用设备影子接口。如果对接口不熟悉,可以先进行在线调试:https://apiexplorer.developer.huaweicloud.com/apiexplorer/doc?product=IoTDA&api=ShowDeviceShadow在线调试接口,可以请求影子接口,了解请求,与返回的数据格式。设备影子接口返回的数据如下:{ "device_id": "6419627e40773741f9fbdac7_dev1", "shadow": [ { "service_id": "stm32", "desired": { "properties": null, "event_time": null }, "reported": { "properties": { "DS18B20": 18, "motor_water": 1, "motor_oxygen": 1, "temp_max": 10, "water_hp": 130, "motor_food": 0, "time_food": 0, "oxygen_food": 3 }, "event_time": "20230321T081126Z" }, "version": 0 } ]}4.4 修改设备属性地址: cid:link_6接口说明设备的产品模型中定义了物联网平台可向设备下发的属性,应用服务器可调用此接口向指定设备下发属性。平台负责将属性以同步方式发送给设备,并将设备执行属性结果同步返回。修改设备属性的接口,可以让服务器给设备下发指令,如果需要控制设备。在线调试地址:https://apiexplorer.developer.huaweicloud.com/apiexplorer/doc?product=IoTDA&api=UpdateProperties修改设备属性是属于同步命令,需要设备在线才可以进行调试,先使用MQTT客户端登录服务器,模拟设备上线。然后进行调试,测试数据远程下发给设备。【1】利用MQTT客户端先登录设备 (这是同步命令,必须在线才能调试)【2】点击调试{"services":{"temp_max":100}}【4】可以看到,MQTT客户端软件上已经收到了服务器下发的消息由于是同步命令,服务器必须要收到设备的响应才能顺利完成一个流程,设备响应了服务器才能确定数据下发成功。MQTT设备端如何响应呢?设备响应格式说明:cid:link_7下面进行实操:当服务器通过在线调试,发送指令下来之后,客户端将请求ID复制下来,添加到发布主题的格式里,再回复回去,服务器收到了响应,一次属性修改就完美完成了。就是成功的状态:下面是请求的总结: (响应服务器的修改设备属性请求)上报主题的格式:$oc/devices/{device_id}/sys/properties/set/response/request_id=$oc/devices/6419627e40773741f9fbdac7_dev1/sys/properties/set/response/request_id=响应的数据:{"result_code": 0,"result_desc": "success"}4.5 设计上位机前面2讲解了需要用的API接口,接下来就使用Qt设计上位机,设计界面,完成整体上位机的逻辑设计。【1】新建Qt工程选择工程路径,放在英文路径下。创建完毕。新建Android的模板:【2】界面设计【4】代码设计:配置参数读取与保存/*功能: 保存数据到文件*/void Widget::SaveDataToFile(QString text){ /*保存数据到文件,方便下次加载*/ QString file; file=QCoreApplication::applicationDirPath()+"/"+ConfigFile; QFile filesrc(file); filesrc.open(QIODevice::WriteOnly); QDataStream out(&filesrc); out << text; //序列化写字符串 filesrc.flush(); filesrc.close();}/*功能: 从文件读取数据*/QString Widget::ReadDataFile(void){ //读取配置文件 QString text,data; text=QCoreApplication::applicationDirPath()+"/"+ConfigFile; //判断文件是否存在 if(QFile::exists(text)) { QFile filenew(text); filenew.open(QIODevice::ReadOnly); QDataStream in(&filenew); // 从文件读取序列化数据 in >> data; //提取写入的数据 filenew.close(); } return data; //返回值读取的值}【3】代码设计:云端数据解析//解析反馈结果void Widget::replyFinished(QNetworkReply *reply){ QString displayInfo; int statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); //读取所有数据 QByteArray replyData = reply->readAll(); qDebug()<<"状态码:"<<statusCode; qDebug()<<"反馈的数据:"<<QString(replyData); //更新token if(function_select==3) { displayInfo="token 更新失败."; //读取HTTP响应头的数据 QList<QNetworkReply::RawHeaderPair> RawHeader=reply->rawHeaderPairs(); qDebug()<<"HTTP响应头数量:"<<RawHeader.size(); for(int i=0;i<RawHeader.size();i++) { QString first=RawHeader.at(i).first; QString second=RawHeader.at(i).second; if(first=="X-Subject-Token") { Token=second.toUtf8(); displayInfo="token 更新成功."; //保存到文件 SaveDataToFile(Token); break; } } QMessageBox::information(this,"提示",displayInfo,QMessageBox::Ok,QMessageBox::Ok); return; } //判断状态码 if(200 != statusCode) { //解析数据 QJsonParseError json_error; QJsonDocument document = QJsonDocument::fromJson(replyData, &json_error); if(json_error.error == QJsonParseError::NoError) { //判断是否是对象,然后开始解析数据 if(document.isObject()) { QString error_str=""; QJsonObject obj = document.object(); QString error_code; //解析错误代码 if(obj.contains("error_code")) { error_code=obj.take("error_code").toString(); error_str+="错误代码:"; error_str+=error_code; error_str+="\n"; } if(obj.contains("error_msg")) { error_str+="错误消息:"; error_str+=obj.take("error_msg").toString(); error_str+="\n"; } //显示错误代码 QMessageBox::information(this,"提示",error_str,QMessageBox::Ok,QMessageBox::Ok); } } return; } //设置属性 if(function_select==12 || function_select==13) { //解析数据 QJsonParseError json_error; QJsonDocument document = QJsonDocument::fromJson(replyData, &json_error); if(json_error.error == QJsonParseError::NoError) { //判断是否是对象,然后开始解析数据 if(document.isObject()) { QJsonObject obj = document.object(); if(obj.contains("response")) { QJsonObject obj1=obj.take("response").toObject(); int val=0; QString success; if(obj1.contains("result_code")) { val=obj1.take("result_code").toInt(); } if(obj1.contains("result_desc")) { success=obj1.take("result_desc").toString(); } if(val==0 && success =="success") { //显示状态 QMessageBox::information(this,"提示","远程命令操作完成.",QMessageBox::Ok,QMessageBox::Ok); return; } else { //显示状态 QMessageBox::information(this,"提示","设备未正确回应.请检查设备网络.",QMessageBox::Ok,QMessageBox::Ok); return; } } } } } //查询设备属性 if(function_select==0) { //解析数据 QJsonParseError json_error; QJsonDocument document = QJsonDocument::fromJson(replyData, &json_error); if(json_error.error == QJsonParseError::NoError) { //判断是否是对象,然后开始解析数据 if(document.isObject()) { QJsonObject obj = document.object(); if(obj.contains("shadow")) { QJsonArray array=obj.take("shadow").toArray(); for(int i=0;i<array.size();i++) { QJsonObject obj2=array.at(i).toObject(); if(obj2.contains("reported")) { QJsonObject obj3=obj2.take("reported").toObject(); if(obj3.contains("properties")) { QJsonObject properties=obj3.take("properties").toObject(); qDebug()<<"开始解析数据...."; } } } } } } return; }}五、代码实现5.1 ESP8266连接云平台实现代码以下是使用STM32F103ZET6和ESP8266连接华为云物联网平台,通过MQTT协议实现设备登录、主题订阅和主题发布的实现代码:#include "stm32f10x.h"#include "stdio.h"#include "string.h"// 定义ESP8266的串口USART_TypeDef* ESP_USARTx = USART1;// 定义MQTT服务器的地址和端口const char* MQTT_SERVER = "mqtt.eclipse.org";const int MQTT_PORT = 1883;// 定义设备ID和设备密码const char* DEVICE_ID = "your_device_id";const char* DEVICE_PASSWORD = "your_device_password";// 定义订阅的主题const char* SUBSCRIBE_TOPIC = "your_subscribe_topic";// 定义发布的主题const char* PUBLISH_TOPIC = "your_publish_topic";// 定义接收缓冲区和发送缓冲区的大小#define RX_BUFFER_SIZE 1024#define TX_BUFFER_SIZE 1024// 定义接收缓冲区和发送缓冲区char rxBuffer[RX_BUFFER_SIZE];char txBuffer[TX_BUFFER_SIZE];// 定义接收缓冲区的索引和标志位volatile uint16_t rxIndex = 0;volatile uint8_t rxComplete = 0;// 发送数据到ESP8266void ESP8266_SendData(const char* data) { sprintf(txBuffer, "%s\r\n", data); USART_SendData(ESP_USARTx, (uint16_t)'\r'); USART_SendData(ESP_USARTx, (uint16_t)'\n'); USART_SendData(ESP_USARTx, (uint16_t)'\r'); USART_SendData(ESP_USARTx, (uint16_t)'\n'); USART_SendData(ESP_USARTx, (uint16_t)'\r'); USART_SendData(ESP_USARTx, (uint16_t)'\n'); USART_SendData(ESP_USARTx, (uint16_t)'\r'); USART_SendData(ESP_USARTx, (uint16_t)'\n'); USART_SendData(ESP_USARTx, (uint16_t)'\r'); USART_SendData(ESP_USARTx, (uint16_t)'\n'); USART_SendData(ESP_USARTx, (uint16_t)'\r'); USART_SendData(ESP_USARTx, (uint16_t)'\n'); USART_SendData(ESP_USARTx, (uint16_t)'\r'); USART_SendData(ESP_USARTx, (uint16_t)'\n'); USART_SendData(ESP_USARTx, (uint16_t)'\r'); USART_SendData(ESP_USARTx, (uint16_t)'\n');}// 从ESP8266接收数据void ESP8266_ReceiveData(uint16_t size) { while (size--) { rxBuffer[rxIndex++] = USART_ReceiveData(ESP_USARTx); } if (rxIndex >= RX_BUFFER_SIZE) { rxComplete = 1; rxIndex = 0; }}// 处理接收到的数据void ProcessReceivedData() { // TODO: 根据接收到的数据进行处理}// ESP8266串口中断处理函数void USART1_IRQHandler(void) { if (USART_GetITStatus(ESP_USARTx, USART_IT_RXNE) != RESET) { ESP8266_ReceiveData(1); }}// 连接到MQTT服务器void MQTT_Connect() { // 发送连接请求 sprintf(txBuffer, "AT+CIPSTART="TCP","%s",%d\r\n", MQTT_SERVER, MQTT_PORT); ESP8266_SendData(txBuffer); // 等待连接成功 while (!strstr(rxBuffer, "CONNECTED")) { if (rxComplete) { ProcessReceivedData(); rxComplete = 0; } } // 发送MQTT连接请求 sprintf(txBuffer, "AT+MQTTCONNECT="%s","%s"\r\n", DEVICE_ID, DEVICE_PASSWORD); ESP8266_SendData(txBuffer); // 等待连接成功 while (!strstr(rxBuffer, "CONNECTED")) { if (rxComplete) { ProcessReceivedData(); rxComplete = 0; } }}// 订阅主题void MQTT_Subscribe() { sprintf(txBuffer, "AT+MQTTSUBSCRIBE="%s"\r\n", SUBSCRIBE_TOPIC); ESP8266_SendData(txBuffer);}// 发布消息void MQTT_Publish(const char* message) { sprintf(txBuffer, "AT+MQTTPUBLISH="%s","%s"\r\n", PUBLISH_TOPIC, message); ESP8266_SendData(txBuffer);}int main(void) { // 初始化ESP8266的串口 USART_InitTypeDef USART_InitStructure; USART_InitStructure.USART_BaudRate = 115200; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(ESP_USARTx, &USART_InitStructure); USART_Cmd(ESP_USARTx, ENABLE); USART_ITConfig(ESP_USARTx, USART_IT_RXNE, ENABLE); NVIC_EnableIRQ(USART1_IRQn); // 连接到MQTT服务器 MQTT_Connect(); // 订阅主题 MQTT_Subscribe(); while (1) { if (rxComplete) { ProcessReceivedData(); rxComplete = 0; } // TODO: 处理其他业务逻辑 // 发布消息 MQTT_Publish("Hello, MQTT!"); // 延时一段时间 delay_ms(1000); }}以上代码用于演示使用STM32F103ZET6和ESP8266连接华为云物联网平台,通过MQTT协议实现设备登录、主题订阅和主题发布的基本功能。5.2 ESP8266的MQTT协议指令ESP8266通过MQTT协议连接到服务器的相关AT指令主要有以下几个:【1】AT+CIPSTART:建立TCP连接功能:使用TCP协议连接到远程服务器用法:AT+CIPSTART="TCP","<服务器地址>",<服务器端口>示例:AT+CIPSTART="TCP","mqtt.eclipse.org",1883【2】AT+MQTTCONNECT:连接到MQTT服务器功能:使用MQTT协议连接到MQTT服务器用法:AT+MQTTCONNECT="<设备ID>","<设备密码>"示例:AT+MQTTCONNECT="your_device_id","your_device_password"【3】AT+MQTTPUBLISH:发布消息功能:向指定主题发布消息用法:AT+MQTTPUBLISH="<主题>","<消息内容>"示例:AT+MQTTPUBLISH="your_publish_topic","Hello, MQTT!"【4】AT+MQTTSUBSCRIBE:订阅主题功能:订阅指定的主题用法:AT+MQTTSUBSCRIBE="<主题>"示例:AT+MQTTSUBSCRIBE="your_subscribe_topic"【5】AT+CIPCLOSE:关闭TCP连接功能:关闭当前的TCP连接用法:AT+CIPCLOSE这些AT指令可以通过串口与ESP8266进行通信,实现与MQTT服务器的连接、消息发布和订阅等功能。通过这些指令,可以在嵌入式设备上实现与云端的通信和数据交换,从而实现物联网应用。5.2 步进电机控制代码以下是使用STM32F103ZET6单片机通过ULN2003驱动芯片控制28BYJ-48步进电机实现角度控制和速度控制的实现代码:#include "stm32f10x.h"#include "delay.h"// 定义步进电机控制引脚#define IN1_PIN GPIO_Pin_0#define IN2_PIN GPIO_Pin_1#define IN3_PIN GPIO_Pin_2#define IN4_PIN GPIO_Pin_3#define IN_PORT GPIOA// 定义步进电机角度和速度参数#define ANGLE_1 512 // 控制步进电机转动一圈的步数#define SPEED_1 5 // 控制步进电机转动的速度// 步进电机转动顺序const uint8_t stepSequence[8] = {0x01, 0x03, 0x02, 0x06, 0x04, 0x0C, 0x08, 0x09};// 步进电机当前角度和速度volatile uint16_t currentAngle = 0;volatile uint8_t currentSpeed = 0;// 初始化步进电机控制引脚void StepperMotor_Init() { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = IN1_PIN | IN2_PIN | IN3_PIN | IN4_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(IN_PORT, &GPIO_InitStructure);}// 控制步进电机转动一步void StepperMotor_Step() { static uint8_t stepIndex = 0; GPIO_Write(IN_PORT, stepSequence[stepIndex]); stepIndex = (stepIndex + 1) % 8;}// 控制步进电机转动到指定角度void StepperMotor_MoveToAngle(uint16_t targetAngle) { uint16_t steps = targetAngle - currentAngle; uint16_t absSteps = steps > 0 ? steps : -steps; uint8_t direction = steps > 0 ? 1 : -1; for (uint16_t i = 0; i < absSteps; i++) { StepperMotor_Step(); delay_ms(2); // 控制步进电机转动的速度 } currentAngle = targetAngle;}// 控制步进电机以指定速度连续转动void StepperMotor_MoveWithSpeed(uint8_t speed) { currentSpeed = speed; while (1) { StepperMotor_Step(); delay_ms(20 - currentSpeed); // 控制步进电机转动的速度 }}int main(void) { // 初始化步进电机控制引脚 StepperMotor_Init(); // 控制步进电机转动到指定角度 StepperMotor_MoveToAngle(ANGLE_1); // 控制步进电机以指定速度连续转动 StepperMotor_MoveWithSpeed(SPEED_1); while (1) { // 主循环中可以添加其他逻辑代码 }}5.3 LD3320识别代码以下是使用STM32F103的串口2接收LD3320语音识别结果并进行判断控制的代码:#include "stm32f10x.h"#include <stdio.h>// 定义LD3320串口通信引脚#define LD3320_RX_PIN GPIO_Pin_2#define LD3320_RX_PORT GPIOA#define LD3320_USART USART2// 定义接收缓冲区大小#define BUFFER_SIZE 128// 接收缓冲区volatile char rxBuffer[BUFFER_SIZE];volatile uint8_t rxIndex = 0;volatile uint8_t rxComplete = 0;// 初始化LD3320串口通信引脚void LD3320_UART_Init() { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); GPIO_InitStructure.GPIO_Pin = LD3320_RX_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(LD3320_RX_PORT, &GPIO_InitStructure); USART_InitStructure.USART_BaudRate = 9600; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx; USART_Init(LD3320_USART, &USART_InitStructure); USART_ITConfig(LD3320_USART, USART_IT_RXNE, ENABLE); NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); USART_Cmd(LD3320_USART, ENABLE);}// 串口2中断处理函数void USART2_IRQHandler() { if (USART_GetITStatus(LD3320_USART, USART_IT_RXNE) != RESET) { char data = USART_ReceiveData(LD3320_USART); if (rxIndex < BUFFER_SIZE - 1) { rxBuffer[rxIndex++] = data; } if (data == '\n') { rxComplete = 1; } }}// 处理接收到的LD3320识别结果void ProcessLD3320Result() { // 在这里进行LD3320识别结果的判断和控制逻辑 // 可以根据接收到的字符串进行判断,例如使用strcmp()函数进行比较 // 示例:if (strcmp(rxBuffer, "ON") == 0) { // 执行打开操作 } // 清空接收缓冲区 rxIndex = 0; rxComplete = 0;}int main(void) { // 初始化LD3320串口通信引脚 LD3320_UART_Init(); while (1) { if (rxComplete) { ProcessLD3320Result(); } }}以上代码使用STM32F103的串口2接收LD3320语音识别结果并进行判断控制。代码中使用了串口2的接收中断来接收LD3320的识别结果。在中断处理函数USART2_IRQHandler()中,将接收到的数据存储到接收缓冲区rxBuffer中,并通过检测换行符\n来判断一条完整的识别结果是否接收完成。当识别结果接收完成时,调用ProcessLD3320Result()函数进行识别结果的判断和控制逻辑处理。在ProcessLD3320Result()函数中,可以根据接收到的字符串进行判断和控制逻辑的实现。例如,使用字符串比较函数strcmp()来比较接收到的字符串与预设的控制命令是否匹配,从而执行相应的操作。在这个函数中,可以添加你需要的控制逻辑,例如打开或关闭某个设备,执行特定的动作等。
-
中奖结果公示感谢各位小伙伴参与本次活动,本次活动获奖名单如下:请各位获奖的伙伴在7月31日之前点击此处填写收货地址,如逾期未填写视为弃奖。再次感谢各位小伙伴参与本次活动,欢迎关注华为云DTSE Tech Talk 技术直播更多活动~直播简介【直播主题】如何为物联网设备注入“华为云+鸿蒙DNA”?【直播时间】2023年7月26日 16:30-18:00【直播专家】陈星利 华为云IoT DTSE技术布道师、华为云IoT 高级工程师【直播简介】本期直播由华为云IoT技术布道师陈星利讲解华为云IoT+OpenHarmony深入协同为开发者提供开放能力,指导参与华为开发者大赛的选手们如何通过集成OpenHomony或鸿蒙模组即可实现无缝对接华为云IoT平台,实现“哑” 设备“无屏变有屏”,技术加持提升作品创新度。直播链接:cid:link_2活动介绍【互动方式】直播前您可以在本帖留下您疑惑的问题,专家会在直播时为您解答。直播后您可以继续在本帖留言,与专家互动交流。我们会在全部活动结束后对参与互动的用户进行评选。【活动时间】即日起—2023年7月27日【奖励说明】评奖规则:活动1:直播期间在直播间提出与直播内容相关的问题,对专家评选为优质问题的开发者进行奖励。奖品:华为云定制卫衣活动2:在本帖提出与直播内容相关的问题,由专家在所有互动贴中选出最优问题贴的开发者进行奖励。奖品:华为云定制Polo衫更多直播活动直播互动有礼:官网直播间发口令“华为云 DTSE”抽华为云定制棒球帽、填写问卷抽华为云定制鼠标垫等好礼;直播过程中提问,评选优质问题送华为云定制长袖卫衣。分享问卷有礼 :邀请5位朋友以上完成问卷即可获得华为云定制帆布袋。戳我填问卷》》老观众专属福利:连续报名并观看DTT直播3期以上抽送华为云DTT定制T恤。【注意事项】1、所有参与活动的问题,如发现为复用他人内容,则取消获奖资格。2、为保证您顺利领取活动奖品,请您在活动公示奖项后2个工作日内私信提前填写奖品收货信息,如您没有填写,视为自动放弃奖励。3、活动奖项公示时间截止2023年7月27日,如未反馈邮寄信息视为弃奖。本次活动奖品将于奖项公示后30个工作日内统一发出,请您耐心等待。4、活动期间同类子活动每个ID(同一姓名/电话/收货地址)只能获奖一次,若重复则中奖资格顺延至下一位合格开发者,仅一次顺延。5、如活动奖品出现没有库存的情况,华为云工作人员将会替换等价值的奖品,获奖者不同意此规则视为放弃奖品。6、其他事宜请参考【华为云社区常规活动规则】。
-
明明有头文件,并且代码里面那个头文件没有报错,但编译的时候却报错找不到cJson文件是为什么
-
这是实验手册上的这是我的我也试过将Lwm2m协议改为MQTT协议,但是编译会报错fatal error: cjson/cJSON.h: No such file or directory。相关参数也不会调就放弃了实验手册上开始使用的NB-IoT模组进行实验后改为WiFI模组,所以有IMEI号,但是我只有wifi模组,没有IMEi号。参数该如何选择才可以连上平台上的设备?
-
请问IAM Token所在用户怎么订阅设备接入服务??
-
我是复制的api Explorer的axios的代码,结果返回状态码500,这是后端服务器错了吗
-
目前手机的屏幕技术应用已经到了新的瓶颈期,急需一个突破式的创新和升级。手机智慧屏幕的颠覆性突破,本人有一整套的理论以及完善的构思想法,领先时代五十年,请华为相关的技术人员与我联系。不然错失的是另一个发展黄金时期。由于技术的新颖性以及关键性,在此不予公示告知,郑重声明,相关技术无偿提供,只有纸面记载。并非耸人听闻,请华为的相关技术负责人员,与我联系。
-
按照手册一步一步做下去,最后串口日志会出现这个问题+NOTICE:SCANFINISH +NOTICE:NETWORK NOT FIND OnWifiConnectionChanged 62, state = 0, info = bssid: 00:00:00:00:00:00, rssi: 0, connState: 0, reason: 1, ssid:编译和烧录都成功了,就是激活不了
-
如题已按照请求格式来进行数据请求,endpoint是正确的,其余两个项目id和设备id也是正确的,但是显示一直显示设备不存在,请问这是什么问题呢。
-
中奖结果公示感谢各位小伙伴参与本次活动,本次活动论坛提问获得者:其他奖项获得者:华为云账号 奖项名称 奖品名称备注gillli 微信抽奖 开发者定制鼠标垫hw011622531 微信抽奖 开发者定制鼠标垫hid_dpgstcii86pj3vz 微信抽奖 开发者定制鼠标垫hid_bl57qyu_sqg_4uk 微信抽奖 开发者定制鼠标垫hw57269863 优质提问 HDC开发者定制长袖圆领卫衣2XLhw081993541 优质提问 HDC开发者定制长袖圆领卫衣2XL/ 官网抽奖 开发者定制棒球帽A18D07BA7E8E481DB625DD9346352097 官网抽奖 开发者定制棒球帽系统判定为黑产,取消获奖资格A2AD6A3934EA4306A2AED33E46DEAA1D 官网抽奖 无线鼠标系统判定为黑产,取消获奖资格A013D03AC35C45C8AE88AE825AF75F10 官网抽奖 无线鼠标系统判定为黑产,取消获奖资格hid_l7-7a3am13g-a5e 问卷抽奖 无线鼠标hw081993541 问卷抽奖 无线鼠标hw790658 老观众专属 DTT定制T恤
-
创建好设备,用AT指令无法激活设备,网络能够附着成功,AT+NMGS=5,00193C0064一直错误
-
发送AT指令后能附着网络但是发送AT+NMGS=5,00193C0064后一直错误,不能上报数据,激活不了平台产品
yd_238303207
发表于2023-06-21 15:25:49
2023-06-21 15:25:49
最后回复
yd_238303207
2023-06-25 16:44:13
141 10
上滑加载中
推荐直播
-
华为云码道Agent集成与鸿蒙实战2026/08/11 周二 19:00-21:00
王一男-华为云码道产品规划专家;李炎-华为云码道产品专家;彭江敏-华为云鸿蒙端云一体化开发专家
本次直播带你解读华为云码道7月份产品新特性、新功能。更有专家演示码道Agent Space × 钉钉机器集成实战,从0到1打通消息通道;码道鸿蒙端云一体化实战,快速搭建员工签到系统。
回顾中 -
华为云开发者AI素养直播课·第五期2026/09/04 周五 16:00-18:00
林华鼎-华为云AI开发者运营负责人;蒋春阳-华为云AI开发者案例开发专家
本期直播内容: AI工具体验营 · 第5-8课连讲。Agent-Team 多智能体协作完成毕业设计实践
回顾中 -
华为云开发者AI素养ClassRoom·第六期2026/09/08 周二 19:00-20:00
樊渊-2026华为软件挑战赛冠军
高手来了:看软挑高手解析二维排样问题—从工业难题到算法突破
回顾中
热门标签