云平台下发命令控制小熊派开发板

举报
秦玉安 发表于 2021/08/26 15:25:54 2021/08/26
【摘要】 云平台下发命令控制小熊派开发板

云平台下发命令控制小熊派开发板

1:登录产品,设置产品下发命令属性

登录地址:https://console.huaweicloud.com/iotdm/?region=cn-north-4#/dm-dev/cc705a8fcac74570a700fedf521c6513/product-detail/6125b7360ad1ed028663b18c

点击添加命令,自定义命令名称,这个命名为CMD

image-20210826144132460

下发控制命令,主要有两个,一个是控制LED灯,一个是控制电机,添加控制LED灯命令参数。

image-20210826144310774

参数名称写Light,数据类型选择字符串类型,长度这里选择3,因为ON,OFF,这两个字符串中,OFF占3个字节,ON占2个字节,以多的为长度最大值。枚举的时候用英文逗号隔开,ON表示打开,OFF表示关闭。

image-20210826144522166

同样的,我们设置电机的控制命令,也是使用ON,OFF两个命令来来控制电机的开关。

2:编写代码,找到下发命令控制函数

函数里面下发命令参数必须和自己设置的下发命令必须要一致,否则无法控制。下发控制命令具体函数如下

/*下发命令处理*/
static int app_cmd_task_entry()
{
    int ret = -1;
    char *rec_str = NULL;
    char topic_str[topic_str_len];
    cJSON *rec_msg_json = NULL;
    cJSON* cjson_root = NULL;
    cJSON* cjson_paras = NULL;
    
    while(1)
    {
        if(osal_semp_pend(s_rcv_sync,cn_osal_timeout_forever))
        {
            rec_msg_json = cJSON_Parse((const char *)s_rcv_buffer);
            cjson_root  = (cJSON *)cJSON_CreateObject();
            cjson_paras = (cJSON *)cJSON_CreateObject();
            if (cjson_root == NULL)
                goto CJSON_ERROR_EXIT;

            if (cjson_paras == NULL)
            {
                cJSON_Delete(cjson_root);
                goto CJSON_ERROR_EXIT;   
            }

            if (cJSON_HasObjectItem(cJSON_GetObjectItem(rec_msg_json, "paras"), "Light"))   //Light
            {
                rec_str = cJSON_GetStringValue(cJSON_GetObjectItem(cJSON_GetObjectItem(rec_msg_json, "paras"), "Light"));
                if (strstr(rec_str, "ON"))
                {
                    HAL_GPIO_WritePin(IA1_Light_GPIO_Port, IA1_Light_Pin, GPIO_PIN_SET);
                }
                else if (strstr(rec_str, "OFF"))
                {
                    HAL_GPIO_WritePin(IA1_Light_GPIO_Port, IA1_Light_Pin, GPIO_PIN_RESET);
                }
                else
                    goto EXIT;
                
                //Report excute state
            }
            else if (cJSON_HasObjectItem(cJSON_GetObjectItem(rec_msg_json, "paras"), "Motor"))  //Motor
            {
                rec_str = cJSON_GetStringValue(cJSON_GetObjectItem(cJSON_GetObjectItem(rec_msg_json, "paras"), "Motor"));
                if (strstr(rec_str, "ON"))
                {
                    HAL_GPIO_WritePin(IA1_Motor_GPIO_Port, IA1_Motor_Pin, GPIO_PIN_SET);
                }
                else if (strstr(rec_str, "OFF"))
                {
                    HAL_GPIO_WritePin(IA1_Motor_GPIO_Port, IA1_Motor_Pin, GPIO_PIN_RESET);
                }
                else
                    goto EXIT;
            }
            cJSON_AddNumberToObject(cjson_root, "result_code", 0);
            cJSON_AddStringToObject(cjson_root, "response_name", "COMMAND_RESPONSE");
            cJSON_AddStringToObject(cjson_paras, "result", "success");
            cJSON_AddItemToObject(cjson_root, "paras", cjson_paras);
            rec_str = cJSON_Print(cjson_root);
            printf("rec_str = %s\r\n", rec_str);
            memset(topic_str, 0, topic_str_len);
            sprintf(topic_str, TOPIC_RESPONSE_REPORT, s_topic_request_id);
            oc_mqtt_publish(topic_str, (uint8_t *)rec_str, strlen(rec_str),s_qos);

            EXIT:
                cJSON_Delete(cjson_root);
                if (rec_str != NULL)
                    osal_free(rec_str);

            CJSON_ERROR_EXIT:
                cJSON_Delete(rec_msg_json);
        }
    }

    return ret;
}

其中,(cJSON_HasObjectItem(cJSON_GetObjectItem(rec_msg_json, “paras”), “Light”)) 和cJSON_GetStringValue(cJSON_GetObjectItem(cJSON_GetObjectItem(rec_msg_json, “paras”), “Light”))

            if (cJSON_HasObjectItem(cJSON_GetObjectItem(rec_msg_json, "paras"), "Light"))   //Light
            {
                rec_str = cJSON_GetStringValue(cJSON_GetObjectItem(cJSON_GetObjectItem(rec_msg_json, "paras"), "Light"));
                if (strstr(rec_str, "ON"))
                {
                    HAL_GPIO_WritePin(IA1_Light_GPIO_Port, IA1_Light_Pin, GPIO_PIN_SET);
                }
                else if (strstr(rec_str, "OFF"))
                {
                    HAL_GPIO_WritePin(IA1_Light_GPIO_Port, IA1_Light_Pin, GPIO_PIN_RESET);
                }
                else
                    goto EXIT;
                
                //Report excute state
            }

这里面的Light就是我们设置的下发命令的参数。ON和OFF就是两个下发控制命令

3:在线调试下发命令控制

回到物联网平台,点击监控运维—在线调试,

image-20210826145316216

进入在线调试之后,点击右上角的—选择设备,选择我们自己创建的设备。

image-20210826145437807

进行电机控制命令,选择ON,表示打开,选择OFF,表示关闭,在应用模拟器中,可以查看发送过去的命令。

image-20210826145612847

接着进行LED灯控制,同样选择ON,表示打开,选择OFF,表示关闭,在应用模拟器中,可以查看发送过去的命令。

image-20210826145723487

4:在线调试下发命令控制

实现现象,打开LED

image-20210826150909581

关闭LED

image-20210826150933696

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

举报
请填写举报理由
0/200