云平台下发命令控制小熊派开发板
云平台下发命令控制小熊派开发板
1:登录产品,设置产品下发命令属性
点击添加命令,自定义命令名称,这个命名为CMD
下发控制命令,主要有两个,一个是控制LED灯,一个是控制电机,添加控制LED灯命令参数。
参数名称写Light,数据类型选择字符串类型,长度这里选择3,因为ON,OFF,这两个字符串中,OFF占3个字节,ON占2个字节,以多的为长度最大值。枚举的时候用英文逗号隔开,ON表示打开,OFF表示关闭。
同样的,我们设置电机的控制命令,也是使用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:在线调试下发命令控制
回到物联网平台,点击监控运维—在线调试,
进入在线调试之后,点击右上角的—选择设备,选择我们自己创建的设备。
进行电机控制命令,选择ON,表示打开,选择OFF,表示关闭,在应用模拟器中,可以查看发送过去的命令。
接着进行LED灯控制,同样选择ON,表示打开,选择OFF,表示关闭,在应用模拟器中,可以查看发送过去的命令。
4:在线调试下发命令控制
实现现象,打开LED
关闭LED
- 点赞
- 收藏
- 关注作者
评论(0)