Bluetooth Device Address(BD_ADDR) - 1

术语:

Medium access control (MAC) protocol

FHS: Frequency Hop Synchronization

Organizationally Unique Identifier (OUI)

蓝牙MAC地址简介

v5.3蓝牙核心规范中对地址的介绍:Vol 2: BR/EDR Controller -> Part B: Baseband Specification -> 1 General description -> 1.2 BLUETOOTH DEVICE ADDRESSING。

每个蓝牙设备都应分配一个唯一的 48 位蓝牙设备地址 (BD_ADDR),也叫Bluetooth MAC address,用来作为该设备的唯一识别码。该地址应是根据 IEEE 802-2014 标准第 8.2 节("通用地址")创建的 48 位扩展唯一标识符 (EUI-48)。

蓝牙地址通常显示为以十六进制书写的 6 个字节,用冒号分隔(例如 - 00:11:22:33:FF:EE)。它们是基于蓝牙的协议的重要组成部分。

标准地址:

IEEE SA - IEEE 802-2014

IEEE SA - IEEE 802-2014

关于获得MAC地址块的相关信息,和如何使用地址,也可以查看IEEE的指南: 

IEEE SA - Registration Authority

制造商只能使用他们从 IEEE 注册机构购买的注册表段中的值,并应对设备的每个接口(蓝牙、Wifi、以太网......)使用不同的值。认真的制造商会努力遵守,但在生产过程中也会出现错误。

蓝牙、Wifi、以太网这类设备的MAC地址,都由IEEE注册机构分配。

因为蓝牙的物理接口和传输媒介同Wifi/Ethernet是不同的,所以理论上蓝牙的MAC地址与网卡的MAC地址是独立地址空间,不会冲突。只不过像上面提到的,同一台设备上不同接口类型的MAC地址应避免相同,即使本来这个概率也很低。

不过厂商在IEEE注册机构申请或购买的地址段并不按照接口来区分,代表的是某一设备的唯一识别符,你可以用于识别蓝牙设备、网络设备或其他有MAC地址的设备。拥有蓝牙地址的设备也可以拥有自己的以太网 MAC 地址。如果一个厂商既生产蓝牙设备,又生产网卡,那可以把同一个地址分配给一个蓝牙设备和一个网卡。我是这样理解的。

Bluetooth devices are required to have a unique device address, assigned from the same registry as Ethernet and Wifi MAC addresses. Quoting the Bluetooth specification version 5.0 volume 1:

Each Bluetooth device shall be allocated a unique 48-bit Bluetooth device address (BD_ADDR). The address shall be a 48-bit extended unique identifier (EUI-48) created in accordance with section 8.2 ("Universal addresses") of the IEEE 802-2014 standard.

Manufacturers should only use values from a segment of the registry they purchased from the IEEE Registration Authority, and should use a different values for each interface (Bluetooth, Wifi, Ethernet..) a device has. Serious manufacturers attempt to comply, but goofs happen in production.

IEEE 802-2014标准

Universal addresses / 通用地址

- 概念和概述

通用地址的概念是基于一个网络的所有潜在成员都需要有一个唯一的标识符。通用地址的优点是,如果所有的站都遵守规则,并且网络的安全性能够防止MAC地址的恶意欺骗,那么拥有这种MAC地址的站就可以连接到世界上的任何IEEE 802网络,并保证MAC地址是唯一的。

通用地址是一个全球唯一的MAC地址。IEEE注册机构(RA)已经规定了两种不同长度的通用地址:48位扩展唯一标识符(EUI-48)和64位扩展唯一标识符(EUI-64)。

- 通用地址的分配

IEEE RA负责定义和执行通用地址的管理程序。IEEE RA也被ISO/IEC指定为ISO/IEC 8802系列标准的注册机构。定义程序的责任由IEEE注册授权委员会履行,该委员会由IEEE标准协会理事会授权。

IEEE RA通过分配不同长度的标识符,可以创建通用地址,即EUI-48和EUI-64,如下表所示:

IEEE分配的MAC地址块类型分三种:

• MAC Address Block Large (MA-L)

• MAC Address Block Medium (MA-M)

• MAC Address Block Small (MA-S)

以MA-L为例,一个公司分配了一个MA-L的地址,其值是一个24-bit的公司ID,如果是EUI-48的标识符,那留给此公司可用于分配标识符的块大小就是2^24,如果是EUI-64,可分配的块大小就是2^40。

这三种不同的MAC address,就是可分配的标识符多少是不同的,MA-L是最多的。

MA-L的结构,分配了3个字节的公司ID。

MA-L、MA-M和MA-S的第一个字节结构一致,最低位LSB(least significant bit)是individual/group (I/G) 地址位。LSB下一个位表示universal/local (U/L)地址位。

I/G地址位用于识别目标MAC地址是一个单独的MAC地址还是一个组MAC地址。如果I/G地址位为0,它表示MAC地址字段是一个单独的MAC地址。如果该位为1,则MAC地址是一个组MAC地址,它识别为一个或多个(或所有)连接到IEEE 802网络的站。像所有站广播的MAC地址是一个特殊的组MAC地址,全部为1。

