梅科尔工作室-看鸿蒙设备开发实战14天笔记(八)-设备联网上云

星如雪_梭如月
发布于 2022-7-25 15:14
浏览
0收藏

###本文章仅整理视频笔记及对一些地方的解释,如果想看详细内容,请在鸿蒙开发者学堂搜索鸿蒙设备开发###

###本文章图片来自视频后PDF文档,本文侧重代码讲解###

1.华为IOT平台介绍及产品创建

1.1.平台介绍

梅科尔工作室-看鸿蒙设备开发实战14天笔记(八)-设备联网上云-鸿蒙开发者社区

1.2.产品创建

梅科尔工作室-看鸿蒙设备开发实战14天笔记(八)-设备联网上云-鸿蒙开发者社区

梅科尔工作室-看鸿蒙设备开发实战14天笔记(八)-设备联网上云-鸿蒙开发者社区

1.3.创建步骤

打开链接

设备接入_IoTDA_IoT_物联网IoT平台-华为云 (huaweicloud.com)

注册并实名认证

梅科尔工作室-看鸿蒙设备开发实战14天笔记(八)-设备联网上云-鸿蒙开发者社区

右上角创建产品

梅科尔工作室-看鸿蒙设备开发实战14天笔记(八)-设备联网上云-鸿蒙开发者社区

创建完成后点击查看

梅科尔工作室-看鸿蒙设备开发实战14天笔记(八)-设备联网上云-鸿蒙开发者社区

点击自定义模型,创建一个模型

梅科尔工作室-看鸿蒙设备开发实战14天笔记(八)-设备联网上云-鸿蒙开发者社区

之后添加属性是传到云上的属性,添加命令可以向设备下发命令。属性,命令,服务id都可以按照1.2产品创建第二张图进行。

2.产品代码

2.1.代码实例

梅科尔工作室-看鸿蒙设备开发实战14天笔记(八)-设备联网上云-鸿蒙开发者社区

2.2.代码讲解

梅科尔工作室-看鸿蒙设备开发实战14天笔记(八)-设备联网上云-鸿蒙开发者社区

梅科尔工作室-看鸿蒙设备开发实战14天笔记(八)-设备联网上云-鸿蒙开发者社区

引入库文件,定义消息队列结构体以及最大长度16,创建两个不同优先级任务

梅科尔工作室-看鸿蒙设备开发实战14天笔记(八)-设备联网上云-鸿蒙开发者社区

通过在云平台在线调试并将两个值带入网址(下面第二个图)可得三个参数

梅科尔工作室-看鸿蒙设备开发实战14天笔记(八)-设备联网上云-鸿蒙开发者社区

梅科尔工作室-看鸿蒙设备开发实战14天笔记(八)-设备联网上云-鸿蒙开发者社区

梅科尔工作室-看鸿蒙设备开发实战14天笔记(八)-设备联网上云-鸿蒙开发者社区

定义枚举以及相关结构体。

梅科尔工作室-看鸿蒙设备开发实战14天笔记(八)-设备联网上云-鸿蒙开发者社区

第一个任务函数,连接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;
}

 

消息上报

而第二个优先级更高的任务一直在读取传感器的值,并上传消息队列,通过第一个任务选择上传函数对数据进行处理

梅科尔工作室-看鸿蒙设备开发实战14天笔记(八)-设备联网上云-鸿蒙开发者社区

数据上报函数前面一部分为JSON数据的拼装

梅科尔工作室-看鸿蒙设备开发实战14天笔记(八)-设备联网上云-鸿蒙开发者社区

服务id要与华为云创建时的一致

梅科尔工作室-看鸿蒙设备开发实战14天笔记(八)-设备联网上云-鸿蒙开发者社区

后面是在华为云创建的属性,第一个是属性名,第二个是第二个任务从传感器上读取的数据,第三个为类型,第四个指向到下面的属性直到NULL则不需进行进一步封装。

梅科尔工作室-看鸿蒙设备开发实战14天笔记(八)-设备联网上云-鸿蒙开发者社区

第一个任务对应命令处理中控制灯亮灭的代码

梅科尔工作室-看鸿蒙设备开发实战14天笔记(八)-设备联网上云-鸿蒙开发者社区

控制舵机的代码

之后的操作也可以在华为云平台在线调试对设备进行调试(控制)

 

 

 

 

分类
已于2022-7-25 15:14:57修改
收藏
回复
举报
回复
    相关推荐