蓝牙BLE从机Peripheral讲解四(白名单/BLE_WhiteList)
前言:
白名单(white list)是BLE协议中最简单、直白的一种安全机制。
所谓的白名单,就是一组蓝牙地址。通过白名单,可以只允许特定的蓝牙设备(白名单中列出的)扫描(Scan)、连接(connect)。
也可以只扫描、连接特定的蓝牙设备(白名单中列出的)。
一、从机使用白名单连接主机(CH58x)
//**从机设置白名单**
uint8 mac0[6]={0x02, 0x02, 0x03, 0xE4, 0xC2, 0x84}; //指定mac地址
uint8 mac1[6]={0x84, 0xC2, 0xE4, 0x03, 0x02, 0x02}; //指定mac地址
uint8 macType= 0; //指定地址类型
LL_AddWhiteListDevice(macType,mac0); //添加白名单mac
LL_AddWhiteListDevice(macType,mac1); //添加白名单mac
uint8 filter_policy = GAP_FILTER_POLICY_WHITE_CON; //允许任何设备扫描,但只允许白名单中的设备连接。
GAPRole_SetParameter( GAPROLE_ADV_FILTER_POLICY, sizeof( uint8 ), &filter_policy );//设置白名单
二、从机使用白名单连接主机(手机)
手机的蓝牙MAC地址是私有地址,私有地址是指周期性变化的随机地址,比如每隔15分钟变换一次。这意味着,即使发现了一个目前处于广播态的设备,20分钟之后,它可能换了一个完全不一样的地址,届时将难以判断该设备是否还在附近。
要解决该问题,需要执行三个步骤:①在绑定时保存设备的身份解析密钥(IRK);②使用该密钥生成一个可解析的私有地址;③主设备扫描所有的设备,利用其所有的IRK解析每一个地址。只有能够验明身份的地址才能进行连接。
从机在进行白名单连接手机时也需要该操作
uint8 syncWL = TRUE;
// If a bond is created, the HID Device should write the address of the
// HID Host in the HID Device controller's white list and set the HID
// Device controller's advertising filter policy to 'process scan and
// connection requests only from devices in the White List'.
GAPBondMgr_SetParameter( GAPBOND_AUTO_SYNC_RL, sizeof( uint8 ), &syncWL );
uint8 filter_policy = GAP_FILTER_POLICY_WHITE; //只允许白名单设备扫描和连接
uint16_t WLStatus = GAPRole_SetParameter( GAPROLE_ADV_FILTER_POLICY, sizeof( uint8 ), &filter_policy );//设置白名单
PRINT("WLStatus = %d\r\n", WLStatus);
配置绑定后,如果手机APP没有连接蓝牙从机,则需要从机复位重启一下,否则会处于已连接的状态。或者将pairMode配置为GAPBOND_PAIRING_MODE_INITIATE,手机APP直接连接的时候会提醒绑定。
清除白名单操作:
- 蓝牙断开连接;
- 擦除绑定;
- 关闭广播;
- 清除白名单列表
LL_ClearWhiteList
,并修改为通用广播GAP_FILTER_POLICY_ALL
; - 开启广播;
三、主机使用白名单
①首先将白名单使能,通过宏开启
// TRUE to use white list during discovery
#define DEFAULT_DISCOVERY_WHITE_LIST 1//FALSE
// TRUE to use white list when creating link
#define DEFAULT_LINK_WHITE_LIST 1//;FALSE
②如需要添加2个即以上的白名单设备,需要将SNV数量设置为对应的数量。默认只分配了一个可绑定设备名单。
参考链接的第五点:
BLE配对与绑定三 - SweetTea_lllpc - 博客园 (cnblogs.com)
③在初始化的时候添加对应的白名单MAC(注意SNV修改为2)。
uint8 mac0[6] = {0x01, 0x00, 0x00, 0xE4, 0xC2, 0x84};//指定mac地址
uint8 mac1[6] = {0x02, 0x00, 0x00, 0xE4, 0xC2, 0x84};//指定mac地址
uint8 macType = 0; //指定地址类型
uint8 ret = LL_AddWhiteListDevice(macType, mac0); //添加白名单mac,并查看返回值判断是否设置成功(0为成功)
printf("ret0 = %d\n", ret);
ret = LL_AddWhiteListDevice(macType, mac1); //添加白名单mac
printf("ret1 = %d\n", ret);
uint8 filter_policy = GAP_FILTER_POLICY_WHITE_CON;//允许任何设备扫描,但只允许白名单中的设备连接。
GAPRole_SetParameter( GAPROLE_ADV_FILTER_POLICY, sizeof( uint8 ), &filter_policy );//设置白名单
④可以在程序运行过程中进行添加白名单,需要注意主机需要不在扫描的状态。即先关闭主机扫描,设置白名单,重新开启主机扫描。
以Observer观察者为例
{
GAPRole_ObserverCancelDiscovery(); //关闭扫描
uint8 mac0[6] = {0x01, 0x00, 0x00, 0xE4, 0xC2, 0x84};//指定mac地址
uint8 mac1[6] = {0x02, 0x00, 0x00, 0xE4, 0xC2, 0x84};//指定mac地址
uint8 macType = 0; //指定地址类型
uint8 ret = LL_AddWhiteListDevice(macType, mac0); //添加白名单mac
printf("ret0 = %d\n", ret);
ret = LL_AddWhiteListDevice(macType, mac1); //添加白名单mac
printf("ret1 = %d\n", ret);
uint8 filter_policy = GAP_FILTER_POLICY_WHITE_CON;//允许任何设备扫描,但只允许白名单中的设备连接。
GAPRole_SetParameter( GAPROLE_ADV_FILTER_POLICY, sizeof( uint8 ), &filter_policy );//设置白名单
GAPRole_ObserverStartDiscovery(DEVDISC_MODE_GENERAL ,1 , 1); //重新开启扫描
}