关键词:BLE MAC 地址, public 地址
目录预览
1、蓝牙设备地址的类型
2、MAC 地址相关函数
3、蓝牙 Random 静态设备地址的生成与设置参考方法
4、蓝牙 Public 设备地址的购买流程
5、小结
01
蓝牙设备地址的类型
所有蓝牙设备都应具有一个蓝牙设备地址 (BD_ADDR),该地址(及其地址类型)可以唯一地(一定范围内唯一)标识该设备。使用者如果不了解其概念,看上去可能会有很多疑惑,甚至容易造成侵权问题。
蓝牙的设备地址分为两大类,一类是 Public,一类是 Random 的。其中 Random 类地址里面又分为静态地址和私有地址。私有地址又分为不可解析的私有地址和可以解析的私有地址。这些地址类型列举如下:
• Public Bluetooth address // 1
• Random Bluetooth address
o Static address // 2
o Private address
▪ Non-resolvable private address // 3
▪ Resolvable private address // 4
上述 4 种地址类型都使用 48bit 的地址长度。地址类型不同,48bit 地址的格式也会不同;设备地址类型和设备地址共同用于唯一标识该设备。另外需要注意以下几点:
• Public 或者 Random 地址类型的标识在链路层的广播包 PDU Header 中,不在48bit 地址的内容中。
• Random 类型下的三种地址类型,使用 48bit 地址的高 2bit 进行标识。
• 48bit 地址都相同的两个设备,如果它们分别属于 Public 或者 Random 地址类型,则它们是两个不同身份的蓝牙设备。
设备应至少使用一种类型的设备地址,也可以同时使用两种。该设备可以通过它使用的任何设备地址来寻址。设备的身份地址是它在传输的数据包中使用的 Public 设备地址或Random 静态设备地址。如果一个设备使用可解析的私有地址,它也应该有一个身份地址。每当比较两个设备地址时,比较应包括设备地址类型(即如果两个地址的类型不同,即使两个 48 位地址相同,它们也不同)。
如果公司有购买 Public 地址,则建议用 Public。如果没有购买地址,又没有设备地址隐私需求,则建议使用 Random Static Device Address。
1.1. Public Bluetooth Address
在传统蓝牙和 BLE 中,原则上来说,使用 Public 地址需要向 IEEE 申请购买,使用未授权的 Public 地址如果和已授权的 Public 地址发生地址冲突,可能会面临法律纠纷。使用Public 地址还需要涉及到地址的管理、购买等流程。本文的后面举例描述了购买 Public 地址的流程。
1.2. Random Static Device Address
蓝牙更新到了 BLE 版本之后,为了让设备厂商可以节省购买 Public 地址授权的费用,引入了 Random 类型的地址。从前文可知,Random 地址类型又分为静态(Static)类型和隐私(Private)类型。静态类型的地址格式如下:
静态地址是随机生成的48位地址,应满足以下要求 :
• 地址的随机部分至少有一位应为 0
• 地址的随机部分至少有一位应为 1
设备可以选择在每次电源循环后将其静态地址初始化为新值。设备在初始化后不得更改其静态地址值,直到设备重新上电。
注意:如果设备的静态地址发生更改,则存储在对端设备中的地址将无效,并且将失去使用旧地址重新连接的能力。
1.3. Random Non-Resolvable Private Address
隐私地址主要是为了解决隐私问题。根据其是否可解析,又分成不可解析地址类型和可解析地址类型,不可解析地址类型的地址格式如下:
• 地址的随机部分至少有一位应为 1
• 地址的随机部分至少有一位应为 0
• 地址不得等于 Public 地址
不可解析地址会周期更新(建议值是 15 分钟),这类地址在实际应用中比较少用。
1.4. Random Resolvable Private Address
所谓可解析地址(RPA),是指可以把一个周期变化的地址解析为唯一的身份地址。使用随机可解析地址类型的设备应具备两个地址,一个地址用于标识该设备,称为身份地址(Identity Address),另一个则为随机可解析地址(RPA)。一般情况下,设备会广播RPA,身份地址保存在本地。对端设备可通过解析 PRA 进一步获得其身份地址。
要生成可解析的私有地址,设备必须具有本地身份解析密钥 (IRK) 或对端身份解析密钥 (IRK)。可解析的私有地址应使用 IRK 和随机生成的 24 位数字生成。随机数称为prand,应满足以下要求:
• prand 的随机部分至少有一位为 0
• prand 的随机部分至少有一位为 1
特征如下:
1)由两部分组成:
高位 24bits 是随机数部分,其中最高两个 bit 为“10”,用于标识地址类型;
低位 24bits 是随机数和 IRK 经过 hash 运算得到的 hash 值,运算的公式为 hash = ah(IRK, prand)。
2)当对端 BLE 设备扫描到该类型的蓝牙地址后,会使用保存在本机的 IRK,和该地址中的 prand,进行同样的 hash 运算,并将运算结果和地址中的 hash 字段比较,相同的时候,才进行后续的操作。这个过程称作 resolve(解析),这也是 Non-Resolvable Private Address/Resolvable Private Address 命名的由来。
3)以 T_GAP(private_addr_int)为周期,定时更新。哪怕在广播、扫描、已连接等过程中,也可能改变。
4)Resolvable Private Address 不能单独使用,因此需要使用该类型的地址的话,设备要选择 Public Device Address 或者 Static Device Address 中的一种作为其身份地址。
02
MAC 地址相关函数
下面介绍两个比较重要的和 MAC 设置相关的函数。
// 配置 MAC 地址的函数
其中不同的 offset 设置的数值不一样,和 MAC 地址相关的主要是这两个:
• 0x00: CONFIG_DATA_PUBADDR_OFFSET
• 0x2E: CONFIG_DATA_STATIC_RANDOM_ADDRESS
//配置使用哪种 MAC 地址的函数:
Identity_Address_Type :
• 0x00: Public Address
• 0x01: Static Random Address
03
蓝牙 Random 静态设备地址的生成与设置参考方法
为了方便一些客户生成免费的相对唯一的 MAC 地址,下面列举一个使用芯片出厂唯一的 UID 来生成 MAC 地址的参考方法。基本原理是通过读取芯片的 UID,然后再进行 Hash计算,截取需要的 46bit 作为随机部分的静态地址。理论上这种方法生成的 MAC 地址重复的几率很小,在 2 的 40 多次方分之一的几率重复,因此实际工程应用中可以认为它相对比较唯一。
Hash 计算这部分参考了开源的算法库,链接地址如下:
https://github.com/B-Con/crypto-algorithms/blob/master/sha256.c
sha256.c这个库文件在当前开发平台上需要修改前面一个头文件包含:
将 “#include” 更改为 “#include”
以下部分伪代码适用于 BlueNRG 系列和 STM32WB 系列
// 生成静态 MAC 地址参考函数
04
蓝牙 Public 设备地址的购买流程
全球唯一设备号,标准化组织是 IEEE,以前的网卡 Ma 地址、PC,现在蓝牙设备、BLE 设备若需要认证的,官方的唯一设备标识,即蓝牙地址,也是 Mac 地址,需向 IEEE申请,并登记付费。即可获得授权。
4.1. OUI 介绍
Organizationally Unique Identifier(OUI) 被称作“组织唯一标识符”,在任何一块网卡中烧录的 6 字节 MAC 地址中,前三个字节就体现了 OUI,通常情况下,该标识符是唯一的。因此,OUI 可以用来创建 MAC 地址、蓝牙设备地址或以太网地址。另外,OUI 也可作为一个公司的 SNAP 协议标识符使用。
通常情况下,IEEE 标准协会将前 24 位组织唯一标识符(OUI)分配给生产企业,剩下的 24 位由厂家自行分配代码。
目前,OUI 只能通过 IEEE 标准协会直接购买,其总价格大概在 3500 美元左右。
如果如果没有保密需求,支付$3500 就可获得一个 OUI(可生成 1600 万个地址),即上述所指的 publicly registered MA-L,也就是说此类公司的名称和地址是公开的,公众可以访问
https://regauth.standards.ieee.org/standards-ra-web/pub/view.html#registries
输入公司名称查询该公司拥有的 MA-L,或者输入 MA-L查询公司的名称和地址。
如果生产厂商希望对以上信息保密,可以选择 Privately registered MA-L,价格会贵很多,且每年需要支付保密费用大概几千美元。
4.2. 购买流程
如果需要购买 Public 地址,需要先申请一个 IEEE 账号。登入后点击如下入口开始申请。
图1.申请购买 public 地址入口
图2. 选择购买的 MAC 地址数量和类型
如果申请的类型是 MA-L 大概有 1677 万个地址,MA-M 大概有 100 多万个。
图3.申请过程中的 4 个步骤
主要填写:申请人信息,包括姓名、职位、公司名称、地址及邮箱电话等;
公司信息,如果贵公司为首次申请,initial corporate assignment request 后选择YES,如果不是首次申请 OUI,一定要确保现有的 MAC 地址使用率已达到 95%,否则不予申请,选择 No 之后需要在方框内填写上次申请 OUI 的公司名称并提供再次申请的理由,同时还需提供公司类型,是母公司还是子公司,还是两者皆否
如果公司类型选择了母公司或者是子公司,需要填写至少 3 家联营公司的具体信息,如果公司类型选择了 neither,该部分可不填;为保密信息,如果选择购买的是 publicly registered MA-L,该部分选择 No,反之选择 Yes 并提供理由;目前 IEEE 标准协会接受的付款方式包括邮寄美国银行汇票、美元电汇及信用卡在线支付。如果需要提供形式发票,请选择 please send a proforma invoice 之前的复选框。
完成以上内容后在线提交即可。
4.3. 购买后检查确认
如果需要购买 public 地址,需要先申请一个 IEEE 账号。登入后点击如下入口开始申请。通常 IEEE 收到款后的第二天,即可邮件收到一个 Mac 地址的生成软件,填上日期等信息后,会生成一个 6BYTE(48bits)的地址段,前 3BYTE 数据为公司名,后面 3BYTE是序号。
您可以下载一个更新后的厂商列表:
https://standards-oui.ieee.org/oui/oui.txt
图4.在更新的列表中检查申请的地址
也可以通过链接查询:
https://regauth.standards.ieee.org/standards-ra-web/pub/view.html#registries
05
小结
本文介绍了 BLE MAC 地址的类型,基于芯片 ID 生成静态随机 MAC 地址,以及购买Public MAC 地址的流程。