AC692X通过BLE协议与APP的进行通信,具体实现在文件le_server_module.c 下,调用起来和串口发送接收基本类似,下面先发送接收接口
发送接口
static int app_send_user_data(u16 handle, u8 *data, u16 len)
{
u32 send_len = user_data_cbuf_is_write_able(len);
u32 ret = APP_BLE_NO_ERROR;
if (!con_handle) {
return APP_BLE_OPERATION_ERROR;
}
if (send_len) {
//printf("v_l= %d\n",send_len);
ret = user_data_att_send(handle, data, len, ATT_OP_AUTO_READ_CCC);
} else {
putchar('m');
ret = APP_BLE_BUFF_FULL;
}
return ret;
}
//+++++蓝牙发信息给app handle通道 data数据包指针 len数据包长度
/* 上诉实现是杰里的库,函数被声明成static,不去修改他的库,封装一新的函数出来方便其他地方调用 */
void user_config_app_send_user_data(u16 handle, u8 *data, u16 len)
{
app_send_user_data(handle,data,len);
}
接收接口
//++++++ AAP发送数据给MCU data就是数据包,注意最长只有20byte
static void app_write_revieve_data(u16 handle, u8 *data, u16 len)
{
int i;
log_info("write_hdl %02x -recieve(%d):", handle, len);
printf_buf(data,len);
/* ble有接收到消息则会回调这个函数,从这里可以拿到
这一次app发送过来的数据包 */
// printf("\n");
// for(i=0;i<len;i++){
// printf("data[%d]=%0X",i,data[i]);
// }
// printf("\n");
//+++++++将蓝牙传输过来的数据通过串口传输出去
// for (u8 i = 0; i < len; i++)
// {
// user_uart1_send_byte(data[i]);
// }
/* 省略 */
}
看完接口来分析一下前置条件吧。
发送和接收中都有一个参数 handle,ble协议是通过指定通道经行发送接收的
// 文件le_server_module.h下
/*
//+++++蓝牙通道选择(uuid)
ATT_CHARACTERISTIC_2a00_01_VALUE_HANDLE gap设备名通道,app可以通过这个通道读和写gap名字
ATT_CHARACTERISTIC_ae02_01_CLIENT_CONFIGURATION_HANDLE
ATT_CHARACTERISTIC_ae04_01_CLIENT_CONFIGURATION_HANDLE
ATT_CHARACTERISTIC_ae05_01_CLIENT_CONFIGURATION_HANDLE
为notify句柄,-1则为固件发送句柄
*/
//
#define ATT_CHARACTERISTIC_2a00_01_VALUE_HANDLE 0x0003
#define ATT_CHARACTERISTIC_ae01_01_VALUE_HANDLE 0x0006
#define ATT_CHARACTERISTIC_ae02_01_VALUE_HANDLE 0x0008
#define ATT_CHARACTERISTIC_ae02_01_CLIENT_CONFIGURATION_HANDLE 0x0009
#define ATT_CHARACTERISTIC_ae03_01_VALUE_HANDLE 0x000b
#define ATT_CHARACTERISTIC_ae04_01_VALUE_HANDLE 0x000d
#define ATT_CHARACTERISTIC_ae04_01_CLIENT_CONFIGURATION_HANDLE 0x000e
#define ATT_CHARACTERISTIC_ae05_01_VALUE_HANDLE 0x0010
#define ATT_CHARACTERISTIC_ae05_01_CLIENT_CONFIGURATION_HANDLE 0x0011
#define ATT_CHARACTERISTIC_ae10_01_VALUE_HANDLE 0x0013
常用的就是注释中的几个notify通道,用于建立链接。对应通道号 -1 就是发送接收通道,从注释的字面就可看出其功能。
sdk_cfg.h 打开ble通道
/* BT_BLE_EN 选上 */
#define BLE_BREDR_MODE (BT_BREDR_EN)//资源充足的情况,tws 可以开启ble
#else
#define BLE_BREDR_MODE (BT_BREDR_EN|BT_BLE_EN)//资源问题,开了ble,不能开启一拖二//(BT_BREDR_EN|BT_BLE_EN)//资源问题,开了ble,不能开启一拖二
#endif
ble链接成功和ble断开链接两个消息
//+++++++ ble 连接成功
case HCI_EVENT_LE_META:
switch (hci_event_le_meta_get_subevent_code(packet)) {
case HCI_SUBEVENT_LE_CONNECTION_COMPLETE: {
con_handle = little_endian_read_16(packet, 4);
log_info("HCI_SUBEVENT_LE_CONNECTION_COMPLETE : %0x\n", con_handle);
connection_update_complete_success(packet + 8);
att_send_init(con_handle);
set_ble_work_state(BLE_ST_CONNECT);
test_record_data_cnt = 0;
index_record = 0;
//自己添加的蓝牙连接状态flag
ble_connect_status += data_ble_status_connect;
}
break;
case HCI_SUBEVENT_LE_CONNECTION_UPDATE_COMPLETE:
connection_update_complete_success(packet);
break;
}
break;
//++++ble 断开连接
case HCI_EVENT_DISCONNECTION_COMPLETE:
log_info("---ble disconnect!\n");
ble_test_flag = 0;
con_handle = 0;
att_send_init(con_handle);
set_ble_work_state(BLE_ST_IDLE);
/* gap_advertisements_enable(1); */
printf("HCI_EVENT_DISCONNECTION_COMPLETE : %0x\n", packet[5]);
set_adv_enable(0, 1);
connection_update_cnt = 0;
//自己添加的蓝牙连接状态flag
ble_connect_status -= data_ble_status_connect;
break;