U/L位表示MAC地址是由本地还是通用管理员分配的。通用地址的U/L位被设置为0。如果U/L位被设置为1,其余的位(即除了I/G和U/L位以外的所有位)都是本地管理的,不应该期望满足IEEE RA分配值的唯一性要求。

一个通用地址由两部分组成:前导位(24、28或36)由IEEE RA分配,是OUI组织唯一识别码(organizationally unique identifier)信息块,U/L位设为零,其余位由该受让方分配。下图中显示了EUI-48的一个例子。如果所示,MA-M和MA-S分配的地址使用LSB在左侧显示的情况下,看起来是不连续的,要注意。

OUI可用于确定设备的制造商 。OUI 前缀由电气和电子工程师协会(Institute of Electrical and Electronics Engineers  - IEEE)指定,也就是前面说的IEEE注册机构来分配给厂商的MAC地址范围段。

I/G和U/L位信息,占用的是IEEE分配的OUI信息块。

在IEEE 802.3的网络中,每个字节都是LSB的位先传输。

所以上图的写法,反应的是实际传输的顺序,就是Bit-reversed representation表示。但实际数值表示是上面的十六进制表示法,按照本来的LSB/MSB位置表示的值,这个才是我们正常使用的MAC地址表示法。

EUI-64的例子如下图:

- 各组织的分配

IEEE不打算向任何组织分配额外的MA-L、MA-M或MA-S,除非该组织已经用完了已经分配给该组织的地址块。

需要注意的是,从MA-L、MA-M或MA-S创建的通用地址不应该被用于会导致大量跳过的情形(例如,作为产品标识使用在公司库存管理程序)。IEEE要求各组织不要滥用剩余位的分配,从而不必要地耗尽该块。有足够的标识符来满足大多数人的长期需求,甚至在批量生产中;然而,没有一个地址空间是无限的。

一个受让人用来确保其没有两个站携带相同的通用地址的方法,在本标准中没有定义。然而,全世界的网络用户都希望有唯一的地址。因此,确保用户的期望和要求得到满足的最终责任在于提供此类站点的组织。

- 地址分配的唯一性

建议IEEE 802网络的每个不同的连接点都有自己独特的EUI-48或EUI-64。因此,通常情况下,一个IEEE 802网络适配器卡(或者,例如,主板上的同等芯片或芯片组)应该有一个唯一的EUI-48或EUI-64,用于它在特定时间内可以支持的每个IEEE 802网络附件。

注意-虽然一些实施方案使用单一的EUI-48或EUI-64来识别所有系统对IEEE 802网络的连接点,这种方法本身并不符合IEEE 802.1D MAC桥接的要求。

蓝牙MAC地址查询

比如手里有个设备的蓝牙地址是:0C2369CFFB89。

使用网站来查询其组织信息:Find MAC Vendor | MAC Address Lookup

查询信息如下;

可以看到是MAC-L类型,OUI是3个字节的组织码。

顺便查了一下我的无线网卡的地址:

Physical Address:20-79-18-8B-E9-3A

看到这个网卡地址和蓝牙地址都是MA-L类型,前三个字节是组织代码,后三个字节是厂商自己制定的。

OUI是向IEEE申请才能注册,要花钱的。大公司比如苹果产品很多,就会申请很多OUI。

比如根据厂商查询MAC地址分配:

Apple, Inc. | MAC Address Lookup

注意,我们使用的MAC地址,比如蓝牙设备贴的标签上显示的,或者通过命令行查询的网卡地址,是12个16进制数显示的。显示顺寻是从最高有效位字节到最低有效位字节。这也是符合人类基本的阅读习惯的。前面三个字节是OUI信息。

前面IEEE 802-2014标准里,描述的顺序也是从高有效位字节开始,虽然字节标的序号是从0开始。

另外,在蓝牙地址的传输中,和字节内的bit传输顺序一样,很多时候是先传输低有效位的字节,在保存和发送时要注意。

蓝牙核心规范:蓝牙地址格式

下图说明了 LAP、UAP 和 NAP 如何映射到 EUI-48。

下图中的位模式是一个BD_ADDR的例子。

地址:AC: DE: 48: 00: 00: 80

  • UAP - Upper Address Part,8-bit field。

    The UAP value is used for seeding in various Bluetooth specification algorithms.

    UAP 值在各种蓝牙规范算法中用于提供种子。

  • NAP - Non-significant Address Part,16-bit field。

    The NAP value is used in Frequency Hopping Synchronization frames.

    NAP 值用于跳频同步帧。

  • LAP - Lower Address Part,24-bit field。

    The LAP value uniquely identifies a Bluetooth device as part of the Access Code in every transmitted frame.

    LAP 值作为每个传输帧中接入代码的一部分,可唯一标识蓝牙设备。

        

The LAP and the UAP make the significant address part (SAP) of the Bluetooth Address.

LAP 和 UAP 构成蓝牙地址的重要地址部分 (SAP)。

