目录
蓝牙规范中的广播和扫描响应数据格式是蓝牙通信中的基础组成部分,特别是在蓝牙低功耗(BLE)技术中,它们扮演着至关重要的角色。
一、数据格式概述
广播、周期性广播和扫描响应数据格式在蓝牙通信中扮演着至关重要的角色。这些数据通常由significant(重要部分)和non-significant (非重要)部分组成。
BLUETOOTH CORE SPECIFICATION Version 5.4 | Vol 3, Part C page 1353
1.1. significant部分
- 包含一系列的AD(广播数据)结构,这些结构用于携带设备信息、服务信息和其他关键数据。这些结构是数据的核心内容。
- 每个AD结构都应包含一个长度为1八位字节(octet)的长度字段,该字段包含长度值且不应为零,以及一个长度为长度字段指定值的数据字段。
- 长度字段指示了数据字段的长度(包括AD类型和AD数据),而数据字段的第一个八位字节(octet)是AD类型,用于标识数据的类型,剩下的Length-1 octets是AD数据,具体数据依赖AD类型。
1.2. non-significant部分
- 用于在必要时扩充数据,用于填充固定长度字段。
- 全部由零八位字节(octet)组成,不携带任何有用信息。
- 其存在主要是为了满足数据格式的固定长度要求。
1.3. 数据传输
- 仅发送significant数据:在蓝牙通信中,为了节省能源和带宽,通常只发送数据的significant部分(即包含有用信息的数据)。
- 数据发送方式:数据通过广播事件或周期性广播事件进行发送。
二、广播和扫描响应数据的具体格式
2.1 广播数据格式
2.1.1. 协议数据单元
广播数据是蓝牙设备周期性发送的数据包,用于向周围设备展示自己的存在和提供的服务。这些信息通过特定的协议数据单元(PDU)进行发送,其格式通常包括以下几个部分:
- ADV_IND:通用广播指示,用于发送设备的广播数据,并允许其他设备发起连接请求。
- ADV_NONCONN_IND:非连接广播指示,用于发送设备的广播数据,但不允许其他设备发起连接请求。
- ADV_SCAN_IND:可扫描广播指示,与ADV_IND类似,但具有不同的广播间隔和扫描响应行为。
- AUX_ADV_IND 和 AUX_CHAIN_IND:辅助广播指示和辅助链指示,用于在蓝牙5.1及更高版本中发送更长的广播数据或进行广播数据分段。
在这些PDU中,AdvData字段用于存放广播数据,这些数据可能包括设备的名称、地址、服务UUID等。
此外,在AUX_ADV_IND、AUX_SYNC_IND 和 AUX_SCAN_RSP PDUs中,ACAD字段(辅助控制器广播数据)用于存放额外的控制器广播数据,这些数据可能包括与广播相关的控制信息。
2.1.2. 广播数据内容
- 设备的唯一标识符:如MAC地址(在某些情况下可能使用随机地址以增加隐私保护)。
- 支持的服务和特征:设备提供的服务和特征的列表,其他设备可以通过这些信息了解设备的功能。
- 设备类型:设备的类型或类别,有助于其他设备识别设备并采取相应的操作。
- 其他信息:可能包括设备名称、制造商信息、信号强度等。
2.1.3. 数据编码格式
- 广播数据以一定的格式进行编码,如使用AD结构(长度字段+AD类型字段+AD数据字段)来组织数据。
- AD类型字段用于标识数据的类型,AD数据字段则包含具体的数据内容。
2.2. 周期性广播数据
周期性广播数据是蓝牙设备定期发送的广播数据,用于向周围设备提供持续更新的信息。这些信息通过以下PDU进行发送:
- AUX_SYNC_IND:用于启动周期性广播的同步过程。
- AUX_SYNC_SUBEVENT_IND 和 AUX_SYNC_SUBEVENT_RSP:用于在周期性广播期间发送和响应子事件数据。
- AUX_CHAIN_IND:同样用于在需要时发送周期性广播数据的剩余片段。
在这些PDU中,AdvData字段也用于存放周期性广播数据。
2.3. 扫描响应数据格式
扫描响应数据是设备在接收到扫描请求后发送的响应数据包,其格式通常包括以下几个部分。
2.3.1. 协议数据单元
扫描响应数据通过以下PDU进行发送:
- SCAN_RSP:在经典蓝牙和低功耗蓝牙的早期版本中,扫描响应数据通过SCAN_RSP PDU的ScanRspData字段发送。
- AUX_SCAN_RSP:在蓝牙5.1及更高版本中,扫描响应数据可以通过AUX_SCAN_RSP PDU的AdvData字段发送,以支持更长的响应数据或数据分段。
2.3.2. 扫描响应数据内容
- 设备的额外信息:如设备名称的完整版本、额外的服务和特征、制造商特定信息等。
- 这些信息通常是在广播数据中未完全包含或需要更新的内容。
2.3.3. 数据编码格式
- 扫描响应数据也使用AD结构来组织数据,与广播数据类似。
- AD类型字段和AD数据字段分别用于标识数据的类型和包含具体的数据内容。
2.4. 数据分段
当广播数据或扫描响应数据过长,无法放入单个PDU的AdvData字段中时,可以使用AUX_CHAIN_IND PDU来发送数据的剩余片段。这种机制允许蓝牙设备发送比单个PDU容量更大的数据包。
此外,AD结构分段是指一个AD结构(即广播数据或扫描响应数据中的一个数据项)可能会被分割成两个或多个PDU进行发送。这通常发生在数据项的长度超过单个PDU的AdvData字段容量时。
蓝牙通信中的数据发送机制非常灵活,能够支持不同大小和类型的数据传输。通过了解这些机制和PDU的使用方式,我们可以更好地设计和实现蓝牙通信应用。
广播数据和扫描响应数据在蓝牙通信中起着至关重要的作用,它们为设备之间的发现和连接提供了重要的支持。通过了解这些数据的具体格式,我们可以更好地理解蓝牙通信的工作原理,并可以创建更加智能和互联的BLE应用程序和设备。
三、AD结构的详细说明
AD结构(Advertising Data Structure)是蓝牙广播数据和扫描响应数据的基本组成单元。每个AD结构都包含三个主要字段:长度字段、AD类型字段和AD数据字段。这些字段共同定义了广播或扫描响应中包含的数据项的类型和内容。
3.1. 长度字段
- 位置:每个AD结构的第一个字节。
- 作用:表示后续AD类型和AD数据字段的总长度(包括AD类型字段本身)。
- 长度:通常为1个八位字节(即1个字节)。
3.2. AD类型字段
- 位置:紧跟在长度字段之后。
- 作用:用于标识AD数据的类型,是解析AD结构的关键。不同的AD类型对应不同的数据内容和格式。
- 长度:通常为1个八位字节(即1个字节)。
- 常见AD类型:
- 广播模式(Flags):用于标识设备的广播模式和能力,如是否支持连接等。
- 服务UUID:用于广播设备支持的特定服务。这些服务可以是16位、32位或128位UUID。
- 设备名(Local Name):包含设备的名称,可以是全名或缩写。
- 信号强度(TX Power Level):表示设备发送广播包的信号强度。
- 厂商自定义数据:允许设备制造商添加自定义的数据项,以支持特定的应用或功能。
3.3. AD数据字段
- 位置:紧跟在AD类型字段之后。
- 作用:包含具体的数据内容,其长度和格式取决于AD类型字段的值。
- 长度:可变,由长度字段指定(减去AD类型字段的长度)。
3.4. 注意事项
- AD(广播数据)结构是蓝牙低功耗(BLE)广播中用于携带特定类型信息的基本单元。
- 长度字段指定了AD结构的总长度(包括长度字段本身和AD数据)。
- AD类型字段用于标识AD结构中的数据类型。
- 非重要部分用于填充,以确保数据字段的长度符合PDU的要求。
- AUX_ADV_IND、AUX_SYNC_IND、AUX_SCAN_RSP等PDU是BLE 5.1及更高版本中引入的辅助物理层数据单元,用于支持扩展广播和周期性广播等功能。
- 扫描响应是BLE设备在接收到扫描请求后发送的响应,包含设备的额外信息。
AD结构是蓝牙广播数据和扫描响应数据的基本组成单元,通过长度字段、AD类型字段和AD数据字段共同定义了数据项的类型和内容。了解AD结构的组成和解析方法对于实现蓝牙通信应用至关重要。
四、常见BLE广播数据类型
以下是一些常见的广播数据类型:
1. Flags(类型=0x01):
- 用于标识设备的LE物理连接功能和其他一般信息。
- 数据部分包含0到多个字节的Flag值,每个bit用0或1表示功能是否支持,如LE有限发现模式、LE普通发现模式等。
2. Service UUIDs(类型=0x02, 0x03, 0x04, 0x05, 0x06, 0x07):
- 广播设备支持的GATT服务。
- 类型细分包括非完整和完整的16bit、32bit、128bit UUID列表。
3. Local Name(类型=0x08, 0x09):
- 表示设备的名称。
- 类型0x08表示设备全名,0x09表示设备简称(必须是全名前面的若干字符)。
4. Manufacturer Specific Data(类型=0xFF):
- 厂商自定义数据。
- 数据部分前两个字节表示厂商ID,剩余部分由厂商自定义。
5. Tx Power Level(类型=0x0A):
- 表示设备发送广播包的信号强度。
- 数据部分为一个字节,表示-127到+127dBm的信号强度。
6. Service Data(类型=0x16, 0x20, 0x21等):
- 广播特定服务的数据。
- 类型细分根据UUID的长度(16bit, 32bit, 128bit)和数据类型(完整/非完整)有不同的类型值。
7. Appearance(类型=0x19):
- 表示设备的外观,如键盘、鼠标等。
- 数据部分为2字节,表示设备的外观编码。
8. Slave Connection Interval Range(类型=0x12):
- 定义从设备(Slave)的最大和最小连接间隔。
- 数据为4个字节,前2字节定义最小连接间隔,后2字节定义最大连接间隔。
9. Security Manager Out of Band(类型=0x11):
- 带外安全管理,用于指示是否支持带外数据交换。
- 数据为Flag值,每个bit表示一个功能。
10. URI(类型=0x24):
- 广播统一资源标识符(URI),如网站的URL。
- 数据为URI字符串,允许设备广播其关联的网络资源或应用程序的链接。
11. Mesh-Specific Types(如Service UUIDs类型=0x1F,Service Data类型=0x20, 0x21等,以及Mesh Provisioning PDU类型=0x29等,特定于BLE Mesh网络):
- 用于BLE Mesh网络中的特定广播。
- 数据根据类型不同而有所不同,但通常包括Mesh网络相关的信息,如服务UUID、服务数据、配网消息等。
此外,还有一些非标准的广播数据类型,它们可能因实现而异,但也在某些特定应用中被广泛使用,如:
- Advertising Interval:指示设备广播的间隔时间。数据通常是一个或多个字节,表示设备广播的频率。
- Include/Exclude Names:允许设备在广播中包括或排除其名称。数据通常是一个Flag值,指示设备是否希望在广播中包含其名称。
- Solicited Service Data:响应特定扫描请求的广播数据。数据通常包含与扫描请求中指定的服务UUID相关的数据。
- Immediate Alert(类型=0x1A):用于立即发出警报。数据为1个字节,表示警报的级别或类型。
- Indoor Positioning:提供室内定位信息。数据可能包括位置坐标、楼层信息、区域标识等。
- 3D Information Data:提供三维空间中的信息,如物体的位置、方向等。数据通常包括X、Y、Z坐标以及可能的旋转角度等信息。
- Temperature:提供温度信息。数据通常是一个或多个字节,表示温度值。
- Humidity:提供湿度信息。数据通常是一个或多个字节,表示湿度值。
- Battery Level(类型=0x2A19,但通常作为服务数据广播):提供电池电量信息。数据通常是一个字节,表示电池电量的百分比。
- Glucose Measurement:提供血糖测量结果。数据通常包括血糖值、测量时间、测量单位等信息。
- Heart Rate Measurement(类型=0x2A37,但也可作为服务数据广播):提供心率测量结果。数据通常包括心率值、测量时间、心率单位(如bpm)等信息。
- Device Information:提供设备的基本信息,如硬件版本、软件版本、制造商名称等。这些信息通常作为服务数据或服务UUID的一部分进行广播。
请注意,上述广播数据类型并非BLE规范中强制要求的,而是根据实际应用需求和设备制造商的选择来确定的。因此,在不同的BLE设备和应用程序中,可能会使用不同的广播数据类型和值来传递信息。在实际应用中,需要参考特定的设备或应用程序文档来了解它们使用了哪些广播数据类型和值。
此外,随着BLE技术的不断发展和新规范的推出,可能会出现新的广播数据类型和值。因此,建议定期查阅BLE相关的最新规范和文档,以了解最新的广播数据类型和值。
五、解析AD结构
为了解析AD结构,接收设备需要首先读取长度字段,以确定后续AD类型和AD数据字段的总长度。然后,它可以读取AD类型字段,以确定数据的类型。最后,根据AD类型字段的值,接收设备可以解析AD数据字段中的具体数据内容。
5.1. 示例
假设有一个AD结构,其长度为0x05(即5个字节),AD类型为0x09(即设备名),那么这5个字节的数据可以解析为:
- 长度字段:0x05
- AD类型字段:0x09(设备名)
- AD数据字段:包含设备名的具体字符串(长度为3个字节,因为5 - 1 - 1 = 3,其中第一个1是AD类型字段的长度,第二个1是AD类型字段本身占用的长度)
需要注意的是,AD数据的编码方式(如UTF-8)和具体格式取决于AD类型字段的值和设备的实现。因此,在解析AD数据时,需要参考相应的蓝牙规范或设备文档。
5.2. 代码示例
解析蓝牙广播数据中的AD结构,特别是当涉及到设备名(AD类型0x09)时,我们需要确保正确处理字节序列,并考虑到字符串的终止符(如果适用)。由于蓝牙广播数据通常是以字节流的形式提供的,我们需要确保在解析过程中不会超出数据的边界。
以下是一个简化的C语言代码示例,用于解析包含设备名的AD结构:
#include <stdio.h>
#include <stdint.h>
#include <string.h>
// 假设我们有一个函数从某个地方(比如蓝牙硬件接口)获取了广播数据的字节流
// 这里我们直接定义一个包含示例数据的字节数组来模拟这个过程
uint8_t advertising_data[] = {0x05, 0x09, 'H', 'e', 'l', 'l', 'o'}; // 注意:这里的数据比实际需要的多,用于演示
int main() {
// 指向当前正在处理的AD结构的指针
uint8_t *ptr = advertising_data;
// 解析第一个AD结构
uint8_t length = *ptr++; // 读取长度字段
uint8_t type = *ptr++; // 读取AD类型字段
// 检查AD类型是否为设备名(0x09)
if (type == 0x09) {
// 确保AD数据字段的长度不会超出广播数据的范围
if (length - 2 <= sizeof(advertising_data) - (ptr - advertising_data)) {
// 由于设备名应该是以null终止的字符串,我们需要确保有足够的空间来存储它
// 并且由于我们的数据可能不是以null终止的,我们需要手动添加null终止符
char device_name[length - 1]; // 长度减1是因为我们要存储null终止符
memcpy(device_name, ptr, length - 2); // 复制数据到device_name,不包括长度和类型字段
device_name[length - 2] = '\0'; // 添加null终止符
// 输出设备名
printf("Device Name: %s\n", device_name);
} else {
// 如果数据不完整或超出范围,则打印错误消息
printf("Error: Incomplete or out-of-range AD data for device name.\n");
}
} else {
// 如果AD类型不是设备名,则打印类型信息(这里只是简单演示)
printf("AD Type: 0x%02X (not a device name)\n", type);
}
// 注意:这个示例只解析了第一个AD结构。在实际应用中,广播数据可能包含多个AD结构,
// 需要循环遍历整个字节流,直到没有更多的AD结构为止。
return 0;
}
然而,上面的代码有几个需要注意的地方:
-
数据完整性:在这个示例中,我们假设
advertising_data
数组包含了完整的广播数据,并且至少有一个AD结构。在实际应用中,需要确保从蓝牙接口获取的数据是完整的。 -
边界检查:在解析AD数据时,我们检查了长度字段以确保不会读取超出数据边界的字节。这是非常重要的,因为读取超出边界的数据可能会导致未定义的行为。
-
字符串终止符:由于蓝牙广播数据中的字符串可能不是以null终止的,我们在复制数据到
device_name
数组后手动添加了null终止符。这是为了确保我们可以安全地使用printf
函数来打印字符串。 -
多个AD结构:这个示例只解析了第一个AD结构。在实际应用中,广播数据可能包含多个AD结构,需要循环遍历整个字节流来解析它们。
-
错误处理:这个示例中的错误处理非常简单。在实际应用中,可能需要更复杂的错误处理逻辑来应对各种可能的错误情况。
-
编码:这个示例假设设备名是以ASCII字符编码的。如果设备名使用其他编码(如UTF-8),需要相应地调整解析逻辑。
-
内存管理:在实际应用中,可能需要动态分配内存来存储解析后的数据。在这个示例中,我们使用了固定大小的数组来简化代码。
六、应用场景
蓝牙广播和扫描响应数据在无线通信领域具有广泛的应用场景。
6.1. 设备发现
蓝牙广播数据使其他设备能够发现该设备,并了解其支持的服务和特征。这是蓝牙通信的基础步骤,也是设备间进行后续交互的前提。通过广播数据,设备可以宣告自己的存在,包括设备名称、地址、支持的蓝牙版本、服务UUID等信息。其他设备在接收到这些广播数据后,就能够识别到该设备的存在,并了解其基本信息和提供的服务。例如:
- 智能家居:智能灯泡、智能插座、智能门锁等设备通过蓝牙广播自己的存在,智能手机或中央控制器扫描并发现这些设备,从而实现对智能家居设备的远程控制和自动化管理。
- 可穿戴设备:智能手表、健身追踪器、蓝牙耳机等设备通过蓝牙广播,让用户的智能手机能够发现并与之配对,实现数据同步和远程控制。
- 物联网(IoT):在物联网应用中,各种传感器和执行器通过蓝牙广播自己的存在和状态,以便其他设备或系统能够发现并利用它们。
6.2. 服务查询
扫描响应数据则用于设备之间更详细的信息交换。当某个设备对另一个设备提供的服务感兴趣时,它会发送扫描请求。被请求的设备在接收到扫描请求后,会通过扫描响应数据包返回更详细的信息,包括设备名称、制造商信息、支持的服务列表及其具体特征等。这样,设备之间就能够进行更深入的信息交流,为后续的连接和通信打下基础。例如:
- 设备兼容性检查:在设备配对或连接之前,通过扫描响应数据查询对方的支持服务和特征,以确保两个设备之间的兼容性。
- 服务发现与选择:在智能家居或可穿戴设备中,用户可以通过扫描响应数据了解设备提供的服务列表及其具体特征,从而选择所需的服务进行连接和使用。
- 广告推广:商家可以通过蓝牙广播发送广告信息,用户设备在扫描到这些广播信息后,可以了解商家的产品和服务,并进行相应的互动。
6.3. 设备配置
在建立连接之前,设备之间还需要进行一些配置信息的交换。这些配置信息可能包括连接参数、安全设置等。广播和扫描响应数据也可以用于这些配置信息的交换。例如:
- 连接参数设置:在设备配对或连接之前,通过广播数据包中包含的默认连接参数(如连接间隔、从设备延迟等),其他设备可以快速与之建立连接,无需进行繁琐的手动设置。
- 安全配置:在建立连接之前,设备可以通过广播和扫描响应数据交换安全设置信息,如加密密钥、认证方式等,以确保连接的安全性。
- 设备状态同步:在设备已经建立连接的情况下,仍然可以通过广播和扫描响应数据实时更新设备状态信息(如电量、连接状态等),以便其他设备或系统能够及时了解并作出相应调整。
6.4 其他应用场景
此外,蓝牙广播和扫描响应数据还可以应用于以下场景:
- 室内定位与导航:通过蓝牙信标定期广播位置信息,接收设备根据信号强度估算距离,实现室内精准定位与导航服务。
- 资产追踪与管理:在仓库、医院等场所,通过蓝牙广播和扫描响应数据实现资产的实时追踪与管理,提高资产利用率和管理效率。
- 蓝牙Mesh网络:蓝牙Mesh网络是一种基于蓝牙技术的低功耗、自组织、多跳的无线网络。通过广播和扫描响应数据,设备可以快速发现并建立Mesh网络节点之间的连接,实现设备间的信息共享和协同工作。
蓝牙广播和扫描响应数据在无线通信领域具有广泛的应用场景和重要的价值。它们不仅为设备间的相互发现、服务查询和配置交换提供了有力的支持,还为室内定位、资产追踪、蓝牙Mesh网络等应用场景提供了可能。随着蓝牙技术的不断发展和创新,相信蓝牙广播和扫描响应数据将在更多领域发挥更大的作用。
七、注意事项
7.1. 广播数据的最大长度
- 对于BLE广播包而言,其最大长度通常为31字节。这包括了所有LTV(长度-类型-值)三元组的总和。
- 这意味着在设计广播数据时,需要仔细考虑要包含哪些信息,以及每种信息所需的字节数,以确保总长度不超过31字节。
7.2. 广播数据类型的多样性
- 不同的BLE设备和应用程序可能会使用不同的广播数据类型和值来传递信息。
- 这些数据类型和值在BLE规范中有定义,但某些特定的设备或应用程序可能会使用自定义的数据类型。
- 因此,在实际应用中,需要参考特定的设备或应用程序文档,以了解它们使用了哪些广播数据类型和值。
7.3. 广播数据的解析和处理
- 广播数据的解析和处理通常需要在BLE协议栈或应用程序层面进行。
- BLE协议栈提供了用于接收和处理广播数据的API。这些API允许应用程序订阅特定的广播数据,并在接收到匹配的数据时触发回调。
- 在处理广播数据时,需要确保数据的正确性和安全性。例如,可以验证数据的完整性(例如,使用CRC校验),并检查数据的来源以确保其可信度。
7.4. 安全性和隐私
- 广播数据可能包含敏感信息,如设备名称、位置或制造商信息。
- 因此,在设计和处理广播数据时,需要特别注意安全性和隐私保护。
- 可以使用加密技术来保护广播数据的安全性,并避免在广播中直接包含敏感信息。
7.5. 广播频率和功耗
- 广播频率和功耗是BLE设备设计中的两个重要考虑因素。
- 较高的广播频率可以增加设备的可发现性,但也会增加功耗。
- 因此,需要在满足应用需求的同时,仔细权衡广播频率和功耗之间的关系。
7.6. 兼容性和互操作性
- 不同的BLE设备和应用程序可能具有不同的广播数据格式和处理方式。
- 为了确保兼容性和互操作性,需要遵循BLE规范,并在可能的情况下使用标准化的广播数据类型和值。
7.7. 测试和验证
- 在设计和实现BLE广播数据时,需要进行充分的测试和验证。
- 这包括测试广播数据的正确性、完整性、安全性和功耗等方面。
- 通过测试和验证,可以确保BLE设备在实际应用中能够正常工作,并满足用户需求和标准要求。
处理BLE广播数据需要仔细考虑多个方面,包括数据长度、数据类型、解析和处理方式、安全性和隐私保护、广播频率和功耗、兼容性和互操作性以及测试和验证等。通过遵循这些注意事项,可以确保BLE设备在实际应用中能够正常工作,并为用户提供可靠、安全和高效的通信体验。
蓝牙规范中的广播和扫描响应数据格式是蓝牙通信的基础,它们为设备之间的发现和连接提供了重要的支持。通过对广播和扫描响应数据的深入研究,我们可以更好地理解蓝牙通信的工作原理,并为开发蓝牙应用提供有力的支持。同时,随着蓝牙技术的不断发展,广播和扫描响应数据格式也在不断更新和完善,以适应新的应用场景和需求。