杰理AC692X学习-BLE与APP端发送与接收

本文介绍了杰理AC692X芯片如何通过BLE协议与APP进行通信,重点关注在le_server_module.c文件中的实现。发送和接收操作涉及特定的通道标识(handle),例如用于建立链接的notify通道。发送和接收接口类似串口操作,并且可以在sdk_cfg.h中配置BLE通道。当BLE链接状态发生变化时,如连接成功或断开,会触发相应的消息通知。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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;

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值