【IoT最佳实践】基于小熊派开发板的物联网实战开发(五)-开发数据上报与命令下发功能
上一期:基于小熊派开发板的物联网实战开发(四)-开发智慧农业传感器数据收集功能
请先完成前几期的实验再来操作本期实验。
添加数据上报任务代码
在“agent_tiny_demo.c”中添加数据上报任务代码;
void app_data_report(void) { data_report_t report_data; int ret = 0; int cnt = 0; UINT32 msgid; msgid = 0; sprintf(t_report_buf, "%02d", msgid);
report_data.buf = (uint8_t *)s_report_buf; report_data.callback = ack_callback; report_data.cookie = 0; report_data.len = sizeof(s_report_buf); report_data.type = APP_DATA; (void)ret; while(1) { report_data.cookie = cnt; cnt++; HexStrToStr(t_report_buf,s_report_buf,strlen(t_report_buf)); ret = atiny_data_report(g_phandle, &report_data); ATINY_LOG(LOG_DEBUG, "data report ret: %d\n", ret); ret = atiny_data_change(g_phandle, DEVICE_MEMORY_FREE); ATINY_LOG(LOG_DEBUG, "data change ret: %d\n", ret); (void)LOS_TaskDelay(500 * 8); } } |
在“agent_tiny_demo.c”中添加创建数据上报任务代码;
{ UINT32 uwRet = LOS_OK; TSK_INIT_PARAM_S task_init_param; UINT32 TskHandle;
task_init_param.usTaskPrio = 1; task_init_param.pcName = "app_data_report"; task_init_param.pfnTaskEntry = (TSK_ENTRY_FUNC)app_data_report; task_init_param.uwStackSize = 0x800;
uwRet = LOS_TaskCreate(&TskHandle, &task_init_param); if(LOS_OK != uwRet) { return uwRet; } return uwRet;
} |
在“agent_tiny_entry(void)”函数中,添加调用“creat_collection_task”创建上报数据任务的代码;
uwRet = creat_report_task(); if(LOS_OK != uwRet) { return; } |
点击“保存”,点击“编译”,等待提示“编译成功”;
打开手机WIFI热点,设置热点名称密码和代码中一致;
点击“烧录”,等待提示“烧录成功”;
在OceanConnect平台上,设备的“历史数据”中,可以看到实时上报的数据。
添加命令响应任务代码
在“agent_tiny_cmd_ioctl.c”文件中添加智慧农业传感器头文件;
#include "E53_IA1.h" |
在“atiny_write_app_write”函数中,添加处理“Agriculture_Control_Light”、“Agriculture_Control_Motor”两个命令下发消息的代码,点击“保存”;
memcpy(recvmid,tmpbuf + 2, 4); if(cmd_data[0]==0x01) //messageid for Agriculture_Control_Light { if(cmd_data[3]==0x4F && cmd_data[4]==0x4E) //ON { HAL_GPIO_WritePin(IA1_Light_GPIO_Port, IA1_Light_Pin, GPIO_PIN_SET);
char* respmsgid = "02"; //messageid for Agriculture_Control_Light reply memcpy(s_resp_buf, respmsgid, 2); memcpy(s_resp_buf + 2, recvmid, 4); char* reply = "0001"; memcpy(s_resp_buf + 6, reply, 4); LOS_SemPost(reply_sem); } if (cmd_data[3]==0x4F && cmd_data[4]==0x46 && cmd_data[5]==0x46) //OFF { HAL_GPIO_WritePin(IA1_Light_GPIO_Port, IA1_Light_Pin, GPIO_PIN_RESET);
char* respmsgid = "02"; //messageid for Agriculture_Control_Light reply memcpy(s_resp_buf, respmsgid, 2); memcpy(s_resp_buf + 2, recvmid, 4); char* reply = "0000"; memcpy(s_resp_buf + 6, reply, 4); LOS_SemPost(reply_sem); } } if(cmd_data[0]==0x03) //messageid for Agriculture_Control_Motor { if(cmd_data[3]==0x4F && cmd_data[4]==0x4E) //ON { HAL_GPIO_WritePin(IA1_Motor_GPIO_Port, IA1_Motor_Pin, GPIO_PIN_SET);
char* respmsgid = "04"; //messageid for Agriculture_Control_Motor reply memcpy(s_resp_buf, respmsgid, 2); memcpy(s_resp_buf + 2, recvmid, 4); char* reply = "0001"; memcpy(s_resp_buf + 6, reply, 4); LOS_SemPost(reply_sem); } if (cmd_data[3]==0x4F && cmd_data[4]==0x46 && cmd_data[5]==0x46) //OFF { HAL_GPIO_WritePin(IA1_Motor_GPIO_Port, IA1_Motor_Pin, GPIO_PIN_RESET);
char* respmsgid = "04"; //messageid for Agriculture_Control_Motor reply memcpy(s_resp_buf, respmsgid, 2); memcpy(s_resp_buf + 2, recvmid, 4); char* reply = "0000"; memcpy(s_resp_buf + 6, reply, 4); LOS_SemPost(reply_sem); } } |
在“agent_tiny_demo.c”中添加命令响应任务代码;
VOID reply_report_task(VOID) { data_report_t reply_data; int ret = 0; int cnt = 0;
reply_data.buf = (uint8_t *)r_report_buf; reply_data.callback = ack_callback; reply_data.cookie = 0; reply_data.len = sizeof(r_report_buf); reply_data.type = APP_DATA; while (1) { LOS_SemPend(reply_sem, LOS_WAIT_FOREVER); printf("This is reply_report_task\n"); HexStrToStr(s_resp_buf,r_report_buf,strlen(s_resp_buf)); if(atiny_data_report(g_phandle, &reply_data)>=0) //上报数据 { printf("ocean_send_reply OK!\n"); } else { printf("ocean_send_reply Fail!\n"); } memset(s_resp_buf, 0, sizeof(s_resp_buf)); } } |
在“agent_tiny_demo.c”中添加创建命令响应任务代码;
{ UINT32 uwRet = LOS_OK; TSK_INIT_PARAM_S task_init_param; UINT32 TskHandle;
task_init_param.usTaskPrio = 1; task_init_param.pcName = "reply_report_task"; task_init_param.pfnTaskEntry = (TSK_ENTRY_FUNC)reply_report_task; task_init_param.uwStackSize = 0x800; uwRet = LOS_TaskCreate(&TskHandle, &task_init_param); if(LOS_OK != uwRet) { return uwRet; } return uwRet; } |
在“agent_tiny_entry(void)”函数中,添加调用“creat_reply_report_task”创建上报数据任务的代码;
uwRet = LOS_SemCreate(0,&reply_sem); if (uwRet != LOS_OK) { return ; }
uwRet = creat_reply_report_task(); if (uwRet != LOS_OK) { return ; } |
点击“保存”,点击“编译”,等待提示“编译成功”;
打开手机WIFI热点,设置热点名称密码和代码中一致;
点击“烧录”,等待提示“烧录成功”;
打开OceanConnect平台,下发“Agriculture”服务的两个命令“Agriculture_Control_Light”、“Agriculture_Control_Motor”,执行成功。
打开设备的“历史命令”,可以看到命令“执行成功”;
下发“Agriculture_Control_Light”命令时,可以看到智慧农业扩展板的补光灯开关;
下发“Agriculture_Control_Motor”命令时,可以看到智慧农业扩展板的电机转动。
最后,让我们宣传一下:
3月27-28日,华为物联网平台在华为开发者大会静候您的光临。
华为开发者大会2020(Cloud)是华为面向ICT(信息与通信)领域全球开发者的年度顶级旗舰活动。大会旨在搭建一个全球性的交流和实践平台,开放华为30年积累的ICT技术和能力,以“鲲鹏+昇腾”硬核双引擎,为开发者提供澎湃动力,改变世界,变不可能为可能。
我们期待与你共创计算新时代
在一起,梦飞扬!
- 点赞
- 收藏
- 关注作者
评论(0)