CH585三模双8K_BLE篇

一、初始接口,三模通用

 

 二、BLE初始化,添加电池服务、HID服务、设置广播包/扫描应答包数据、设置广播间隔、设置蓝牙设备显示图标等

 

三、在BLE初始化结束后,会根据下面HidDev_Register注册的回调进入hidEmuStateCB的case GAPROLE_STARTED:中

 

四、蓝牙通道切换(含有回连操作)及蓝牙配对演示,例程演示最多5个蓝牙通道,各通道相互独立(各自存有绑定信息),可独自连接一台主机,也可全部连接同一台主机

蓝牙通道切换接口:若切换的通道含有绑定信息,则自动发起回连广播

/*********************************************************************
 * @fn      access_ctl_process
 *
 * @brief   access_ctl_process
 *
 * @return  none
 */
void access_ctl_process( uint8_t ctl_type )
{
    switch( ctl_type )
    {
        case CTL_MODE_BLE_1:
        {
            access_state.ble_idx = BLE_INDEX_1;
            access_switch_ble_mode();
            break;
        }
        case CTL_MODE_BLE_2:
        {
            access_state.ble_idx = BLE_INDEX_2;
            access_switch_ble_mode();
            break;
        }
        case CTL_MODE_BLE_3:
        {
            access_state.ble_idx = BLE_INDEX_3;
            access_switch_ble_mode();
            break;
        }
        case CTL_MODE_BLE_4:
        {
            access_state.ble_idx = BLE_INDEX_4;
            access_switch_ble_mode();
            break;
        }
        case CTL_MODE_BLE_5:
        {
            access_state.ble_idx = BLE_INDEX_5;
            access_switch_ble_mode();
            break;
        }
        case CTL_PAIRING:
        {
            access_pairing_mode();
            break;
        }
        case CTL_DELETE_PAIR_INFO:
        {
            PRINT( "CTL_DELETE_PAIR_INFO\n" );
            ble.SNVAddr = BLE_SNV_ADDR;
            GAPBondMgr_SetParameter( GAPBOND_ERASE_ALLBONDS, 0, 0 );
            ble.SNVAddr = BLE_SNV_ADDR + 0x100;
            GAPBondMgr_SetParameter( GAPBOND_ERASE_ALLBONDS, 0, 0 );
            ble.SNVAddr = BLE_SNV_ADDR + 0x200;
            GAPBondMgr_SetParameter( GAPBOND_ERASE_ALLBONDS, 0, 0 );
            ble.SNVAddr = BLE_SNV_ADDR + 0x300;
            GAPBondMgr_SetParameter( GAPBOND_ERASE_ALLBONDS, 0, 0 );
            ble.SNVAddr = BLE_SNV_ADDR + 0x400;
            GAPBondMgr_SetParameter( GAPBOND_ERASE_ALLBONDS, 0, 0 );
            if( (access_state.ble_idx > BLE_INDEX_IDEL) && (access_state.ble_idx < BLE_INDEX_MAX) )
            {
                ble.SNVAddr = (access_state.ble_idx - BLE_INDEX_1) * 0x100 + BLE_SNV_ADDR;
            }
            nvs_flash_info.ble_bond_flag = 0;
            tmos_memset(nvs_flash_info.ble_addr_type, 0, 5);
            nvs_flash_info.ble_irk_flag[0]++;
            nvs_flash_info.ble_irk_flag[1]++;
            nvs_flash_info.ble_irk_flag[2]++;
            nvs_flash_info.ble_irk_flag[3]++;
            nvs_flash_info.ble_irk_flag[4]++;
            nvs_flash_store();
            con_work_mode = BLE_INDEX_IDEL;
            hidEmu_disconnect();
            hidEmu_adv_enable( DISABLE, FALSE );
            break;
        }
    }
}
access_ctl_process

在当前通道开启新一轮的广播:比如在当前通道连接的情况下,想配对新的电脑,即可调用次接口

/*********************************************************************
 * @fn      access_pairing_process
 *
 * @brief   access_pairing_process
 *
 * @return  none
 */
void access_pairing_process( uint8_t ctl_type )
{
    switch( ctl_type )
    {
        case CTL_MODE_BLE_1:
        {
            access_state.ble_idx = BLE_INDEX_1;
            access_pairing_mode();
            break;
        }
        case CTL_MODE_BLE_2:
        {
            access_state.ble_idx = BLE_INDEX_2;
            access_pairing_mode();
            break;
        }
        case CTL_MODE_BLE_3:
        {
            access_state.ble_idx = BLE_INDEX_3;
            access_pairing_mode();
            break;
        }
        case CTL_MODE_BLE_4:
        {
            access_state.ble_idx = BLE_INDEX_4;
            access_pairing_mode();
            break;
        }
        case CTL_MODE_BLE_5:
        {
            access_state.ble_idx = BLE_INDEX_5;
            access_pairing_mode();
            break;
        }

    }
}
access_pairing_process

操作演示:

1、BLE由当前通道切换至通道4,则调用access_ctl_process(CTL_MODE_BLE_4);//切换至蓝牙通道4,若有绑定信息,则发起回连广播,反之则不开启广播;

2、BLE由当前通道切换至通道3, 并发起新的配对广播,则调用access_pairing_process(CTL_MODE_BLE_3);//切换至蓝牙通道3,不管之前是否存有绑定信息,调用之后修改广播地址,准备配对新的主机,如果未配对上掉电,下次上电时依旧可以回连原配对的主机(有配对信息的情况下);

 

五、在第四点调用之后,会经过hidEmu_adv_enable接口,其中包含IRK修改,广播地址配置,蓝牙广播名称修改,定向广播回连及白名单广播回连等

1、void hidEmu_adv_enable(uint8_t enable, uint8_t is_directed)接口中第一个传参为本次调用是否开启广播,第二个传参为本次调用是否开启定向广播

2、IRK生成与配置、广播地址的获取及配置:

注:前期测试时遇到同一个蓝牙通道与同一台主机反复配对时,会被主机拒绝配对的问题,因此每次开启新配对时的IRK修改项旨在解决该问题

 

 3、蓝牙广播名称修改,如果想加入名称数字后缀:通道号,则可以在名称中加$字符,当前例程中,名称长度最多18字节,超过会导致广播失败

 

 4、定向广播/白名单配置

 

 

六、hidEmuStateCB回调中包含所有蓝牙状态机的切换通知,

 

七、在产生GAPROLE_CONNECTED回调后,会再次进入hidDevPairStateCB配对回调,其中:

 

八、数据发送接口,含有最多BLE_SEND_BUF_LEN个缓存队列,本例程为80包(应用层缓存),含重传机制,底层缓存包数量BLE_BUFF_NUM(本例程为20,可配置);

 

posted @ 2025-06-07 10:30  oTvTo  阅读(456)  评论(0)    收藏  举报