• 正文
  • 相关推荐
申请入驻 产业图谱

手把手教你:将广播的公共地址更改为可解析的私有地址

2小时前
176
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

一、前言

本篇结合代码讲解如何将公共的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地址变更为可解析的私有地址,下一篇将开始讲解关于蓝牙加密方面的文章。

另外我开了一个手写广播设备的合集,该合集的内容为不依赖商业的蓝牙协议栈,里面的内容主要是结合蓝牙协议文件,分析一个完整的广播数据帧结构,然后通过编写底层代码(不依赖泰凌微蓝牙协议栈),来实现自己的广播设备,之后会对代码进行优化,优化后的代码使用起来非常简洁高效和方便,同时也能将之移植到我们平时的项目当中。

相关推荐

登录即可解锁
  • 海量技术文章
  • 设计资源下载
  • 产业链客户资源
  • 写文章/发需求
立即登录

专注BLE实战开发,也分享物联网、嵌入式等相关技术

微信公众号