BLE 设备地址相关简介

1. 蓝牙设备地址的类型

所有蓝牙设备都应具有一个蓝牙设备地址 (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。

在传统蓝牙和 BLE 中,原则上来说,使用 Public 地址需要向 IEEE 申请购买,使用未
授权的 Public 地址如果和已授权的 Public 地址发生地址冲突,可能会面临法律纠纷。使用
Public 地址还需要涉及到地址的管理、购买等流程。本文的后面举例描述了购买 Public 地
址的流程。

1.1. Public Bluetooth Address

在传统蓝牙和 BLE 中,原则上来说,使用 Public 地址需要向 IEEE 申请购买,使用未授权的 Public 地址如果和已授权的 Public 地址发生地址冲突,可能会面临法律纠纷。使用Public 地址还需要涉及到地址的管理、购买等流程。本文的后面举例描述了购买 Public 地址的流程。

1.2. Random Static Device Address

蓝牙更新到了 BLE 版本之后,为了让设备厂商可以节省购买 Public 地址授权的费用,引入了 Random 类型的地址。从前文可知,Random 地址类型又分为静态(Static)类型和隐私(Private)类型。静态类型的地址格式如下:

 - LSB MSB 
 - +------------------------------------+---+---+
 - | Random part of static address | 1 | 1 |
 - +------------------------------------+---+---+
 - static address 
 - <--------------+ (48 bits) +--------------->

静态地址是随机生成的 48 位地址,应满足以下要求 :

  • • 地址的随机部分至少有一位应为 0
  • • 地址的随机部分至少有一位应为 1

设备可以选择在每次电源循环后将其静态地址初始化为新值。 设备在初始化后不得更改其静态地址值,直到设备重新上电。
注意:如果设备的静态地址发生更改,则存储在对端设备中的地址将无效,并且将失去使用旧地址重新连接的能力。

1.3. Random Non-Resolvable Private Address

隐私地址主要是为了解决隐私问题。根据其是否可解析,又分成不可解析地址类型和可解析地址类型,不可解析地址类型的地址格式如下:

 - LSB MSB 
 - +----------------------------------------+---+
 - |Random part of nonresolvable address| 0 | 0 |
 - +----------------------------------------+---+
 - nonresolvable address 
 - <--------------+ (48 bits) +--------------->
  • 地址的随机部分至少有一位应为 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
 - LSB MSB 
 - +--------------------------+----------------------+---+---+
 - | | Random part of prand | 1 | 0 |
 - +--------------------------+----------------------+---+---+
 -  - <--------+ hash +---------> <-----------+ prand +------->
 -         (24 bits)24 bits)

特征如下:
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 中的一种作为其身份地址。

2. MAC 地址相关函数

下面介绍两个比较重要的和 MAC 设置相关的函数。
// 配置 MAC 地址的函数
tBleStatus aci_hal_write_config_data(uint8_t Offset, uint8_t Length, uint8_t Value[]);
其中不同的 offset 设置的数值不一样,和 MAC 地址相关的主要是这两个:

  • • 0x00: CONFIG_DATA_PUBADDR_OFFSET
  • • 0x2E: CONFIG_DATA_STATIC_RANDOM_ADDRESS

//配置使用哪种 MAC 地址的函数:
tBleStatus aci_gap_init(uint8_t Role,
uint8_t Privacy_Type,
uint8_t Device_Name_Char_Len,
uint8_t Identity_Address_Type,
uint16_t *Service_Handle,
uint16_t *Dev_Name_Char_Handle,
uint16_t *Appearance_Char_Handle);
Identity_Address_Type :

  • • 0x00: Public Address
  • • 0x01: Static Random Address

3. 蓝牙 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 <memory.h>” 更改为 “#include <string.h>”
以下部分伪代码适用于 BlueNRG 系列和 STM32WB 系列

// 生成静态 MAC 地址参考函数
void generate_static_mac_addr(uint8_t bdaddr[6])
{
	// get UID
	BYTE text1[8];
	uint32_t word0 = LL_GetUID_Word0();
	uint32_t word1 = LL_GetUID_Word1();
	memcpy(text1,&word0,sizeof(word0));
	memcpy(&text1[4],&word1,sizeof(word1));
	BYTE buf[SHA256_BLOCK_SIZE];
	SHA256_CTX ctx;
	sha256_init(&ctx);
	sha256_update(&ctx, text1, sizeof(text1));
	sha256_final(&ctx, buf);
	buf[5] |= 0xC0;
	memcpy(bdaddr,buf,6);
}
// 在系统初始化时调用生成 MAC 地址函数并设置
generate_static_mac_addr(bdaddr);
/* Configure Public address */
ret = aci_hal_write_config_data(CONFIG_DATA_STATIC_RANDOM_ADDRESS,
CONFIG_DATA_PUBADDR_LEN, bdaddr);
if(ret != BLE_STATUS_SUCCESS){
	printf("Setting BD_ADDR failed: 0x%02x\r\n", ret);
	return ret;
}
// 在 GAP 初始化时选择 STATIC_RANDOM_ADDR
/* GAP Init */
ret = aci_gap_init(role, 0x00, 0x09, STATIC_RANDOM_ADDR, &
service_handle,&dev_name_char_handle, &appearance_char_handle)

4. 蓝牙 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-raweb/pub/view.html#registries

5. 小结

本文介绍了 BLE MAC 地址的类型,基于芯片 ID 生成静态随机 MAC 地址,以及购买Public MAC 地址的流程。


本文档参考ST官方的《【应用笔记】LAT1287+BLE设备地址相关简介》文档。
参考下载地址:https://download.csdn.net/download/u014319604/89006283

  • 13
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Qt是一种跨平台的应用程序开发框架,可以使用C++编程语言进行开发。BLE是低功耗蓝牙技术,用于设备之间的无线通信。在使用Qt进行BLE设备通讯时,可以通过以下步骤进行代码下载和使用: 第一步,确保已下载并安装了Qt开发环境,并且系统已连接到BLE设备。可以使用Qt Creator作为集成开发环境。 第二步,创建一个新的Qt项目。在Qt Creator中选择“新建项目”,选择Qt Quick应用程序或者其他适合的项目类型。填写项目名称和位置,点击“下一步”。 第三步,在项目配置页面中,选择目标平台和构建套件。点击“下一步”,完成项目配置。 第四步,在项目主文件(通常是main.cpp或者main.qml)中,添加BLE设备通讯的代码。根据具体的需求,可以使用Qt提供的BLE库或者其他第三方库进行BLE设备通讯。 第五步,编写BLE设备通讯的相关代码。这些代码包括扫描BLE设备、连接BLE设备、读取和写入BLE设备的特征值等操作。根据具体的需求,可以参考Qt的官方文档或者其他资源进行开发。 第六步,构建和运行项目。在Qt Creator中点击构建按钮,等待编译完成后点击运行按钮。如果一切正常,项目将会运行并与BLE设备进行通讯。 需要注意的是,BLE设备通讯的代码下载和使用会受到设备和操作系统的限制。在编写代码之前,需要了解设备和操作系统的相关要求和限制,并进行相应的适配。 总之,通过Qt开发环境,我们可以方便地进行BLE设备通讯的代码下载和使用。通过逐步完成上述步骤,我们可以在Qt中轻松地实现与BLE设备的通讯。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值