蓝牙白名单多设备配对

我想通过白名单实现只允许特定手机设备扫描和连接,用的是从机例程,由于手机直接连接的话是3类mac地址,不能直接通过LL_AddWhiteListDevice将手机设备加入白名单,我发现有这么个参数

image.png

按照解释,我的理解是每次有设备绑定后就清空解析名单,将该设备加入解析名单,而解析名单包含在白名单中,当我使能该参数后,当有手机和芯片配对绑定,之后修改广播策略为只允许白名单中的设备扫描和连接,白名单的功能正常。但是默认只允许绑定一个设备,白名单中就只能有一个设备,但我希望白名单设备数量可以大于1,我看了config.h中的说明

image.png

修改了SNVnum和Lib_Write_Flash

image.png

image.png

但是依然不能绑定两个设备,如果绑定了一个设备,第二个设备再绑定时就会失败。

另外我想知道

  1. GAPBOND_AUTO_SYNC_RL和GAPBOND_AUTO_SYNC_WL开启了到底有什么功能,解析名单和白名单是什么关系

  2. 有没有获取白名单设备数量和设备地址的函数,我看那个蓝牙库里面似乎没有

    谢谢

二编:

  1. 前面的问题基本解决了,我现在想实现当绑定设备数量达到最大值后,后续设备的绑定遵循先入先出的规则,但是我看了这个参数

    image.png

    当我开启了,达到最大设备后再有设备配对的话就会把之前的设备都删除,设备数量就变成了1.如果我关闭,则新设备虽然会显示配对绑定成功,但是并不会存到flash中,实际上没有绑定。

  2. 我看了绑定用到的擦写flash的函数,

    image.png


    因为具体的实现都被封装了,但我猜测,每次新设备绑定时,先把原来的绑定信息从flash中读出,再将新设备的信息插到后面,然后再擦写flash。如果想实现先入先出,我的想法是在Lib_Read_Flash中判断如果达到了最大数量,地址就+0x100,这样就会从第二个设备开始读取,但这样也有问题,因为我不知道当我关闭了GAPBOND_ERASE_AUTO,还会不会执行绑定操作,而且其他情况也可能会调用该函数,比如GAPBOND_AUTO_SYNC_RL,这样就会导致遗漏第一个设备。所以如果我想实现先入先出的话能怎么做呢

绑定2个设备将该参数配置为2即可。

image.png

默认给绑定信息分配的地址是512B,可以存放2个绑定(1个绑定占用256B FLASH)。


手机连接从机进行白名单是需要将IRK生成可解析地址,因此需要绑定。

在添加了白名单设备之后,需要添加更多白名单,可以重新广播(通用可连接广播),否则只有特定手机才可以扫描连接。添加完成后再只允许白名单设备扫描和连接。

1.png


参考博客:

蓝牙BLE从机Peripheral讲解四(白名单/BLE_WhiteList) - SweetTea_lllpc - 博客园 (cnblogs.com)

BLE配对与绑定三(杂谈) - SweetTea_lllpc - 博客园 (cnblogs.com)


或者留个邮箱,提供一份参考。


我用的芯片是ch573,config.h不太一样,问题是修改了snvnum后还是没法绑定两个手机,但是可以绑定一个电脑和一个手机,邮箱是个人信息保护,已隐藏


白名单参考代码已发送至邮箱,请查收。解压到BLE文件夹下运行。


后面我又做了一些测试,我发现,当有一个手机设备配对和绑定后,如果开着GAPBOND_AUTO_SYNC_RL,那么第二个设备无法配对绑定,但是关了它就可以配对成功。我修改了snvnum为2,但是BLE_SNV_ADDR默认是0X77E00,而数据FLASH的空间是0X70000-0X7FFFF,而保存一个绑定信息就需要256byte,所以默认地址空间最大只支持2个绑定设备,所以即使我修改snvnum为大于2的数,第三个设备也不能配对和绑定。所以我尝试修改了BLE_SNV_ADDR,比如为0X77000,理论上讲最大可以容纳16个绑定信息,然而实际情况是,第一个设备可以正常配对和绑定,断开连接再连接,查询绑定数量也是1,但是第二个设备配对和绑定时,虽然可以正常通过,在PairStateCB这个回调函数中也有调试信息打印,查到的绑定设备数量也是2,手机也会保存该设备,

image.png

然而断开连接后,查询绑定数量就变成了1,再连接可以连上,手机也不会再次配对,连接用的是3类地址,而如果绑定了,应该是1类地址,所以说修改了BLE_SNV_ADDR后就只能绑定一个设备了,我想知道是不是BLE_SNV_ADDR不能修改,不能修改的话,最大绑定设备数量是不是只支持2个了。


增加配对绑定数量:

image.png


我知道之前修改了绑定数量为什么行了,因为我在绑定状态的回调函数里,当绑定已保存,就开启了GAPBOND_AUTO_SYNC_RL,而实际上这时候绑定数据还并没有存到FLASH中,大概是因为FLASH的擦写比较花时间,而GAPBOND_AUTO_SYNC_RL已开启,这个功能应该是读FLASH,两者冲突导致写FLASH失败,而当绑定数量即snvnum比较小,要擦的flash较小就不会有这样的问题。所以我通过延时或者在连接断开的时候再开GAPBOND_AUTO_SYNC_RL,就可以正常绑定多个设备,白名单也能正常工作了。感谢官方帮忙!



有没有官方大大帮我解答一下我二编中关于先入先出的问题呢


只有登录才能回复,可以选择微信账号登录