NAP和UAP组成了OUI组织ID。LAP是厂商自己使用,用来分配给每个不同的蓝牙设备作为标识。

蓝牙核心规范:保留地址(Reserved addresses)

为了蓝牙的查询(inquiry)操作,在LAP中保留了一块连续的64 个值;所有设备共有的一个 LAP 用于一般查询,其余 63 个 LAP 用于特定设备类别的专用查询,在Assigned Numbers文档中有定义。无论 UAP 和 NAP 的内容如何,使用的都是同样的LAP 值。因此,这些 LAP 都不能成为用户 BD_ADDR 的一部分。

保留的 LAP 地址为 0x9E8B00 至 0x9E8B3F。一般查询 LAP 地址为 0x9E8B33。所有地址的 LSB 均位于最右侧,十六进制表示。使用保留的 LAP 地址时,default check initialization (DCI) 将用作 UAP。DCI 定义为 0x00(十六进制)。

Assigned Numbers里定义的特殊LAP值,2 Core Specification -> 2.2 Special LAPs。

只有两个:

Limited Inquiry Access Code (LIAC) :  0x9E8B00

General Inquiry Access Code (GIAC):  0x9E8B33

参考:

1,WebPage

What is Bluetooth Address (BD_ADDR) | Bluetooth MAC Address Changer for Windows

2,StackExchange

internet - Do Bluetooth Devices have MAC address with the same specification as the MAC addresses of the Ethernet and Wi-Fi Network cards? - Network Engineering Stack Exchange

以下代码有什么错误static struct bflb_device_s uart0; extern void shell_init_with_task(struct bflb_device_s shell); static int btblecontroller_em_config(void) { extern uint8_t __LD_CONFIG_EM_SEL; volatile uint32_t em_size; em_size = (uint32_t)&__LD_CONFIG_EM_SEL; if (em_size == 0) { GLB_Set_EM_Sel(GLB_WRAM160KB_EM0KB); } else if (em_size == 321024) { GLB_Set_EM_Sel(GLB_WRAM128KB_EM32KB); } else if (em_size == 641024) { GLB_Set_EM_Sel(GLB_WRAM96KB_EM64KB); } else { GLB_Set_EM_Sel(GLB_WRAM96KB_EM64KB); } return 0; } void bt_enable_cb(int err) { if (!err) { bt_addr_le_t bt_addr; bt_get_local_public_address(&bt_addr); printf("BD_ADDR:(MSB)%02x:%02x:%02x:%02x:%02x:%02x(LSB) \n", bt_addr.a.val[5], bt_addr.a.val[4], bt_addr.a.val[3], bt_addr.a.val[2], bt_addr.a.val[1], bt_addr.a.val[0]); ble_cli_register(); } } int main(void) { board_init(); configASSERT((configMAX_PRIORITIES > 4)); uart0 = bflb_device_get_by_name("uart0"); shell_init_with_task(uart0); /* set ble controller EM Size / btblecontroller_em_config(); / Init rf */ if (0 != rfparam_init(0, NULL, 0)) { printf("PHY RF init failed!\r\n"); return 0; } // Initialize BLE controller #if defined(BL702) || defined(BL602) ble_controller_init(configMAX_PRIORITIES - 1); #else btble_controller_init(configMAX_PRIORITIES - 1); #endif // Initialize BLE Host stack hci_driver_init(); bt_enable(bt_enable_cb); vTaskStartScheduler();#define DEVICE_NAME "BL618_GATT" #define PROFILE_NUM 1 #define PROFILE_A_APP_ID 0 static void gap_event_handler(ble_event_t *event); static void gatt_event_handler(ble_event_t *event); int main(void) { bluetooth_init(gap_event_handler, gatt_event_handler); bluetooth_set_device_name(DEVICE_NAME); bluetooth_gatt_create_service(PROFILE_NUM); bluetooth_gatt_add_char(PROFILE_A_APP_ID, "CHAR_A", 0xFF01, 0x20, NULL); bluetooth_start_advertising(); while (1) { bluetooth_wait_for_event(); } return 0; } static void gap_event_handler(ble_event_t *event) { switch (event->type) { case BLE_GAP_EVENT_ADV_IND: { ble_gap_connect(&event->gap_event.adv_ind.address); break; } case BLE_GAP_EVENT_CONNECTED: { // 连接成功,可以开始 GATT 操作 break; } case BLE_GAP_EVENT_DISCONNECTED: { // 断开连接,重新开始广播 bluetooth_start_advertising(); break; } default: break; } } static void gatt_event_handler(ble_event_t *event) { switch (event->type) { case BLE_GATT_EVENT_READ: { // 处理读操作 break; } case BLE_GATT_EVENT_WRITE: { ble_err_t err = ble_gatt_server_send_indication(event->conn_handle, 0x1234, raw_data, sizeof(raw_data)); // 发送通知给主机 if (err != BLE_ERR_NONE) { // 发送失败,需要处理错误 break; } break; } default: break; } }
05-25
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夜流冰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值