CH571,CH573,CH582,CH592低功耗蓝牙定向广播/白名单广播回连
以CH582的Hid_Keyboard例程为例,
1、CH582首次广播面向对象为所有扫描设备,例程默认就是这种广播方式;
2、我们主机设备与CH582建立配对之后,可以利用hidDevPairStateCB回调添加代码找到我们主机设备的地址信息(remote_addr)以及地址类型(addr_type);
/*这里自定义了一个结构体,以便后面赋值使用*/
typedef struct { bool isbond; uint8_t remote_addr_type; uint8_t remote_addr[6]; }Device_ID_t;
/*该回调函数在hiddev.c文件中*/
static void hidDevPairStateCB(uint16_t connHandle, uint8_t state, uint8_t status)
{
if(state == GAPBOND_PAIRING_STATE_COMPLETE)
{
if(status == SUCCESS)
{
hidDevConnSecure = TRUE;
}
pairingStatus = status;
}
else if(state == GAPBOND_PAIRING_STATE_BONDED)
{
if(status == SUCCESS)
{
hidDevConnSecure = TRUE;
#if DEFAULT_SCAN_PARAM_NOTIFY_TEST == TRUE
ScanParam_RefreshNotify(gapConnHandle);
#endif
}
}
else if(state == GAPBOND_PAIRING_STATE_BOND_SAVED)
{
/******************************添加代码***************************************/
gapBondRec_t bond_info;
uint8_t addr_type;
tmos_snv_read(mainRecordNvID(0), sizeof(gapBondRec_t), &bond_info);
PRINT("identity addr (");
for(int i = 0 ; i < 6; i ++)
{
PRINT("%#x ", bond_info.publicAddr[i]);
}
PRINT(")\n");
tmos_memcpy(mydevinfo.remote_addr,bond_info.publicAddr, 6);//将此次绑定的地址赋值到自己定义的地址数组中去,以便定向广播或者白名单回连使用
//为identity address, 可能为public address,也可能是random static address
if( (bond_info.publicAddr[5] & 0xC0) == 0x80 ) {
addr_type = 0;
} else {
addr_type = 1;
}
extern uint8_t devAddrType;
(devAddrType)?1:(addr_type = 0);
if(devAddrType == 3)
addr_type |= devAddrType<<4;
mydevinfo.remote_addr_type = addr_type;//获取主机的地址类型
mydevinfo.isbond = 1;//此次设备绑定生效
/*****************************END*************************************/
}
}
3、将上次绑定的设备地址(remote_addr)和地址类型(addr_type)传入定向广播的参数中;
static inline void bt_adv_direct(uint8_t addr_type, uint8_t *addr)
{
uint8_t adv_event_type;
adv_event_type = GAP_ADTYPE_ADV_HDC_DIRECT_IND;
uint8_t Adv_Direct_Addr[B_ADDR_LEN];
uint8_t Adv_Direct_Type = addr_type;
tmos_memcpy(Adv_Direct_Addr, addr,sizeof(Adv_Direct_Addr));
PRINT("Adv Direct type %#x (", Adv_Direct_Type);
for (int i = 0; i < 6; i++) {
if(i) PRINT(" ");
PRINT("%#x", Adv_Direct_Addr[i]);
}
PRINT(")\n");
GAPRole_SetParameter( GAPROLE_ADV_DIRECT_ADDR, sizeof(Adv_Direct_Addr),Adv_Direct_Addr);
GAPRole_SetParameter( GAPROLE_ADV_DIRECT_TYPE, sizeof(Adv_Direct_Type),&Adv_Direct_Type);
GAPRole_SetParameter( GAPROLE_ADV_EVENT_TYPE, sizeof(adv_event_type),&adv_event_type);
}
4、利用结构体中的是否绑定参数(mydevinfo.isbond)做判断,每次上电广播时是否进行定向广播;
void adv_init(void)
{
uint8_t initial_advertising_enable = TRUE;if (mydevinfo.isbond) {
PRINT("type = %d\n",mydevinfo.remote_addr_type);
uint8_t enable = ENABLE;
if(mydevinfo.remote_addr_type&0x30){
GAPBondMgr_SetParameter( GAPBOND_AUTO_SYNC_RL, sizeof(uint8), &enable);
}
else{
enable = DISABLE;
GAPBondMgr_SetParameter( GAPBOND_AUTO_SYNC_RL, sizeof(uint8), &enable);
}
bt_adv_direct(mydevinfo.remote_addr_type, mydevinfo.remote_addr);
}
else{
GAPRole_SetParameter( GAPROLE_ADVERT_DATA, sizeof(advertData), advertData);
GAPRole_SetParameter( GAPROLE_SCAN_RSP_DATA, sizeof(scanRspData),
scanRspData);
}
// Set the GAP Role Parameters
GAPRole_SetParameter(GAPROLE_ADVERT_ENABLED, sizeof(uint8_t), &initial_advertising_enable);
}
5、定向广播为1.28s进行一次快速广播,且部分苹果手机和华为手机无法利用该方式回连,可借助下面的白名单回连的方式;
void adv_init(void)
{
uint8_t initial_advertising_enable = TRUE;
uint16 advInt =32; //0.625us * 32 = 20ms,20ms一包广播包
GAP_SetParamValue(TGAP_DISC_ADV_INT_MIN, advInt);
GAP_SetParamValue(TGAP_DISC_ADV_INT_MAX, advInt);
if(mydevinfo.isbond)
{
uint8 syncWL = TRUE;
GAPBondMgr_SetParameter( GAPBOND_AUTO_SYNC_RL, sizeof( uint8 ), &syncWL );
uint8 filter_policy = GAP_FILTER_POLICY_WHITE; //只允许白名单设备扫描和连接
GAPRole_SetParameter( GAPROLE_ADV_FILTER_POLICY, sizeof( uint8 ), &filter_policy );//设置白名单
}else {
uint8_t policy = GAP_FILTER_POLICY_ALL;
GAPRole_SetParameter(GAPROLE_ADV_FILTER_POLICY, sizeof(policy), &policy);
}
}