目录
概述
本文主要基于zephyr架构下实现了Bluetooth Beacon功能,使用nRF52832开发板作为硬件资源,详细介绍了广播模式了各个字段的定义和应用方法。
1 系统环境
1.1 硬件环境
1.1.1 nRF52832芯片介绍
nRF52832是一款通用的多协议SoC。它满足了需要高级低功耗蓝牙®功能、协议并发性和丰富外围设备和功能集的应用挑战。此外,它为闪存和RAM提供了大量内存。
nRF52832采用具有完全协议并发能力的多协议。它支持低功耗蓝牙,包括2 Mbps高传输速度。蓝牙Mesh可以与低功耗蓝牙同时运行,使智能手机能够配网、入网、配置和控制Mesh节点。
还支持NFC、ANT和2.4 GHz专有协议。它基于带有浮点单元的Arm® Cortex™-M4 CPU,主频为64 MHz。内置NFC-A标签用于简化的配对和支付解决方案。它有许多数字外设和接口,如用于数字麦克风和音频的PDM和I2S。通过精密的片上自适应电源管理系统,实现了极低的功耗。
1.1.2 nRF52832开发板(nRF52-DK)
该开发板引出nRF52832的主要特点如下:
1)板载j-link调试接口2)引出所有 IO接口,用户可根据实际应用,外载其他设备
3)支持4个LED
4)支持4路Key接口
5)板载UART调试接口,方便打印调试信息
1.2 软件开发环境
1)编辑软件
使用VS-Code作为集成开发环境,同时使用nRF Connect SDK( V2.9.0)作为sdk 固件库,编译工具使用nRF Connect SDK Toolchain v2.9.1。具体配置信息如下:
2)工具软件
nordic提供了一套集成的软件工具包nRF Connect for Desktop,可通过该软件安装SDK和其他一些工具包,其打开页面如下:
1.3 App 工具( 手机端)
文档地址:
https://nav.nordicsemi.com/search?query=nRF%20Connect
手机端安装完成后,打开UI
2 Bluetooth Beacon
2.1 功能介绍
蓝牙 Beacon 设备会周期性地向外广播无线信号,这些信号承载着特定的信息数据包,按照蓝牙低功耗(BLE)协议规范进行构造和发送。其广播间隔通常是可配置的,一般在几十毫秒到几秒之间,例如常见的设置可能是 100 毫秒、200 毫秒或者 1 秒等,不同的应用场景会根据对实时性、功耗等因素的考量来选择合适的广播间隔。
2.2 核心参数
Bluetooth Beacon广播的信号主要包含以下几类关键信息:
通用唯一识别码(UUID):
这相当于 Beacon 设备的一个 “身份证”,用于区分不同的 Beacon 部署场景或者所属的不同组织、项目等。例如,一个商场内的所有用于营销的 Beacon 设备可能会设置为同一个 UUID,代表它们属于该商场的营销系统,而医院内部部署的用于定位医护人员的 Beacon 设备则会有另一个专属的 UUID,以便接收设备准确识别并区分信息来源。
主值(Major Value)和次值(Minor Value):
Major Value 通常用于对较大范围的区域或者功能进行划分,比如在一个大型商场中,不同楼层的 Beacon 设备可以设置不同的 Major Value 来表示所在楼层;
Minor Value 则更侧重于对更小区域或者具体物品的标识,像是同一楼层不同店铺门口的 Beacon 设备,通过不同的 Minor Value 来区分各个店铺。这两个值可以帮助接收设备更精准地确定其所处的具体位置以及关联的对象。
发射功率(Tx Power):
这是指 Beacon 设备发射信号时的功率大小,它被包含在广播信息中,接收设备可以依据接收到的信号强度以及这个已知的发射功率,通过一定的算法来估算与 Beacon 设备之间的距离,是实现定位功能的一个重要参考数据。
3 zephyr架构下Beacon实现
3.1 主要函数功能
3.3.1 bt_le_adv_start
函数原型如下:
int bt_le_adv_start( const struct bt_le_adv_param *param,
const struct bt_data *ad, size_t ad_len,
const struct bt_data *sd, size_t sd_len)
主要功能:
用于启动BLE设备的广告功能,使设备能够被其他BLE设备发现。这个函数通常属于蓝牙协议栈的API的一部分。
函数参数介绍:
1) bt_le_adv_param 参数
struct bt_le_adv_param {
uint8_t id; // 广播集ID
uint8_t sid; // 广播集标识符
uint8_t type; // 广播类型
uint8_t options; // 广播选项
uint8_t secondary_phy; // 次要广播PHY
uint32_t interval_min; // 最小广播间隔(单位:0.625ms)
uint32_t interval_max; // 最大广播间隔(单位:0.625ms)
const bt_addr_le_t *peer; // 定向广播的目标地址(可选)
};
广播类型
BT_LE_ADV_CONN_DIR: 直连广播模式
BT_LE_ADV_CONN: 连接广播
BT_LE_ADV_CONN_ONE_TIME: 一次广播模式
BT_LE_ADV_CONN_NAME: 使用名称连接广播
BT_LE_ADV_CONN_NAME_AD:
BT_LE_ADV_CONN_DIR_LOW_DUTY:
BT_LE_ADV_NCONN: 非连接广播模式
BT_LE_ADV_NCONN_NAME: 非连接name广播
BT_LE_ADV_NCONN_IDENTITY:非连接识别广播
BT_LE_EXT_ADV_CONN: 连接扩展广播
BT_LE_EXT_ADV_CONN_NAME: 连接扩展name广播
BT_LE_EXT_ADV_SCAN: 连接扩展扫描
BT_LE_EXT_ADV_SCAN_NAME: 连接扩展NAME扫描
BT_LE_EXT_ADV_NCONN:非链接扩展广播
BT_LE_EXT_ADV_NCONN_IDENTITY:
BT_LE_EXT_ADV_CODED_NCONN:
BT_LE_EXT_ADV_CODED_NCONN_NAME:
BT_LE_EXT_ADV_CODED_NCONN_IDENTITY:
常见AD Type:
BT_DATA_FLAGS
- 广播标志
BT_DATA_UUID16_ALL
- 完整16位UUID列表
BT_DATA_NAME_COMPLETE
- 完整设备名
BT_DATA_TX_POWER
- 发射功率级别
3.3.2 bt_le_adv_stop
函数原型:
int bt_le_adv_stop(void);
功能描述
停止广播:终止当前正在进行的BLE广播活动
释放资源:释放与广播相关的系统资源
状态切换:将设备从广播状态切换到空闲状态
返回值
0
- 成功停止广播负值 - 错误码(如
-EAGAIN
表示广播未激活)
典型错误码
错误码 | 描述 |
---|---|
0 | 成功 |
-EAGAIN | 广播未激活 |
-EFAULT | 内部错误 |
3.2 Beacon功能实现
3.2.1 代码介绍
1) .conf文件
使用.conf使能相应的模块,以实现Beacon功能
代码1行: 使能BloothTooth模块
代码2行:使能log功能
代码3行: 定义Device名称
2) CMakeLists.txt文件
代码4行:定义sdk的路径
代码5行: 项目名称
代码7行: 加载源代码文件
3)main.c文件中的功能代码
代码第18行: 蓝牙设备名称
代码第21~33行:定义数据广播信息
代码第36~38行:响应数据信息
代码54行:开始广播,采用非连接识别的方式
代码68~69行:获取蓝牙设备的MAC地址
3.2.2 测试代码
代码第81行: 使能蓝牙设备,开始广播
4 功能验证
4.1 下载和编译
编译代码下载到板卡中,运行代码
烧写成功后,在串口终端可以看见如下log:
4.2 参数说明
手机APP上得到的Beacon信息
和代码发送的广播数据进行对比:
数据解析:
代码第23行:
数据类型 : BT_DATA_FLAGS = 0x01
数据值 : BT_LE_AD_NO_BREDR = 0
参数说明: 表示设备仅支持蓝牙低功耗(BLE)模式,不支持传统蓝牙(BR/EDR)模式。这个标志位在设备广播数据中设置,用于向其他设备表明自己的能力
主要特点
仅BLE模式:设备明确表示不支持传统蓝牙(BR/EDR)功能
广播能力:允许设备被发现和连接
节能设计:由于不支持传统蓝牙,设备可以更专注于低功耗优化
在蓝牙协议栈中,这个标志通常通过设置广告数据(Advertising Data)中的标志位来实现。
代码第23行:
数据类型 : BT_DATA_UUID16_ALL= 0x03
BT_DATA_UUID16_ALL 是蓝牙低功耗(BLE)广播数据中的一种数据类型,用于在设备的广播数据或扫描响应数据(Scan Response Data)中声明该设备支持的所有 16 位 UUID 服务。
功能说明
该数据类型(
AD Type
)的值为 0x03(在蓝牙规范中定义为Complete List of 16-bit Service UUIDs
)。它向扫描设备(如手机、网关等)表明该 BLE 设备支持的所有 16 位标准或自定义 UUID 服务。
扫描设备可以解析这些 UUID,以判断是否与该设备进行连接或交互。
主要特点
广播设备能力:让扫描设备知道该 BLE 设备支持哪些服务(如心率监测、电池服务等)。
快速过滤设备:扫描端(如手机 App)可以根据 UUID 列表快速判断是否要连接该设备。
标准与自定义 UUID:可以包含蓝牙 SIG 定义的标准 UUID(如
0x180D
代表心率服务),也可以是自定义的 16 位 UUID。数据结构示例
在广播数据包中,
BT_DATA_UUID16_ALL
的格式如下:
长度 (Length) AD Type (0x03) UUID 1 (16-bit) UUID 2 (16-bit) ... 1 Byte 1 Byte 2 Bytes 2 Bytes ...
代码第25行
数据类型: BT_DATA_SVC_DATA16 = 0x16
BT_DATA_SVC_DATA16 是蓝牙低功耗(BLE)广播数据中的一种数据类型,用于在广播包或扫描响应包(Scan Response)中携带 16-bit UUID 服务的自定义数据。它允许 BLE 设备在广播时直接嵌入特定服务的额外信息,而不需要先建立连接。
功能说明
AD Type:
0x16
(在蓝牙规范中定义为 Service Data - 16-bit UUID)作用:在广播数据中附带某个 16-bit UUID 服务 的相关数据,使扫描设备(如手机、网关)可以直接读取,无需连接。
典型用途:用于信标(Beacon)、传感器数据广播、设备状态信息等场景。
数据结构与格式
BT_DATA_SVC_DATA16
的广播数据格式如下:
字段 长度 说明 Length 1 Byte 整个数据字段的长度(包括 UUID + 数据) AD Type (0x16) 1 Byte 表示这是 16-bit 服务数据 16-bit UUID 2 Bytes 关联的服务 UUID(如 0x180F 代表电池服务) Service Data N Bytes 该服务相关的自定义数据
代码第23行:
数据类型: BT_DATA_NAME_COMPLETE = 0x09
参数说明:
BT_DATA_NAME_COMPLETE 是蓝牙低功耗(BLE)广播数据中的一种标准数据类型,用于在广播包或扫描响应包中携带设备的完整名称。
基本概念
AD Type:
0x09
(蓝牙规范定义的完整设备名称类型)作用: 向扫描设备提供蓝牙设备的完整名称
最大长度: 31字节(包含AD Type字段后,整个广播数据包不能超过31字节)
数据结构
字段 长度 说明 Length 1字节 名称数据的长度(不包括Length字段本身) AD Type (0x09) 1字节 表示这是完整设备名称 Name Data N字节 设备的完整名称(UTF-8编码)