回复
梅科尔工作室-看鸿蒙设备开发实战14天笔记(八)-设备联网上云
星如雪_梭如月
发布于 2022-7-25 15:14
浏览
0收藏
###本文章仅整理视频笔记及对一些地方的解释,如果想看详细内容,请在鸿蒙开发者学堂搜索鸿蒙设备开发###
###本文章图片来自视频后PDF文档,本文侧重代码讲解###
1.华为IOT平台介绍及产品创建
1.1.平台介绍
1.2.产品创建
1.3.创建步骤
打开链接
设备接入_IoTDA_IoT_物联网IoT平台-华为云 (huaweicloud.com)
注册并实名认证
右上角创建产品
创建完成后点击查看
点击自定义模型,创建一个模型
之后添加属性是传到云上的属性,添加命令可以向设备下发命令。属性,命令,服务id都可以按照1.2产品创建第二张图进行。
2.产品代码
2.1.代码实例
2.2.代码讲解
引入库文件,定义消息队列结构体以及最大长度16,创建两个不同优先级任务
通过在云平台在线调试并将两个值带入网址(下面第二个图)可得三个参数
定义枚举以及相关结构体。
第一个任务函数,连接wifi,配置设备信息,初始化MQTT客户端,定义命令回调函数,根据消息队列传的类型选择执行哪个函数(msg_type),命令或report函数。
是对命令进行处理(开关灯)还是对消息进行上报
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;
}
命令处理
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;
}
消息上报
而第二个优先级更高的任务一直在读取传感器的值,并上传消息队列,通过第一个任务选择上传函数对数据进行处理
数据上报函数前面一部分为JSON数据的拼装
服务id要与华为云创建时的一致
后面是在华为云创建的属性,第一个是属性名,第二个是第二个任务从传感器上读取的数据,第三个为类型,第四个指向到下面的属性直到NULL则不需进行进一步封装。
第一个任务对应命令处理中控制灯亮灭的代码
控制舵机的代码
之后的操作也可以在华为云平台在线调试对设备进行调试(控制)
分类
已于2022-7-25 15:14:57修改
赞
收藏
回复
相关推荐