蓝牙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直接连接的时候会提醒绑定。

三、主机使用白名单

①首先将白名单使能,通过宏开启

// 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);    //重新开启扫描
}

 

posted @ 2023-03-13 14:53  SweetTea_lllpc  阅读(1048)  评论(0编辑  收藏  举报