• [IoT类] Iot设备接入的C# SDK的操作有问题,无法上传设备模型
    按照GitHub - huaweicloud/huaweicloud-iot-device-sdk-csharp的说明进行操作,创建设备的时候遇到问题,无法下载文档中给出的设备模型。
  • [问题求助] 如何制作APP
    数据上传到iot平台,怎么根据这些数据制作APP啊
  • [问题求助] iot数据转存至OBS存储,数据上传成功了,但是csv文件里面没有数据怎么解决啊?
    结果就是生成文件了,但数据为空
  • [问题求助] 云端下发消息体结构能自定义吗
    通过华为云的云端下发消息,客户端收到的实际消息被包裹了一层,把发送的消息内容放在了content节点下了。请问有办法不包裹吗,直接就是消息内容是什么就给客户端发送什么。发送的消息收到的消息
  • [问题求助] 华为云IoT服务器如何配置规则引擎以处理消息流转?
    如何在华为云IoT服务中设置规则引擎,以便根据特定条件对上报的数据进行实时分析处理,并将结果转发至其他系统或应用? 
  • [问题求助] 华为云IoT服务器如何对接多种设备协议?
    华为云IoT服务器支持多种物联网设备协议,如何在实际操作中方便快捷地接入并管理使用不同协议的设备?
  • [问题求助] 使用华为云接入微信小程序过程中,出现“没有找到IAM Token所对应的用户信息或该用户没有订阅设备接入服务(IOTDA)”
    在创建IAM后,我对用户权限作出了修改,发现并没有完成;后在IAM的基础上重新建立了一个产品和设备,依旧会报错;进行调试,可以获取到Token,但在进行登录时,被服务器积极拒绝403.
  • [问题求助] 在华为云接入微信小程序时,一直有“没有找到IAM Token所对应的用户信息或该用户没有订阅设备接入服务(IOTDA)”的问题
    按照文档,我检查了IAM的权限问题并修改,并没有产生作用;我还使用IAM创建了一个产品并进行进行设备的上云,也没有产生作用,进行调试,可以正常获取Token,但无法获取数据,一直被服务器拒绝
  • [问题求助] 物联网平台智慧充电桩MQTT协议标准
    关于物联网平台在智慧充电桩方面的应用,通过MQTT协议接入方案,目前有较为规范的协议标准吗?
  • [技术干货] 基于华为云IOT设计的物联网智能储物柜(4G+华为云IOT+微信小程序)
    一、项目介绍在游乐场、商场、景区等人流量较大的地方,往往存在用户需要临时存放物品的情况,例如行李箱、外套、购物袋等。为了满足用户的储物需求,并提供更加便捷的服务体验,当前设计了一款物联网智能储物柜。该智能储物柜通过与华为云物联网服务器的连接,实现了数据的传输和管理,让用户可以通过微信小程序轻松查看储物柜的可用状态和选择合适的储物柜进行解锁。通过使用4G联网模块E29 Cat-1,储物柜实现了稳定的网络连接,确保了用户可以随时随地查看和使用储物柜。主控芯片采用STC12C5A60S2,具有低功耗、高性能和丰富的外设接口等特点,能够满足储物柜的控制需求。而储物柜的锁则采用了电磁锁,能够快速、安全地实现储物柜的解锁和上锁操作。用户在解锁储物柜后,会扣除相应的押金(预付金),然后根据使用时间进行计费。用户可以随时存取自己的物品,并且在使用完成后可以通过微信小程序完成订单结算,使整个使用过程更加便捷和透明。这款4G智能储物柜为用户提供了一种灵活、安全、便捷的储物解决方案,能够有效满足人们日常生活中的储物需求,并提供良好的用户体验。智能储物柜支持的主要功能:(1)远程查看储物柜状态:用户可以通过微信小程序实时查看储物柜的可用状态,包括储物柜数量、剩余可用储物柜数量等信息。这使得用户在选择储物柜时可以提前了解储物柜的可用性,避免不必要的等待。(2)指定储物柜解锁:用户可以在微信小程序上选择需要使用的储物柜,并进行解锁操作。当用户选择指定储物柜后,储物柜会自动解锁,方便用户存放物品。(3)押金扣除和计费:在解锁储物柜时,系统会自动扣除用户的押金(预付金)。智能储物柜根据使用时间进行计费,用户只需根据实际使用时间支付相应费用。(4)存取物品:一旦用户成功解锁储物柜,他们就可以将物品存放或取出。用户可以随时存取自己的物品,并享受到安全可靠的储物体验。(5)临时解锁功能:如果用户需要频繁存取物品,储物柜提供了临时解锁功能。用户可以选择设置一段时间内的临时解锁,无需重复进行解锁操作,方便快捷。(6)订单结算:用户在使用完成后,可以通过微信小程序完成订单结算。系统会根据实际使用时间和费率进行计算,并生成相应的费用清单供用户支付。整体系统流程框架图:做好的柜子效果如下: (柜子不带屏幕的,全部操作在微信小程序上进行)二、软硬件选型2.1 硬件选型智能储物柜所需的硬件主要包括下面几个部分:(1)主控芯片:采用STC12C5A60S2主控芯片,具有低功耗、高性能和丰富的外设接口,能够满足储物柜的控制需求。(2)4G联网模块:采用华为云IOT提供的4G联网模块E29 Cat-1,确保储物柜具备稳定的网络连接功能,实现远程数据传输和管理。(3)电磁锁(每个小柜子一个电磁锁):储物柜采用电磁锁作为解锁和上锁的装置,能够快速、安全地实现储物柜的开关操作。电磁锁具有较高的稳定性和安全性。(4)电源系统:储物柜需要一个可靠的电源系统来供电,以确保储物柜的正常运行。(5)外壳和结构组件:储物柜外壳。采用主控板:采用的电磁锁:采用的柜子:2.2 软件选型软件包含了4个部分。(1)设备端的程序开发,智能储物柜设备端的程序。(2)华为云IOT物联网服务器的配置。设备注册、消息转发。(3)智能锁的后台云服务器搭建。(4)小程序、公众号程序开发。三、华为云物联网服务器部署3.2 开通物联网服务地址: cid:link_10点击总览,查看接入信息。 我们当前设备准备采用MQTT协议接入华为云平台,这里可以看到MQTT协议的地址和端口号等信息。总结:端口号: MQTT (1883) 接入地址: e244e6efb9.st1.iotda-device.cn-north-4.myhuaweicloud.com根据域名地址得到IP地址信息:Microsoft Windows [版本 10.0.19045.3448](c) Microsoft Corporation。保留所有权利。​C:\Users\11266>ping e244e6efb9.st1.iotda-device.cn-north-4.myhuaweicloud.com​正在 Ping e244e6efb9.st1.iotda-device.cn-north-4.myhuaweicloud.com [117.78.5.125] 具有 32 字节的数据:来自 117.78.5.125 的回复: 字节=32 时间=41ms TTL=94来自 117.78.5.125 的回复: 字节=32 时间=44ms TTL=94来自 117.78.5.125 的回复: 字节=32 时间=43ms TTL=94来自 117.78.5.125 的回复: 字节=32 时间=42ms TTL=94​117.78.5.125 的 Ping 统计信息: 数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),往返行程的估计时间(以毫秒为单位): 最短 = 41ms,最长 = 44ms,平均 = 42ms​C:\Users\11266>MQTT协议接入端口号有两个,1883是非加密端口,8883是证书加密端口,单片机无法加载证书,所以使用1883端口比较合适。 接下来的ESP8266就采用1883端口连接华为云物联网平台。3.3 创建产品(1)创建产品点击产品页,再点击创建产品。(2)填写产品信息根据自己产品名字填写。(3)产品创建成功(4)添加自定义模型产品创建完成之后,点击进入产品详情页面,翻到最下面可以看到模型定义。这个模型就是定义自己设备接下来需要向服务器上传那些数据类型。根据自己的数据类型进行编写。先点击自定义模型。再创建一个服务ID。接着点击新增属性。设置属性。属性添加成功。3.4 添加设备产品是属于上层的抽象模型,接下来在产品模型下添加实际的设备。添加的设备最终需要与真实的设备关联在一起,完成数据交互。(1)注册设备(2)根据自己的设备填写设备标识码、密码这些根据自己情况认真填写。(3)保存设备信息创建完毕之后,点击保存并关闭,得到创建的设备密匙信息。该信息在后续生成MQTT三元组的时候需要使用。创建之后,得到的设备信息如下:{ "device_id": "65113d05a559fd7cd41435f8_lock1", "secret": "12345678"}(4)设备创建完成可以点击设备进入到设备详情页面。3.5 MQTT协议主题订阅与发布(1)主题订阅格式帮助文档地址:cid:link_8对于设备而言,一般会订阅平台下发消息给设备 这个主题。设备想接收平台下发的消息,就需要订阅平台下发消息给设备 的主题,订阅后,平台下发消息给设备,设备就会收到消息。如果设备想要知道平台下发的消息,需要订阅上面图片里标注的主题。以当前设备为例,最终订阅主题的格式如下:$oc/devices/{device_id}/sys/messages/down​最终的格式:$oc/devices/65113d05a559fd7cd41435f8_lock1/sys/messages/down(2)主题发布格式对于设备来说,主题发布表示向云平台上传数据,将最新的传感器数据,设备状态上传到云平台。这个操作称为:属性上报。帮助文档地址:cid:link_5根据帮助文档的介绍, 当前设备发布主题,上报属性的格式总结如下:发布的主题格式:$oc/devices/{device_id}/sys/properties/report 最终的格式:$oc/devices/65113d05a559fd7cd41435f8_lock1/sys/properties/report发布主题时,需要上传数据,这个数据格式是JSON格式。​上传的JSON数据格式如下:​{ "services": [ { "service_id": <填服务ID>, "properties": { "<填属性名称1>": <填属性值>, "<填属性名称2>": <填属性值>, .......... } } ]}根据JSON格式,一次可以上传多个属性字段。 这个JSON格式里的,服务ID,属性字段名称,属性值类型,在前面创建产品的时候就已经介绍了,不记得可以翻到前面去查看。​根据这个格式,组合一次上传的属性数据:{"services": [{"service_id": "lock","properties":{"lock":1}}]}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服务器地址:117.78.5.125域名:e244e6efb9.st1.iotda-device.cn-north-4.myhuaweicloud.com华为云的MQTT端口号:1883注意! 具体要看这里:(2)生成MQTT三元组华为云提供了一个在线工具,用来生成MQTT鉴权三元组: cid:link_9打开这个工具,填入设备的信息(也就是刚才创建完设备之后保存的信息),点击生成,就可以得到MQTT的登录信息了。下面是打开的页面:填入设备的信息: (上面两行就是设备创建完成之后保存得到的)得到三元组之后,设备端通过MQTT协议登录鉴权的时候,填入参数即可。ClientId 65113d05a559fd7cd41435f8_lock1_0_0_2023092508Username 65113d05a559fd7cd41435f8_lock1Password 1a3e7f486aa551bca7b6ff5c19c29d2006e940ec1f98ab416e10be12881069533.7 模拟设备登录测试经过上面的步骤介绍,已经创建了产品,设备,数据模型,得到MQTT登录信息。 接下来就用MQTT客户端软件模拟真实的设备来登录平台。测试与服务器通信是否正常。(1)填入登录信息打开MQTT客户端软件,对号填入相关信息(就是上面的文本介绍)。然后,点击登录,订阅主题,发布主题。(2)打开网页查看完成上面的操作之后,打开华为云网页后台,可以看到设备已经在线了。点击详情页面,可以看到上传的数据。到此,云平台的部署已经完成,设备已经可以正常上传数据了。3.8 添加控制命令(云端控制设备)在产品页面,添加控制命令。根据自己设备的情况填写需要发送的控制命令。3.9 云端发送控制命令在设备页面测试刚才添加的命令。点击确定之后,在MQTT客户端上就能收到云端下发的控制命令。说明:当前的MQTT客户端实际就是模拟的真实设备。 真实设备收到控制命令就可以判断,完成锁的开关控制。这个下发的命令是有反馈。设备端收到之后,可以向服务器反馈状态,这样服务器才能知道刚才的控制命令确实发送成功了。设备收到信息之后,上传回应给服务器的主题和内容格式:Topic:$oc/devices/{device_id}/sys/commands/response/request_id={request_id}数据格式: { "result_code": 0, "response_name": "COMMAND_RESPONSE", "paras": { "result": "success" }}云端发送控制命令之后,设备收到的消息如下:$oc/devices/65113d05a559fd7cd41435f8_lock1/sys/commands/request_id=d49f0bb9-ba87-4c9b-b915-98a1f0fcf689{"paras":{"lock":true},"service_id":"lock","command_name":"锁开关控制"}其中request_id=d49f0bb9-ba87-4c9b-b915-98a1f0fcf689 就是本次的请求ID。回应的时候需要加上请求ID。服务器才好对应。以当前设备为例:发布的主题这样填: $oc/devices/65113d05a559fd7cd41435f8_lock1/sys/commands/response/request_id=ce49181e-7636-4b24-946d-c034ca083c1c 发布的内容这样填:{"result_code":0,"response_name":"COMMAND_RESPONSE","paras":{"result":"success"}}在MQTT软件里这样填:MQTT回应之后,可以在云端的发送命令界面,看到右上角有弹窗提示,命令下发成功。四、微信小程序开发如果要开发自己的上位机,远程控制设备。一般有两种需求。(1)获取设备的状态。(2)给设备发送控制指令。那么下面就介绍这两种接口如何使用,就是标准的HTTPS接口。4.1 获取设备影子数据(API接口)帮助文档:cid:link_6设备影子介绍:设备影子是一个用于存储和检索设备当前状态信息的JSON文档。每个设备有且只有一个设备影子,由设备ID唯一标识设备影子仅保存最近一次设备的上报数据和预期数据无论该设备是否在线,都可以通过该影子获取和设置设备的属性简单来说:设备影子就是保存,设备最新上传的一次数据。我们设计的软件里,如果想要获取设备的最新状态信息,就采用设备影子接口。如果对接口不熟悉,可以先进行在线调试:https://apiexplorer.developer.huaweicloud.com/apiexplorer/doc?product=IoTDA&api=ShowDeviceShadow在线调试接口,可以请求影子接口,了解请求,与返回的数据格式。(调试的时候,可以选择只填必填项)设备影子接口返回的数据如下:{ "device_id": "65113d05a559fd7cd41435f8_lock1", "shadow": [ { "service_id": "lock", "desired": { "properties": null, "event_time": null }, "reported": { "properties": { "lock": 1 }, "event_time": "20230925T081357Z" }, "version": 0 } ]}4.2 控制命令发送(API接口)帮助文档:cid:link_7在线调试地址:cid:link_1填写需要发送给设备的消息。{"lock":1}设备端可以收到下发的命令设备端收到下发命令之后,也可以向服务器反馈状态,反馈的方式在前面的3.9小节已经介绍过了。4.3 创建IAM账户创建一个IAM账户,因为接下来开发上位机,需要使用云平台的API接口,这些接口都需要token进行鉴权。简单来说,就是身份的认证。 调用接口获取Token时,就需要填写IAM账号信息。所以,接下来演示一下过程。地址: cid:link_3获取Token时,除了AIM账号外,还需要项目凭证:9254586ba43841e6bf4995dc24023d6b鼠标点击自己昵称,点击统一身份认证。点击左上角创建用户。创建成功:用户创建成功。4.4 TOKEN动态获取调用服务器的API接口都需要填写token,下面介绍如何通过账号信息动态获取token(正常的token时效性是24小时)。帮助文档:cid:link_4请求地址:POST https://iam.<服务ID>.myhuaweicloud.com/v3/auth/tokens请求参数:{ "auth": { "identity": { "methods": [ "password" ], "password": { "user": { "domain": { "name": "IAMDomain" //IAM用户所属帐号名(华为云的主账号) }, "name": "IAMUser", //IAM用户名(刚才创建的) "password": "IAMPassword" //IAM用户密码(刚才创建的) } } }, "scope": { "project": { "name": "cn-north-1" //服务ID(创建产品时创建的) } } }}Qt编写的示例代码:/*功能: 获取token*/void Widget::GetToken(){ QString requestUrl; QNetworkRequest request; //设置请求地址 QUrl url; //获取token请求地址 requestUrl = QString("https://iam.%1.myhuaweicloud.com/v3/auth/tokens") .arg(SERVER_ID); //自己创建的TCP服务器,测试用 //requestUrl="http://10.0.0.6:8080"; //设置数据提交格式 request.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("application/json;charset=UTF-8")); //构造请求 url.setUrl(requestUrl); request.setUrl(url); QString text =QString("{\"auth\":{\"identity\":{\"methods\":[\"password\"],\"password\":" "{\"user\":{\"domain\": {" "\"name\":\"%1\"},\"name\": \"%2\",\"password\": \"%3\"}}}," "\"scope\":{\"project\":{\"name\":\"%4\"}}}}") .arg(MAIN_USER) .arg(IAM_USER) .arg(IAM_PASSWORD) .arg(SERVER_ID); //发送请求 manager->post(request, text.toUtf8());}4.5 规则转发为了能让自己的私有服务器收到设备的状态变化,可以在华为云物联网服务器上创建转发规则。(1)创建规则填充规则转发的信息:参数名参数说明规则名称自定义,如: led_obs。规则描述自定义,如数据转发至OBS服务。数据来源选择“设备属性”。触发事件自动匹配“设备属性上报”。资源空间和上一步创建的产品所在的资源空间保持一致。(2)创建属性:设备上报消息时触动转发规则(3)添加转发规则可以根据自己的需求设置目的地址。如果自己有私有服务器,创建转发规则即可。五、硬件端代码开发5.1 E29 Cat-1模块全网通E29 Cat-1 支持多种协议基于4G网络,具有速度快,延迟低等特点,Cat-1相比于4G有具有更低的功耗。 全网通E29Cat-1模块的特点:1.TAS-E29 Cat-1全网通芯片2.4G全网通Cat-1芯片3.支持TCP/UDP/MQTT/HTTP等多种协议4.基于4G网络,网络速度快5.功耗比4G芯片低40%6.支持标准AT指令、短信透传7.中英文短信透传/配置8.支持LBS基站定位9.modbus轮询技术、自定义心跳包、注册包。5.2 4G模块与MQTT服务器交互常用的AT指令AT:检查模块是否正常工作并响应AT指令。AT+CGATT:激活或取消激活GPRS附着。在使用EC20模块进行网络通信之前,需要先激活GPRS附着。AT+CIPSHUT:关闭移动场景TCP/IP连接。使用该指令可以关闭之前建立的TCP连接。AT+CIPSTART:建立TCP或UDP连接到远程服务器。对于MQTT协议,首先需要使用AT+CIPSTART建立到MQTT服务器的TCP连接。AT+CIPSEND:发送数据到TCP或UDP连接。对于MQTT协议,您可以使用该指令发送MQTT数据包,例如订阅主题、发布消息等。AT+CIPCLOSE:关闭TCP或UDP连接。AT+CMQTTUSR:设置MQTT连接的用户名。AT+CMQTTPASS:设置MQTT连接的密码。AT+CMQTTACCQ:设置MQTT连接的客户端ID。AT+CMQTTCONN:连接到MQTT服务器。在设置好MQTT连接参数后,使用该指令进行连接。AT+CMQTTPUB:发布MQTT消息。使用该指令发布消息到指定的主题。AT+CMQTTSUB:订阅MQTT主题。使用该指令订阅感兴趣的主题,当有消息发布到该主题时,EC20模块会收到相应的回调。AT+CMQTTUNS:取消订阅MQTT主题。使用该指令取消已经订阅的主题。5.3 MQTT连接主要代码核心代码模板:// 引入必要的库#include <reg51.h>#include <string.h>// 定义串口通信相关的寄存器地址#define UART_BAUD_RATE_H 0xFD // 波特率高位#define UART_BAUD_RATE_L 0xFE // 波特率低位#define UART_CONTROL_REG 0x98 // 控制寄存器地址// 定义MQTT服务器信息#define MQTT_SERVER "mqtt.example.com" // MQTT服务器地址#define MQTT_PORT "1883" // MQTT端口号// 定义设备ID和认证信息#define DEVICE_ID "your_device_id" // 设备ID#define USERNAME "your_username" // 用户名#define PASSWORD "your_password" // 密码// 定义订阅和发布的主题#define SUBSCRIBE_TOPIC "your_subscribe_topic" // 订阅主题#define PUBLISH_TOPIC "your_publish_topic" // 发布主题// 定义MQTT协议相关指令#define CONNECT_CMD "AT+CMQTTCONN=\"" MQTT_SERVER "\",\"" MQTT_PORT "\",\"" DEVICE_ID "\",\"" USERNAME "\",\"" PASSWORD "\"\r\n" // 连接指令#define SUBSCRIBE_CMD "AT+CMQTTSUB=\"" SUBSCRIBE_TOPIC "\",1\r\n" // 订阅指令#define PUBLISH_CMD "AT+CMQTTPUB=\"" PUBLISH_TOPIC "\",0,0,0,\"your_message\"\r\n" // 发布指令// 定义串口发送函数void UART_SendString(char *str) { while (*str) { SBUF = *str; while (!TI); TI = 0; str++; }}// 主函数void main() { // 配置串口通信波特率为9600bps PCON = 0x00; TMOD = 0x20; TH1 = UART_BAUD_RATE_H; TL1 = UART_BAUD_RATE_L; TR1 = 1; SCON = UART_CONTROL_REG; // 连接MQTT服务器 UART_SendString(CONNECT_CMD); // 等待连接成功的回复 // 编写等待回复的代码 // 订阅主题 UART_SendString(SUBSCRIBE_CMD); // 等待订阅成功的回复 // 编写等待回复的代码 // 设备登录成功,进入循环 while (1) { // 定时上报数据,可以根据需求设置时间间隔 // 这里使用延时函数模拟时间间隔 delay(5000); // 上报数据到指定主题 UART_SendString(PUBLISH_CMD); // 等待上报完成的回复 // 编写等待回复的代码 }}4.4 锁控制代码// 引入必要的库#include <reg51.h>#include <string.h>// 定义串口通信相关的寄存器地址#define UART_BAUD_RATE_H 0xFD // 波特率高位#define UART_BAUD_RATE_L 0xFE // 波特率低位#define UART_CONTROL_REG 0x98 // 控制寄存器地址// 定义MQTT服务器信息#define MQTT_SERVER "mqtt.example.com" // MQTT服务器地址#define MQTT_PORT "1883" // MQTT端口号// 定义设备ID和认证信息#define DEVICE_ID "your_device_id" // 设备ID#define USERNAME "your_username" // 用户名#define PASSWORD "your_password" // 密码// 定义订阅主题#define SUBSCRIBE_TOPIC "your_subscribe_topic" // 订阅主题// 定义电磁锁的IO口连接图纸#define LOCK_1 P2_0 // 电磁锁1的控制IO口#define LOCK_2 P2_1 // 电磁锁2的控制IO口#define LOCK_3 P2_2 // 电磁锁3的控制IO口#define LOCK_4 P2_3 // 电磁锁4的控制IO口#define LOCK_5 P2_4 // 电磁锁5的控制IO口#define LOCK_6 P2_5 // 电磁锁6的控制IO口#define LOCK_7 P2_6 // 电磁锁7的控制IO口#define LOCK_8 P2_7 // 电磁锁8的控制IO口#define LOCK_9 P3_0 // 电磁锁9的控制IO口#define LOCK_10 P3_1 // 电磁锁10的控制IO口#define LOCK_11 P3_2 // 电磁锁11的控制IO口#define LOCK_12 P3_3 // 电磁锁12的控制IO口// 定义MQTT协议相关指令#define CONNECT_CMD "AT+CMQTTCONN=\"" MQTT_SERVER "\",\"" MQTT_PORT "\",\"" DEVICE_ID "\",\"" USERNAME "\",\"" PASSWORD "\"\r\n" // 连接指令#define SUBSCRIBE_CMD "AT+CMQTTSUB=\"" SUBSCRIBE_TOPIC "\",1\r\n" // 订阅指令// 定义串口发送函数void UART_SendString(char *str) { while (*str) { SBUF = *str; while (!TI); TI = 0; str++; }}// 电磁锁控制函数void controlLock(int lockNumber, int lockState) { switch (lockNumber) { case 3: // 控制电磁锁3 if (lockState == 1) { // 打开电磁锁 LOCK_3 = 1; } else { // 关闭电磁锁 LOCK_3 = 0; } break; case 4: // 控制电磁锁4 if (lockState == 1) { // 打开电磁锁 LOCK_4 = 1; } else { // 关闭电磁锁 LOCK_4 = 0; } break; case 5: // 控制电磁锁5 if (lockState == 1) { // 打开电磁锁 LOCK_5 = 1; } else { // 关闭电磁锁 LOCK_5 = 0; } break; case 6: // 控制电磁锁6 if (lockState == 1) { // 打开电磁锁 LOCK_6 = 1; } else { // 关闭电磁锁 LOCK_6 = 0; } break; case 7: // 控制电磁锁7 if (lockState == 1) { // 打开电磁锁 LOCK_7 = 1; } else { // 关闭电磁锁 LOCK_7 = 0; } break; case 8: // 控制电磁锁8 if (lockState == 1) { // 打开电磁锁 LOCK_8 = 1; } else { // 关闭电磁锁 LOCK_8 = 0; } break; case 9: // 控制电磁锁9 if (lockState == 1) { // 打开电磁锁 LOCK_9 = 1; } else { // 关闭电磁锁 LOCK_9 = 0; } break; case 10: // 控制电磁锁10 if (lockState == 1) { // 打开电磁锁 LOCK_10 = 1; } else { // 关闭电磁锁 LOCK_10 = 0; } break; case 11: // 控制电磁锁11 if (lockState == 1) { // 打开电磁锁 LOCK_11 = 1; } else { // 关闭电磁锁 LOCK_11 = 0; } break; case 12: // 控制电磁锁12 if (lockState == 1) { // 打开电磁锁 LOCK_12 = 1; } else { // 关闭电磁锁 LOCK_12 = 0; } break; default: // 锁编号无效 break;}}// 主函数void main() { // 配置串口通信波特率为9600bps PCON = 0x00; TMOD = 0x20; TH1 = UART_BAUD_RATE_H; TL1 = UART_BAUD_RATE_L; TR1 = 1; SCON = UART_CONTROL_REG; // 连接MQTT服务器 UART_SendString(CONNECT_CMD); // 等待连接成功的回复 // 编写等待回复的代码 // 订阅主题 UART_SendString(SUBSCRIBE_CMD); // 等待订阅成功的回复 // 编写等待回复的代码 // 设备登录成功,进入循环 while (1) { // 接收到MQTT消息后,解析并控制对应的电磁锁 // 编写接收和解析MQTT消息的代码 // 设备接收到的消息格式为 "LOCK_X_ON" 或 "LOCK_X_OFF",其中 X 为电磁锁编号 // 解析消息,并提取电磁锁编号和状态 int lockNumber; // 电磁锁编号 int lockState; // 电磁锁状态,0表示关闭,1表示打开 if (strncmp(receivedMessage, "LOCK_", 5) == 0) { lockNumber = receivedMessage[5] - '0'; // 提取锁编号 if (strstr(receivedMessage, "ON") != NULL) { lockState = 1; // 提取锁状态,ON表示打开 } else if (strstr(receivedMessage, "OFF") != NULL) { lockState = 0; // 提取锁状态,OFF表示关闭 } // 控制对应的电磁锁 controlLock(lockNumber, lockState); } }}六、总结这款基于单片机设计的智能储物柜是一种应用于游乐场、商场和景区等场所的便捷储物解决方案。用户可以通过微信小程序实时查看储物柜的可用状态,并选择指定柜子进行解锁。该智能储物柜支持4G联网,采用主控芯片STC12C5A60S2和4G联网模块E29 Cat-1来实现与网络的连接。用户在解锁储物柜时需要支付押金(预付金),随后系统开始计时并按照使用的时间进行收费。储物柜也支持临时解锁和存取物品功能。用户完成使用后,可以通过微信小程序完成订单结算。储物柜的锁采用电磁锁技术,通过控制相应的IO口来实现开锁或关锁。整体而言,该智能储物柜以单片机为核心,集成了4G通信模块、电磁锁和华为云物联网服务器等技术,提供方便、安全的储物服务。每个储物柜都是一个独立的设备,通过华为云物联网服务器实现数据传输和管理。基于单片机设计的智能储物柜在不同场所为用户提供便捷的储物解决方案,通过技术的融合和应用,提升用户体验和管理效率。
  • [问题求助] 基于WiFi MQTT协议的智慧农业案例连接云平台一直未激活。
    可以连接到WiFi,但好像连接不上云平台。这种情况是不是和ip或者hostname有关?我应该如何解决? 串口调试打印的内容:ATRCV:16 bytes:WIFI CONNECTED ATRCV:13 bytes:WIFI GOT IP ATRCV:6 bytes: OK [DEBUG][8482][link_tcpip_init] IOT_LINK:DO TCPIP LOAD-IMPLEMENT RET:0 [DEBUG][8488][dtls_al_init] IOT_LINK:DO DTLS LOAD-IMPLEMENT RET:0 [DEBUG][8494][mqtt_al_init] IOT_LINK:DO MQTT LOAD-IMPLEMENT RET:0 [DEBUG][8501][oc_mqtt_init] IOT_LINK:DO OC MQTT LOAD-IMPLEMENT RET:0 [DEBUG][8507][standard_app_demo_main] This Is MQTT V5 DEMOS:HC Display [DEBUG][8842][task_sensor_entry] SENSOR:lum:67.500000 temp:27.259102 hum:52.014954 [DEBUG][8851][hub_step] hub_step:enter [DEBUG][8855][dmp_connect] oc_mqtt_connect:server:117.78.5.125 port:1883 [DEBUG][8861][dmp_connect] oc_mqtt_connect:client_id:6597d800bf25ef73079d65a8_202401051800_0_0_1970000100 [DEBUG][8871][dmp_connect] oc_mqtt_connect:user:6597d800bf25ef73079d65a8_202401051800 passwd:da447e107b69bb7193645042cb3af00b1aede042b7bba03008cd79bd34be774e [DEBUG][11155][dmp_connect] oc_mqtt_connect:recode:6 :FAILED [DEBUG][11160][hub_step] hub_step:err:6 [DEBUG][14068][task_sensor_entry] SENSOR:lum:66.666664 temp:27.312508 hum:51.429008 [DEBUG][19294][task_sensor_entry] SENSOR:lum:65.833336 temp:27.365913 hum:51.062790 
  • [问题求助] 为什么天前些时候才写的MQTT接入代码突然就怎么都连不上云了。
    啥东西都没改着,验证也都没过期,为什么啊,
  • [热门活动] AIoT创新应用开发挑战任务(活动待启动,附件待补充)
    欢迎热爱创新的你,基于华为云IoT开展物联网应用创新,并将开发过程中的思考与成果以文字、视频等形式分享给更多开发者!本次挑战任务要求使用真实/模拟硬件设备,自定义行业场景完成实践案例开发,并将实践过程整理成文档/PPT,要求包括以下内容:1.  整体方案背景、需求(该方案用于什么场景、解决什么问题、需要什么技术)2.  方案设计(包括硬件选型、技术结构设计、用了华为云哪些能力等)3.  详细步骤(嵌入式开发、平台对接、上层应用如大屏、小程序、App的开发等)方案格式及内容框架要求参考本帖附件(登陆后可见)合格的方案将再评估后上线至 IoT开发者Demo案例专区 供更多开发者交流学习,优秀案例有机会被推荐参与华为开发者大赛!完成方案撰写后,请将文档发送到邮箱(iotcooperation@huawei.com),命名“AIoT案例开发+姓名+联系电话”小助手将进一步联系作者沟通,并依据方案的完整性、可行性、可用性等发放相应奖励。
  • [问题求助] 设备连上ioT,需要写脚本插件,我直接在encode里写上返回值数组,但是返回乱码
    现在设备连上iot了,需要写脚本插件,我直接在encode方法里面,写上返回值数组(二进制,十进制,十六进制的值都试过),编码时底部调试窗口返回正常,但在线调试页面返回的结果是乱码,如下图:在线调试返回:mqtt工具收到的消息:这个是什么原因导致的呢?
  • [技术干货] BearPi-HM_Nano(Hi3861)对接华为云IOT过程介绍
    一、前言BearPi-HM Nano开发板是一款功能齐全、易于使用、专门为HarmonyOS设计的开发板,适合用于开发基于HarmonyOS的应用程序。板载NFC电路及标准的E53接口,标准的E53接口可扩展智能加湿器、智能台灯、智能安防、智能烟感等案例。 主控MCU是Hi3861,Hi3861芯片是一款高度集成的2.4GHz WLAN SoC芯片,专门为物联网应用而设计。集成了高性能的CPU、2.4GHz无线基带和射频前端以及多种外设接口,如UART、SPI、I2C、GPIO等,可以满足各种物联网设备的需求。这篇文章演示在BearPi-HM_Nano开发板上使用MQTT协议连接华为IoT平台,使用的是E53_IA1 智慧农业扩展板与 BearPi-HM_Nano 开发板实现。下面是BearPi-HM Nano开发板的功能图介绍:二、开通华为云物联网平台在进行开发板环境搭建之前,先开通物联网平台,创建一个产品方便设备上云测试。华为云官网: cid:link_14打开官网,搜索物联网,就能快速找到 设备接入IoTDA。2.1 物联网平台介绍华为云物联网平台(IoT 设备接入云服务)提供海量设备的接入和管理能力,将物理设备联接到云,支撑设备数据采集上云和云端下发命令给设备进行远程控制,配合华为云其他产品,帮助我们快速构筑物联网解决方案。使用物联网平台构建一个完整的物联网解决方案主要包括3部分:物联网平台、业务应用和设备。物联网平台作为连接业务应用和设备的中间层,屏蔽了各种复杂的设备接口,实现设备的快速接入;同时提供强大的开放能力,支撑行业用户构建各种物联网解决方案。设备可以通过固网、2G/3G/4G/5G、NB-IoT、Wifi等多种网络接入物联网平台,并使用LWM2M/CoAP、MQTT、HTTPS协议将业务数据上报到平台,平台也可以将控制命令下发给设备。业务应用通过调用物联网平台提供的API,实现设备数据采集、命令下发、设备管理等业务场景。2.2 开通物联网服务地址: cid:link_12进来默认会提示开通标准版,在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=30​117.78.5.125 的 Ping 统计信息: 数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),往返行程的估计时间(以毫秒为单位): 最短 = 35ms,最长 = 42ms,平均 = 37ms​C:\Users\11266>MQTT协议接入端口号有两个,1883是非加密端口,8883是证书加密端口,单片机无法加载证书,所以使用1883端口比较合适。 接下来的ESP8266就采用1883端口连接华为云物联网平台。2.3 创建产品(1)创建产品点击产品页,再点击左上角创建产品。(2)填写产品信息根据自己产品名字填写。(3)产品创建成功(4)添加自定义模型产品创建完成之后,点击进入产品详情页面,翻到最下面可以看到模型定义。先点击自定义模型。再创建一个服务ID。接着点击新增属性。2.4 添加设备产品是属于上层的抽象模型,接下来在产品模型下添加实际的设备。添加的设备最终需要与真实的设备关联在一起,完成数据交互。(1)注册设备(2)根据自己的设备填写(3)保存设备信息创建完毕之后,点击保存并关闭,得到创建的设备密匙信息。该信息在后续生成MQTT三元组的时候需要使用。(4) 设备创建完成2.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_10业务流程:(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_10对于设备而言,一般会订阅平台下发消息给设备 这个主题。设备想接收平台下发的消息,就需要订阅平台下发消息给设备 的主题,订阅后,平台下发消息给设备,设备就会收到消息。如果设备想要知道平台下发的消息,需要订阅上面图片里标注的主题。以当前设备为例,最终订阅主题的格式如下:$oc/devices/{device_id}/sys/messages/down​最终的格式:$oc/devices/6419627e40773741f9fbdac7_dev1/sys/messages/down(4)主题发布格式对于设备来说,主题发布表示向云平台上传数据,将最新的传感器数据,设备状态上传到云平台。这个操作称为:属性上报。帮助文档地址:cid:link_8根据帮助文档的介绍, 当前设备发布主题,上报属性的格式总结如下:发布的主题格式:$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}}]}2.6 MQTT三元组MQTT协议登录需要填用户ID,设备ID,设备密码等信息,就像我们平时登录QQ,微信一样要输入账号密码才能登录。MQTT协议登录的这3个参数,一般称为MQTT三元组。接下来介绍,华为云平台的MQTT三元组参数如何得到。(1)MQTT服务器地址要登录MQTT服务器,首先记得先知道服务器的地址是多少,端口是多少。帮助文档地址:cid:link_7MQTT协议的端口支持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_11打开这个工具,填入设备的信息(也就是刚才创建完设备之后保存的信息),点击生成,就可以得到MQTT的登录信息了。下面是打开的页面:填入设备的信息: (上面两行就是设备创建完成之后保存得到的)直接得到三元组信息。得到三元组之后,设备端通过MQTT协议登录鉴权的时候,填入参数即可。ClientId 6419627e40773741f9fbdac7_dev1_0_0_2023032108Username 6419627e40773741f9fbdac7_dev1Password 861ac9e6a579d36888b2aaf97714be7af6c77017b017162884592bd68b086a6e3.7 模拟设备登录测试经过上面的步骤介绍,已经创建了产品,设备,数据模型,得到MQTT登录信息。 接下来就用MQTT客户端软件模拟真实的设备来登录平台。测试与服务器通信是否正常。(1)填入登录信息打开MQTT客户端软件,对号填入相关信息(就是上面的文本介绍)。然后,点击登录,订阅主题,发布主题。(2)打开网页查看完成上面的操作之后,打开华为云网页后台,可以看到设备已经在线了。点击详情页面,可以看到上传的数据。到此,云平台的部署已经完成,设备已经可以正常上传数据了。三、BearPi-HM_Nano开发板环境搭建3.1 环境介绍在嵌入式开发中,很多开发者习惯于使用Windows进行代码编辑、编译、调试下载。比如,使用keil、IAR、或者Visual Studio Code等IDE。但当前阶段,OpenHarmony源码还不支持在Windows环境下进行编译,如Hi3861、Hi3516系列开发板。需要在Linux系统下进行,建议使用Ubuntu的编译环境对源码进行编译。搭建Ubuntu系统的开发环境也相对比较麻烦的,需要安装很多的库,可能遇到网络问题或者Ubuntu系统本身仓库源的问题导致下载不下来,等等的各种问题。对Linux不熟悉的初学者可能就有点头大。在官方的教程里提供了两种方式快速搭建环境。(1)自己安装虚拟机、安装Ubuntu系统、然后根据教程进行安装各种库,完成编译环境的搭建。(2)自己安装虚拟机,下载官方的镜像,解压直接打开运行。--这种就是最简单的,相当于把别人搭建好环境的电脑直接搬过来用,不用管环境搭建问题了,是最方便的。教程地址:cid:link_03.2 下载所需镜像下载官方提供镜像下载地址(百度云):https://pan.baidu.com/s/1T0Tcl3y48C1p5L6y-6HJNg 提取码:eusr下载HiBurn下载地址(百度云):https://pan.baidu.com/s/1bp2ypAfH2HaNPTY2KwEhEA 提取码:1234下载并安装虚拟机VMware Workstation下载地址:https://www.vmware.com/products/workstation-player/workstation-player-evaluation.html下载并安装MobaXterm工具下载地址:https://en.softonic.com/download/moba/windows/post-download下载并安装RaiDrive工具下载地址:https://forspeed.rbread05.cn/down/newdown/5/28/RaiDrive.rar下载并安装开发板USB驱动下载地址:http://www.wch.cn/search?q=ch340g&t=downloads下载并安装VS Code下载地址:https://code.visualstudio.com3.3 运行Ubuntu系统(1)要先安装虚拟机VMware Workstation,安装最新版即可。(2)解压百度云下载的HarmonyOSUbuntu18.4镜像OVF.zip文件到某个目录。(3)打开VMware Workstation工具(4)选择第2步解压的Ubuntu18.4镜像OVF文件夹中,点击打开(5)导入镜像到本地磁盘(选择一个磁盘空间大小≥ 10G的盘),点击导入。(6)点击开启此虚拟机,来开启虚拟机电源(7)此时虚拟机进入登录界面,点击HarmonyOS(8)输入密码:bearpi,然后点击登录(9)进入桌面后,点击桌面空白处右键,点击打开终端(E)在终端中输入ifconfig,然后点击回车,除lo外,另外一个就是你的网卡信息,记录你获取到的IP地址。(11)最小化VMware Workstation,回到Windows桌面上。(12)附加:如果连不上网络 在VMware Workstation中,点击虚拟机>> 设置然后在网络适配器中,改成NAT 模式,点击确定然后再恢复步骤9。3.4 在Windows上远程连接服务器(1)打开MobaXterm工具,并依次点击:Session,SSH 按钮。(2)输入连接信息,远程地址,并点击OK(3)输入账号:bearpi,点击回车(4)输入密码:bearpi,注意,输入密码的时候屏幕不会显示,输完之后点击回车(5)在弹出的界面上,点击Yes保存账号信息,以免下次输入3.5 把ubuntu文件远程映射到Windows上(1)安装RaiDrive软件根据提示,点击下一步安装,全部选项默认。(2)切换为中文语言(3)添加链接信息取消勾选只读SFTP://__ 输入前面获取到的IP地址账户:账号和密码皆为 bearpi其他默认点击确定(4)查看本地映射的ubuntu文件路径3.6 在ubuntu获取源码(1)鼠标焦点移到MobaXterm(2)在MobaXterm中输入:cd /home/bearpi然后回车(3)在MobaXterm中输入:mkdir project && cd project然后回车(4)在MobaXterm中输入:hpm init -t default然后回车(5)在MobaXterm中输入:hpm i @bearpi/bearpi_hm_nano然后回车,等待1-3分钟(根据不同网速)(6)当屏幕中出现Installed.意味着代码获取完成源码也可以直接在Gitee上直接下载。通过git clone单个代码仓库,进入代码仓库主页:cid:link_13,选择需要克隆的代码仓库,执行命令,如:git clone cid:link_13.git -b master执行以下命令编译源码python build.py BearPi-HM_Nano3.7 编译代码(1)在MobaXterm中输入:hpm dist然后回车,等待直到屏幕出现:BUILD SUCCESS字样,说明编译成功。(2)查看编译出的固件位置当编译完后,在Windows中可以直接查看到最终编译的固件,具体路径在:3.8 连接开发板(1)通过TypeC数据线,把电脑与BearPi-HM Nano连接。(2)安装CH340驱动。下载地址:http://www.wch.cn/search?q=ch340g&t=downloads(3)如果虚拟机把USB给抢占进去了,可以先挂起虚拟机,重新拔插USB。(4)查看开发板的串口3.9 下载程序(1)在Windows打开Hiburn工具,并点击Refresh,在COM中选择第八-4看到的COM号然后点击Setting,并选择 Com settings,(2)在Com settings中设置Baud为:921600,点击确定(3)点击 Hiburn工具中的Select file按钮,选中:Hi3861_wifiiot_app_allinone.bin 文件。(4)点击Auto burn复选框,然后点击Connect此时Connect按钮变成Disconnect,等待下载(5)复位开发板RESET按键,开始下载程序(6)直到出现Execution Successful字样,程序下载完成。(7)下载完后,点击Disconnect按钮,便于后面调测使用。3.10 MobaXterm 查看串口打印日志(1)打开MobaXterm,(2)点击:Session、Serial按钮(3)设置Seral port为 Hiburn 同一个串口(4)设置Speed为 115200(5)点击OK(6)复位开发板,此时COM打印出对应日志信息四、连接华为云IOT平台4.1 MQTT相关函数功能介绍(1)设置设备信息void device_info_init(char *client_id, char * username, char *password);设置设备信息,在调用oc_mqtt_init()前要先设置设备信息(2)华为IoT平台 初始化int oc_mqtt_init(void);华为IoT平台初始化函数,需要在使用 华为IoT平台 功能前调用。(3)设置命令响应函数void oc_set_cmd_rsp_cb(void(*cmd_rsp_cb)(uint8_t *recv_data, size_t recv_size, uint8_t **resp_data, size_t *resp_size));设置命令响应回调函数。(4)设备消息上报int oc_mqtt_profile_msgup(char *deviceid,oc_mqtt_profile_msgup_t *payload);是指设备无法按照产品模型中定义的属性格式进行数据上报时,可调用此接口将设备的自定义数据上报给平台,平台将设备上报的消息转发给应用服务器或华为云其他云服务上进行存储和处理。(5)设备上报属性数据int oc_mqtt_profile_propertyreport(char *deviceid,oc_mqtt_profile_service_t *payload);用于设备按产品模型中定义的格式将属性数据上报给平台。(6)网关批量上报属性数据int oc_mqtt_profile_gwpropertyreport(char *deviceid,oc_mqtt_profile_device_t *payload);用于批量设备上报属性数据给平台。网关设备可以用此接口同时上报多个子设备的属性数据。(7)属性设置的响应结果int oc_mqtt_profile_propertysetresp(char *deviceid,oc_mqtt_profile_propertysetresp_t *payload);(8)属性查询响应结果int oc_mqtt_profile_propertygetresp(char *deviceid,oc_mqtt_profile_propertygetresp_t *payload);(9)将命令的执行结果返回给平台int oc_mqtt_profile_cmdresp(char *deviceid,oc_mqtt_profile_cmdresp_t *payload); 平台下发命令后,需要设备及时将命令的执行结果返回给平台,如果设备没回响应,平台会认为命令执行超时。4.2 连接平台在连接平台需要在device_info_init函数里填入CLIENT_ID、USERNAME、PASSWORD。这个信息前面第2章节已经介绍了。WifiConnect("da_666","12345678");device_info_init(CLIENT_ID,USERNAME,PASSWORD);oc_mqtt_init();oc_set_cmd_rsp_cb(oc_cmd_rsp_cb);修改iot_cloud_oc_sample.c文件。4.3 上传数据当需要上传数据时,需要先拼装数据,然后通过oc_mqtt_profile_propertyreport上报数据。代码示例如下:static void deal_report_msg(report_t *report){ oc_mqtt_profile_service_t service; oc_mqtt_profile_kv_t temperature; oc_mqtt_profile_kv_t humidity; oc_mqtt_profile_kv_t luminance; oc_mqtt_profile_kv_t led; oc_mqtt_profile_kv_t motor; service.event_time = NULL; service.service_id = "Agriculture"; service.service_property = &temperature; service.nxt = NULL; temperature.key = "Temperature"; temperature.value = &report->temp; temperature.type = EN_OC_MQTT_PROFILE_VALUE_INT; temperature.nxt = &humidity; humidity.key = "Humidity"; humidity.value = &report->hum; humidity.type = EN_OC_MQTT_PROFILE_VALUE_INT; humidity.nxt = &luminance; luminance.key = "Luminance"; luminance.value = &report->lum; luminance.type = EN_OC_MQTT_PROFILE_VALUE_INT; luminance.nxt = &led; led.key = "LightStatus"; led.value = g_app_cb.led?"ON":"OFF"; led.type = EN_OC_MQTT_PROFILE_VALUE_STRING; led.nxt = &motor; motor.key = "MotorStatus"; motor.value = g_app_cb.motor?"ON":"OFF"; motor.type = EN_OC_MQTT_PROFILE_VALUE_STRING; motor.nxt = NULL; oc_mqtt_profile_propertyreport(USERNAME,&service); return;}4.4 云平台下发的命令接收华为IoT平台支持下发命令,命令是用户自定义的。接收到命令后会将命令数据发送到队列中,task_main_entry函数中读取队列数据并调用deal_cmd_msg函数进行处理,代码示例如下:void oc_cmd_rsp_cb(uint8_t *recv_data, size_t recv_size, uint8_t **resp_data, size_t *resp_size){ app_msg_t *app_msg; int ret = 0; app_msg = malloc(sizeof(app_msg_t)); app_msg->msg_type = en_msg_cmd; app_msg->msg.cmd.payload = (char *)recv_data; printf("recv data is %.*s\n", recv_size, recv_data); ret = osMessageQueuePut(mid_MsgQueue,&app_msg,0U, 0U); if(ret != 0){ free(recv_data); } *resp_data = NULL; *resp_size = 0;}static int task_main_entry( void ){ app_msg_t *app_msg; WifiConnect("TP-LINK_65A8","0987654321"); device_info_init(CLIENT_ID,USERNAME,PASSWORD); oc_mqtt_init(); oc_set_cmd_rsp_cb(oc_cmd_rsp_cb); while(1){ app_msg = NULL; (void)osMessageQueueGet(mid_MsgQueue,(void **)&app_msg,NULL, 0U); if(NULL != app_msg){ switch(app_msg->msg_type){ case en_msg_cmd: deal_cmd_msg(&app_msg->msg.cmd); break; case en_msg_report: deal_report_msg(&app_msg->msg.report); break; default: break; } free(app_msg); } } return 0;}static void deal_cmd_msg(cmd_t *cmd){ cJSON *obj_root; cJSON *obj_cmdname; cJSON *obj_paras; cJSON *obj_para; int cmdret = 1; oc_mqtt_profile_cmdresp_t cmdresp; obj_root = cJSON_Parse(cmd->payload); if(NULL == obj_root){ goto EXIT_JSONPARSE; } obj_cmdname = cJSON_GetObjectItem(obj_root,"command_name"); if(NULL == obj_cmdname){ goto EXIT_CMDOBJ; } if(0 == strcmp(cJSON_GetStringValue(obj_cmdname),"Agriculture_Control_light")){ obj_paras = cJSON_GetObjectItem(obj_root,"paras"); if(NULL == obj_paras){ goto EXIT_OBJPARAS; } obj_para = cJSON_GetObjectItem(obj_paras,"Light"); if(NULL == obj_para){ goto EXIT_OBJPARA; } ///< operate the LED here if(0 == strcmp(cJSON_GetStringValue(obj_para),"ON")){ g_app_cb.led = 1; Light_StatusSet(ON); printf("Light On!"); } else{ g_app_cb.led = 0; Light_StatusSet(OFF); printf("Light Off!"); } cmdret = 0; } else if(0 == strcmp(cJSON_GetStringValue(obj_cmdname),"Agriculture_Control_Motor")){ obj_paras = cJSON_GetObjectItem(obj_root,"Paras"); if(NULL == obj_paras){ goto EXIT_OBJPARAS; } obj_para = cJSON_GetObjectItem(obj_paras,"Motor"); if(NULL == obj_para){ goto EXIT_OBJPARA; } ///< operate the Motor here if(0 == strcmp(cJSON_GetStringValue(obj_para),"ON")){ g_app_cb.motor = 1; Motor_StatusSet(ON); printf("Motor On!"); } else{ g_app_cb.motor = 0; Motor_StatusSet(OFF); printf("Motor Off!"); } cmdret = 0; }EXIT_OBJPARA:EXIT_OBJPARAS:EXIT_CMDOBJ: cJSON_Delete(obj_root);EXIT_JSONPARSE: ///< do the response cmdresp.paras = NULL; cmdresp.request_id = cmd->request_id; cmdresp.ret_code = cmdret; cmdresp.ret_name = NULL; (void)oc_mqtt_profile_cmdresp(NULL,&cmdresp); return;}4.6 平台地址修改据自己使用的平台版本修改oc_mqtt.h中第47行附近的平台对接地址。这个根据自己的产品确定,2023年1月1日新开通的都是标准版了。#ifndef LITEOS_LAB_IOT_LINK_OC_OC_MQTT_OC_MQTT_PROFILE_OC_MQTT_PROFILE_H_#define LITEOS_LAB_IOT_LINK_OC_OC_MQTT_OC_MQTT_PROFILE_OC_MQTT_PROFILE_H_#include <stdint.h>#define OC_SERVER_URL "tcp://183.230.40.39:6002"// #define OC_SERVER_IP "121.36.42.100" //基础版平台对接地址#define OC_SERVER_IP "117.78.5.125" //标准版平台对接地址#define OC_SERVER_PORT 1883#define OC_CLIENT_ID_LEN 128#define OC_USERNAME_LEN 128#define OC_PASSWORD_LEN 1284.7 编译、烧写代码代码修改之后编译烧录,按下开发板的RESET按键,通过串口助手查看日志,会打印温湿度及光照强度信息,打开云平台的后台可以看到设备已经在线。
总条数:623 到第
上滑加载中