6621P和APP之间最小收发系统示例

yangzh · 520次点击 · 10个月前

我们拿到SDK,很多读者第一件事就是想能和APP之间相互收发数据,这里以simple为例子,介绍如何和APP之间收发数据的方法。

此示例实现从APP发送一包数据,固件回复对应一包数据,做了两组收发数据示例

(1)APP发送

0xaa 0x55 0x00 0x00 0x02 0x02

固件回复

0xaa 0x55 0x00 0x02 0x84 0x00 0x00 0x86


(2)APP发送

0xaa 0x55 0x00 0x00 0x03 0x03

固件回复

0xaa 0x55 0x00 0x10 0x85 0x00 0x00 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x96


1)添加需要用到的函数对应的头文件

#include "app_simple_server.h"       // Application Module Definitions
#include "simple_server_task.h"               // health thermometer functions
#include "prf.h"               // health thermometer functions
#include "ke_event.h"

2)新建发送事件函数

enum evt_user_id    //事件ID
{
evt_send = KE_EVENT_USR_FIRST+2,
};
uint8_t check_sum(uint8_t *cmd,uint8_t len)  //校验和函数
{
	uint8_t i = 0;
	uint8_t sum = 0;
	
	for(i=0; i<len; i++)
	{
		sum += cmd[i];
	}
	return sum&0xff;
}

void evt_send_callback(void)事件回调接口函数
{
uint8_t len;
  log_debug("\r\n evt_test");
  ke_event_clear(evt_send);
if(g_link_flag == 1)
{
if(g_cmd==1)
{
log_debug("\r\n evt_test1");
ntf_data[0] = 0xaa;
ntf_data[1] = 0x55;
ntf_data[2] = 0x00;
ntf_data[3] = 0x02;
ntf_data[4] = 0x84;
ntf_data[5] = 0x00;
ntf_data[6] = 0x00;
ntf_data[7] = check_sum(ntf_data+2,5);
len = 8;
}
else if(g_cmd ==2)
{
log_debug("\r\n evt_test2");
ntf_data[0] = 0xaa;
ntf_data[1] = 0x55;
ntf_data[2] = 0x00;
ntf_data[3] = 0x10;
ntf_data[4] = 0x85;
ntf_data[5] = 0x00;
ntf_data[6] = 0x00;
ntf_data[7] = 0x01;
ntf_data[8] = 0x00;
ntf_data[9] = 0x00;
ntf_data[10] = 0x00;
ntf_data[11] = 0x00;
ntf_data[12] = 0x00;
ntf_data[13] = 0x00;
ntf_data[14] = 0x00;
ntf_data[15] = 0x00;
ntf_data[16] = 0x00;
ntf_data[17] = 0x00;
ntf_data[18] = 0x00;
ntf_data[19] = 0x00;
ntf_data[20] = 0x00;
ntf_data[21] = check_sum(ntf_data+2,19);
len = 22;
}
    // Allocate the message
    struct simple_server_send_ntf_cmd * cmd = KE_MSG_ALLOC_DYN(SIMPLE_SERVER_SEND_NTF_CMD,
                                                prf_get_task_from_id(TASK_ID_SIMPLE_SERVER),
                                                TASK_APP,
                                                simple_server_send_ntf_cmd,
                                                sizeof(ntf_data));
    cmd->conidx = app_simple_server_env.conidx;
    cmd->length = len;//sizeof(ntf_data);
    memcpy(cmd->value, ntf_data, sizeof(ntf_data));
    // Send the message
    ke_msg_send(cmd);
    //return (KE_MSG_CONSUMED);
log_debug_array_ex("ntf_data\n",ntf_data, sizeof(ntf_data));
}
}

3)main函数注册发送事件

dbg_mmi_enable();
ke_event_callback_set(evt_send, evt_send_callback);//注册事件
appm_init();

4)找到对应的app_simple_server.c文件下,屏蔽如下函数内容

static int simple_server_timeout_timer_handler(ke_msg_id_t const msgid,
                                               void const *param,
                                               ke_task_id_t const dest_id,
                                               ke_task_id_t const src_id)
{
//    log_debug("%s@%d\n", __func__, __LINE__);
//    uint8_t ntf_data[] = "SIMPLE_SERVER_SEND_NTF_CMD";
//    ke_timer_set(SIMPLE_SERVER_TIMEOUT_TIMER, TASK_APP, 500);
//    // Allocate the message
//    struct simple_server_send_ntf_cmd * cmd = KE_MSG_ALLOC_DYN(SIMPLE_SERVER_SEND_NTF_CMD,
//                                                prf_get_task_from_id(TASK_ID_SIMPLE_SERVER),
//                                                TASK_APP,
//                                                simple_server_send_ntf_cmd,
//                                                sizeof(ntf_data));
//    cmd->conidx = app_simple_server_env.conidx;
//    cmd->length = sizeof(ntf_data);
//    memcpy(cmd->value, ntf_data, sizeof(ntf_data));
//    // Send the message
//    ke_msg_send(cmd);
//    return (KE_MSG_CONSUMED);
}

5)找到对应的simple_sever_task.c文件下,如下函数增加

__STATIC int gattc_write_req_ind_handler(ke_msg_id_t const msgid, struct gattc_write_req_ind const *param,
                                      ke_task_id_t const dest_id, ke_task_id_t const src_id)
{
……
        else if (att_idx == SIMPLE_SERVER_IDX_DEMO_VAL1 || att_idx == SIMPLE_SERVER_IDX_DEMO_VAL2)
        {
            log_debug("Offset:%2d. ", param->offset);
            log_debug_array_ex("write data", param->value, param->length);//from app
                 extern void PackageProc(unsigned char *data, uint8_t len);
                  PackageProc((void *)(param->value),param->length);  //从APP接收到的数据处理接口
        }
        else
        {
            status = PRF_APP_ERROR;
        }
    }
……
}

6)处理函数接口实现

void PackageProc(unsigned char *data, uint8_t len)
{
if((data[0] == 0xaa)&&(data[1] == 0x55))
{
if(data[4] == 0x02)       //设备工作状态
{
if(data[5] == check_sum(data+2,3)) 
{
g_cmd = 1;
 ke_event_set(evt_send);
}
}
else if(data[4] == 0x03)//获取版本信息
{
if(data[5] == check_sum(data+2,3)) 
{
g_cmd = 2;
ke_event_set(evt_send);
}
}
}
}

7)测试命令1

image.png


8)测试命令2

image.png





被收藏 1  ∙  1 赞  
加入收藏
点赞
7 回复  
善言善语 (您需要 登录 后才能回复 没有账号 ?)

请先登录网站