【IoT最佳实践】基于小熊派开发板的物联网实战开发(五)-开发数据上报与命令下发功能

举报
我是卤蛋 发表于 2020/03/12 16:02:05 2020/03/12
【摘要】 本实验基于STML431_BearPi裸机工程,开发数据上报和命令下发的功能

上一期:基于小熊派开发板的物联网实战开发(四)-开发智慧农业传感器数据收集功能

请先完成前几期的实验再来操作本期实验。

添加数据上报任务代码

在“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);

    }

}

1583999581656131.png

在“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;


               

}

1583999623279024.png

在“agent_tiny_entry(void)”函数中,添加调用“creat_collection_task”创建上报数据任务的代码;

    uwRet = creat_report_task();

    if(LOS_OK != uwRet)

    {

        return;

    }

1583999670204282.png

点击“保存”,点击“编译”,等待提示“编译成功”;

打开手机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);

        }

    }

1583999782341656.png

在“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));

    }

}

1583999874304878.png

在“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;

}

1583999919270101.png

在“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 ;

    }

1583999992656670.png

点击“保存”,点击“编译”,等待提示“编译成功”;  

打开手机WIFI热点,设置热点名称密码和代码中一致;

点击“烧录”,等待提示“烧录成功”;

打开OceanConnect平台,下发“Agriculture”服务的两个命令“Agriculture_Control_Light”、“Agriculture_Control_Motor”,执行成功。

打开设备的“历史命令”,可以看到命令“执行成功”;

下发“Agriculture_Control_Light”命令时,可以看到智慧农业扩展板的补光灯开关;

下发“Agriculture_Control_Motor”命令时,可以看到智慧农业扩展板的电机转动。

最后,让我们宣传一下:

3月27-28日,华为物联网平台在华为开发者大会静候您的光临。

华为开发者大会2020(Cloud)是华为面向ICT(信息与通信)领域全球开发者的年度顶级旗舰活动。大会旨在搭建一个全球性的交流和实践平台,开放华为30年积累的ICT技术和能力,以“鲲鹏+昇腾”硬核双引擎,为开发者提供澎湃动力,改变世界,变不可能为可能。

我们期待与你共创计算新时代

在一起,梦飞扬!

1583829665894051.jpg

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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