一、前言
本篇结合代码讲解如何将公共的mac地址变更为可解析的私有地址,如果对公共地址和随机静态地址不了解的可以看下面这篇文章。
这里做下简单的科普,为什么蓝牙中会对mac地址分成这么多种类,又是公共mac地址,又是随机mac地址,然后随机的mac地址又分为静态的随机mac地址,可解析的私有地址和不可解析的私有地址。
除了公共mac地址之外,设计其他随机mac地址的目的都是为了设备防追踪而设计的,至于随机地址里面的这些MAC种类各有各的目的,读者在做项目的时候遇到了可以去详细了解。手把手教你:如何分析BLE的MAC地址
二、阅读说明
1、泰凌微芯片学习者,前期使用过该芯片。
2、能够知道怎么进行创建工程,下载代码。
3、有一块开发板,板上的芯片可以是8251,8253或者8258。
4、需使用蓝牙抓包工具52840 Sniffer和协议分析软件Wireshark
三、正文
1、使用的SDK如何使用TLSR8258芯片进行蓝牙广播使用的SDK为该篇文章描述的
2、使用的demo
使用的demo路径为tc_ble_single_sdkvendorble_feature_testfeature_privacy_slave
3、打开该demo的宏定义
#define FEATURE_TEST_MODE TEST_LL_PRIVACY_SLAVE
如上图所示,将FEATURE_TEST_MODE宏设置为TEST_LL_PRIVACY_SLAVE
4、关闭使用公共地址的条件编译
按照上图所示的步骤进行修改
5、相关函数解释
5.1、本机IRK(身份可解析密钥)和对方的MAC地址
如上图所示,第一个随机数生成的是本地的IRK,第二个随机数生成的是对方设备的随机地址(用于后面的广播),理论上生成可解析的私有地址只需要本地的irk或者对方irk就可以了,因为这里并没有和对方进行配对过,所以对方的irk不知道,只能知道本机的irk,所以这里使用的本机的irk,关于这块的内容可以参考蓝牙协议文件的描述,如下所述:
5.2、加入设备信息到可解析列表
u8 status =blc_ll_addDeviceToResolvingList(tmp_peer_addr_type,tmp_peer_addr,tmp_peer_irk,tmp_local_irk);
该函数将对方的地址类型,mac地址,irk(对方和本机身份可解析密钥)加入相关的列表中,该函数的详细解释如下:
/*** @brief This function is used to add a device to resolving list* attention: maximum device number in White List is 2 by default. Please contact Telink if this number can not meet your requirement.* @param[in] peerIdAddrType - Peer_Identity_Address_Type* @param[in] peerIdAddr - Peer_Identity_Address* @param[in] peer_irk - peer IRK* @param[in] local_irk - local IRK* @return Status - 0x00: command succeeded;Others: command failed, refer to definition of "ble_sts_t" to know the reason*/ble_sts_t blc_ll_addDeviceToResolvingList(ida_type_t peerIdAddrType, u8 *peerIdAddr, u8 *peer_irk, u8 *local_irk);
5.3、打开控制器的可解析功能
status = blc_ll_setAddressResolutionEnable(1);
该函数的详细解释如下:
/*** @brief This function is used to enable resolution of Resolvable Private Addresses in the Controller.* @param[in] resolution_en - Address Resolution Enable/Disable* @return Status - 0x00: command succeeded; 0x01-0xFF: command failed*/ble_sts_t blc_ll_setAddressResolutionEnable (addr_res_en_t resolution_en);
5.4、设置广播参数
status = bls_ll_setAdvParam( MY_ADV_INTERVAL_MIN, MY_ADV_INTERVAL_MAX,ADV_TYPE_CONNECTABLE_UNDIRECTED, OWN_ADDRESS_RESOLVE_PRIVATE_PUBLIC,tmp_peer_addr_type, tmp_peer_addr,MY_APP_ADV_CHANNEL,ADV_FP_NONE);// ADV_FP_NONE ADV_FP_ALLOW_SCAN_ANY_ALLOW_CONN_WL
该函数用来设置广播间隔,广播类型,广播地址的类型,对方的设备的地址类型,对方设备的地址,广播通道,和广播过滤策略。具体参数信息不再赘述,读者自行理解。备注:在该函数中,对方的设备地址这个参数,需要填写为5.1小节中生成的那一个,如果填写为其他值,会出现广播地址不正确的情况。
6、使用nRF Connect进行抓包,查看地址
如上图所示,广播设备地址的最高字节为0x79,最高2bits为01,符合可解析私有广播地址的描述
五、结尾
本篇结合代码讲解了如何将公共的mac地址变更为可解析的私有地址,下一篇将开始讲解关于蓝牙加密方面的文章。
另外我开了一个手写广播设备的合集,该合集的内容为不依赖商业的蓝牙协议栈,里面的内容主要是结合蓝牙协议文件,分析一个完整的广播数据帧结构,然后通过编写底层代码(不依赖泰凌微蓝牙协议栈),来实现自己的广播设备,之后会对代码进行优化,优化后的代码使用起来非常简洁高效和方便,同时也能将之移植到我们平时的项目当中。
176