04 BLE 广播者模式(ibeacon)
作者:王世豪 | 最后修改:2026-04-13
一、BLE 概述
BLE(Bluetooth Low Energy),也称为 Bluetooth Smart,是蓝牙 4.0 及更高版本引入的低功耗无线通信技术,专为低带宽、间歇性数据传输的物联网(IoT)和穿戴设备设计。
Air8000 支持最新的 BLE 5.4 版本,BLE 5.4 在上一代基础上继续优化了功耗和性能,为用户提供了更高效、更稳定的蓝牙连接体验。具体的 BLE 版本区别若有兴趣请自行上网查询,本处不再赘述。
Air8000 的蓝牙发射功率为 6dBm,不可调整;最远通讯距离在10米左右。
1.1 BLE 支持的四种模式
Air8000 的 BLE 支持 4 种模式,分别是中心设备模式(central),外围设备模式(peripheral),广播者模式(ibeacon),以及观察者模式(scan)。
1、中心设备模式(central):
中心设备模式是能够搜索别人并主动建立连接的一方,从扫描状态转化而来的。它会定期的扫描周围的广播状态设备发送的广播信息,可以对周围设备进行搜索并选择所需要连接的从设备进行配对连接,建立通信链路成功后,主从双方就可以发送接收数据。
2、外围设备模式(peripheral):
外围设备模式是从广播者模式转化而来的,未被连接的外围设备首先进入广播状态,等待被中心设备搜索,当中心设备扫描到外围设备建立连接后,就可以和中心设备进行数据的收发,其不能主动的建立连接,只能等别人来连接自己。和广播模式有区别的地方在于,外围设备模式的设备是可以被连接的,定期的和中心设备进行连接和数据传输,在数据传输过程中作外围设备。
3、广播者模式(ibeacon)
处于广播模式的设备,会周期性的广播 beacon 信息, 可以被扫描, 但一般不会被连接,典型应用 ibeacon。
4、观察者模式(scan)
观察者模式,该模式下模块为非连接,相对广播者模式的一对多发送广播,观察者可以一对多接收数据。在该模式中,设备可以仅监听和读取空中的广播数据。和中心设备唯一的区别是不能发起连接,只能持续扫描外围设备。
1.2 ibeacon 介绍
1、ibeacon 技术是 Apple 公司在 2013 年 9 月发布的一种基于 BLE 蓝牙的通信协议,主要用于短距离传送少量数据。
它通过周期性广播包含唯一标识符(UUID、Major、Minor)的数据包,使智能设备在接收信号后,结合信号强度(RSSI)估算距离,实现室内定位、场景触发等功能。
2、ibeacon 规定了一个 30 个字节的广播包。其中需要重点解析的是后 21 个字节(即从 UUID 开始),此前字节重在标识是否为 ibeacon 协议。
ibeacon 广播数据包的完整格式如下:
其中标志位,长度,类型我们不需要处理,我们只需要关注以下字段:
厂商标识符(2 字节):是蓝牙技术中用于唯一标识设备制造商或品牌方的 2 字节(16 位)编码,范围是 0x0000 ~ 0xFFFF(即 0~65535),它的核心作用是区分不同厂商的蓝牙设备,确保数据解析和兼容性。
ibeacon 类型标识符(2 字节):固定为 0x02, 表示子类型为 ibeacon。
ibeacon 数据长度(1 字节):固定为 0x15,表示 ibeacon 数据长度 21 字节。
Proximity UUID(16 字节):通用唯一标识符。
这是一个 128 位(16 字节)的唯一标识符,用于区分你所在的 iBeacon 网络。
例如,一个商店的所有 iBeacon 可以使用同一个 UUID,这样你的应用就可以知道用户进入了该商店区域。
通常,一个组织或一个应用使用同一个 UUID,然后通过 Major 和 Minor 来进一步细分区域和设备。
Major(2 字节):主标识,用于区分同一组织(UUID 相同)下的不同区域或组别。
Major 是一个 16 位的无符号整数,用于将一组相关的设备进行分组。
例如,一个连锁商店的每个分店可以使用相同的 Major 值,这样应用就知道用户进入了哪个分店。
Minor(2 字节):次标识,用于在同一个 Major 组内进行更细粒度的区分。
Minor 也是一个 16 位的无符号整数,用于标识特定的 iBeacon。
例如,在一个分店内,每个货架或区域可以有一个唯一的 Minor 值。这样,应用就可以知道用户接近哪个具体的货架。
Signal Power(1 字节):校准信号强度的参考值,单位 dBm。(该位为 8 位有符号数据)
这个字段是 8 位有符号整数,表示在距离 iBeacon 设备 1 米处测量到的信号强度(RSSI)。这个值用于校准,帮助估算与设备之间的实际距离。设备接收到信标的信号强度(RSSI)后,与这个校准值进行比较,通过信号衰减模型来估算距离。
注:
1、如何获取厂商标识符?
(1)向蓝牙技术联盟(SIG)直接申请。
(2)使用已授权厂商的 ID,申请得到其授权。
2、Signal Power 是 8 位有符号整数,例如:0xC0 的二进制表示是 1100 0000,最高位 1 代表负数,对应十进制是-64。
3、厂商标识符是按照小端序存储的,例如:Apple 的公司 ID 是 0x004C(大端序),但在蓝牙数据包中按规范存储为 4C 00(小端序)。
4、本篇文档示例 "仅限学习用途"。
二、演示功能概述
本示例将演示如何使用 Air8000 在广播者模式下工作。
广播者模式(ibeacon)的基本流程(概要描述)
1. 初始化蓝牙底层框架
2. 创建 BLE 对象实例
local ble_device = bluetooth_device:ble(ble_event_cb)
3. 创建广播信息并配置 ibeacon 广播数据包
-
包含厂商特定数据格式,ibeacon 类型标识符
-
设置 UUID、Major、Minor 等关键参数
ble_device:adv_create(adv_data)
4. 启动 BLE 广播功能
ble_device:adv_start()
三、准备硬件环境
3.1 Air8000 核心板
使用 Air8000 核心板,如下图所示:

淘宝购买链接:Air8000 核心板淘宝购买链接 ;
此核心板的详细使用说明参考:硬件手册和证书 - product@air8000 - 合宙模组资料中心中的 Core_Air8000 核心板使用说明.pdf。
3.2 PC 电脑
WINDOWS 系统,其他暂无特别要求;
3.3 数据通信线
USB 数据线(其一端为 Type-C 接口,用于连接 Air8000 核心板)。
四、准备软件环境
4.1 软件环境
1、烧录工具:Luatools 下载调试工具
2、内核固件:本demo开发测试时使用的固件为Air8000 V2018 版本固件,本demo对固件版本没有什么特殊要求,所以你如果要测试本demo时,可以直接使用最新版本的内核固件;如果发现最新版本的内核固件测试有问题,可以使用我们开发本demo时使用的内核固件版本来对比测试;
3、脚本文件:https://gitee.com/openLuat/LuatOS/tree/master/module/Air8000/demo/ble/ibeacon
4、蓝牙调试软件:
本示例使用的蓝牙调试软件是 nrf connect(Android 版本),下载下面的压缩包即可;IOS 版请在 APP Store 搜索 nrf connect 下载。
5、LuatOS 运行所需要的 lib 文件:使用 Luatools 烧录时,勾选 添加默认 lib 选项,使用默认 lib 脚本文件。
准备好软件环境之后,接下来查看如何烧录项目文件到 Air8000 核心板中,将本篇文章中演示使用的项目文件烧录到 Air8000 核心板中。
4.2 API 介绍
ble 库:https://docs.openluat.com/osapi/core/ble/
五、程序结构
ble/
├── ibeacon/
│ ├── main.lua
│ ├── ble_ibeacon.lua
│ |── check_wifi.lua
│ |── readme.md
5.1 文件说明
-
main.lua:主程序入口文件。 -
ble_ibeacon.lua:iBeacon 功能的具体实现,负责蓝牙初始化、广播配置和异常处理。 -
check_wifi.lua:Air8000 的蓝牙功能依赖 WiFi 协处理器,需确保 WiFi 固件为最新版本。本脚本文件检查当前 Air8000 模组的 WiFi 固件是否为最新版本,若不是则自动启动升级(需插入可联网的 SIM 卡)
六、代码详解
6.1 main.lua
主程序文件 main.lua 是整个项目的入口点。它负责初始化系统环境。
6.2 ble_ibeacon.lua
6.2.1 全局变量定义
device_name :广播设备名称,
adv_state :广播状态标志,用于跟踪 iBeacon 广播的开启/关闭状态,
ibeacon_data :iBeacon 广播数据包,包含以下结构:
-
厂商标识符(2 字节):0x004C,本例演示的是 ibeacon,所以采用 Apple 的 ID:0x004C(iBeacon 是 Apple 的专有技术,采用 Apple 的 ID 才能显示成 ibeacon)
-
ibeacon 类型标识符(2 字节):固定为 0x02,0x15, 表示子类型为 ibeacon。
-
Proximity UUID(16 字节):0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10
-
Major(2 字节):0x00,0x01
-
Minor(2 字节):0x00,0x02
-
Signal Power(1 字节):0xC0
-- 广播状态
local adv_state = false
-- 配置ibeacon广播数据包
local ibeacon_data = string.char(0x4C, 0x00, -- Manufacturer ID(2字节)
0x02, -- ibeacon数据类型(1字节)
0x15, -- ibeacon数据长度(1字节)
0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, -- UUID(16字节, 大端序)
0x00, 0x01, -- Major(2字节)
0x00, 0x02, -- Minor(2字节)
0xC0) -- Signal Power(1字节)
6.2.2 事件回调函数 (ble_callback)
处理 BLE 设备的各种事件:
- ble.EVENT_ADV_START :广播成功启动时设置 adv_state 为 true
- ble.EVENT_ADV_STOP :广播停止时设置 adv_state 为 false
-- 事件回调函数
function ble_callback(ble_device, ble_event)
if ble_event == ble.EVENT_ADV_START then
log.info("iBeacon", "广播已成功启动")
adv_state = true
elseif ble_event == ble.EVENT_ADV_STOP then
log.info("iBeacon", "广播已停止,等待重新启动")
adv_state = false
end
end
6.2.3 核心任务函数 (ble_ibeacon_task_func)
这是模块的主要功能实现,采用无限循环结构确保广播稳定运行:
-
初始化蓝牙核心 :创建 bluetooth_device 实例
-
初始化 BLE 功能 :创建 ble_device 实例并注册回调
-
配置广播参数 :通过 adv_create 方法设置:
-
广播地址模式 (ble.PUBLIC)
-
广播通道 (ble.CHNLS_ALL)
-
广播间隔 (intv_min/max = 120)
-
广播数据 (包含标志位、iBeacon 数据和设备名称)
-
广播类型 (ble.ADV_TYPE_EXTENDED - 扩展广播类型)
-
启动广播 :调用 adv_start()方法
-
状态监控 :通过 while adv_state 循环监控广播状态
-
异常处理 :使用 goto EXCEPTION_PROC 标签统一处理各种初始化失败情况
-
资源清理与重试 :在异常情况下停止广播并重新初始化,间隔 5 秒后重试
function ble_ibeacon_task_func()
while true do
-- 初始化蓝牙核心
bluetooth_device = bluetooth_device or bluetooth.init()
if not bluetooth_device then
log.error("BLE", "蓝牙初始化失败")
goto EXCEPTION_PROC
end
-- 初始化BLE功能
ble_device = ble_device or bluetooth_device:ble(ble_callback)
if not ble_device then
log.error("BLE", "当前固件不支持完整的BLE")
goto EXCEPTION_PROC
end
-- 设置广播内容
adv_create = adv_create or ble_device:adv_create({
addr_mode = ble.PUBLIC, -- 广播地址模式, 仅支持: ble.PUBLIC
channel_map = ble.CHNLS_ALL, -- 广播的通道, 可选值: ble.CHNL_37, ble.CHNL_38, ble.CHNL_39, ble.CHNLS_ALL
intv_min = 120, -- 广播间隔最小值, 单位为0.625ms, 最小值为20, 最大值为10240
intv_max = 120, -- 广播间隔最大值, 单位为0.625ms, 最小值为20, 最大值为10240
adv_data = { -- 支持表格形式, 也支持字符串形式(255字节以内)
{ble.FLAGS, string.char(0x06)}, -- 广播标志位
{ble.MANUFACTURER_SPECIFIC_DATA, ibeacon_data}, -- 厂商特定数据, 包含ibeacon数据
}
})
if not adv_create then
log.error("BLE", "BLE创建广播失败")
goto EXCEPTION_PROC
end
log.info("开始广播")
if not ble_device:adv_start() then
log.error("BLE", "BLE广播启动失败")
goto EXCEPTION_PROC
end
adv_state = true
-- 等待直到广播停止
while adv_state do
sys.wait(1000)
end
::EXCEPTION_PROC::
log.info("iBeacon", "检测到广播停止,准备重新初始化")
-- 停止广播
if ble_device then
ble_device:adv_stop()
ble_device = nil
end
-- 5秒后跳转到循环体开始位置,重新广播
sys.wait(5000)
end
end
sys.taskInit(ble_ibeacon_task_func)
七、运行结果展示
7.1 完整代码
完整代码请参考:https://gitee.com/openLuat/LuatOS/blob/master/module/Air8000/demo/ble/ibeacon
7.2 结果演示
打开 nrf connect 蓝牙调试软件,找到作为 ibeacon 设备的 Air8000,点击空白处展开,不需要 CONNECT。

展开后可以查看 ibeacon 的各种信息,包含厂商特定数据格式,ibeacon 类型标识符,以及设置的 UUID、Major、Minor 等关键参数。

八、总结
本篇文章通过 Air8000 核心板演示 ibeacon 功能,使用 Air8000 核心板作为 ibeacon 设备,定期广播 ibeacon 信号,
其他支持 ibeacon 的设备(比如手机)可以接收这些信号并进行相应的处理。
九、常见问题
9.1 ble.FLAGS 说明
在 BLE 中,标志(flags)通常出现在广播数据中,这些标志用于指示设备的能力和可发现性等。
根据蓝牙核心规范(Bluetooth Core Specification),广播数据中的 Flags 字段是一个 8 位的位图(bitmask),每个位代表特定的含义,以下是各个位的定义(从 LSB 到 MSB):
-
Bit 0: LE Limited Discoverable Mode(有限可发现模式)
-
Bit 1: LE General Discoverable Mode(通用可发现模式,设备持续可被发现)
-
Bit 2: BR/EDR Not Supported(不支持经典蓝牙)
-
Bit 3: Simultaneous LE and BR/EDR to Same Device Capable(同一设备同时支持 BLE 和经典蓝牙)
-
Bit 4: Simultaneous LE and BR/EDR to Different Devices Capable(支持同时连接不同设备的 BLE 和经典蓝牙)
-
Bit 5-7: 保留(Reserved)
注意:Bit 0 和 Bit 1 不能同时被设置。如果同时设置,则视为无效。
Bit1 和 Bit2 被设置时,Flags 字段的值为 0x06(二进制 0000 0110),
Bit2 被设置时,Flags 字段的值为 0x04(二进制 0000 0100)。
9.2 ibeacon 如何利用 Signal Power 和 RSSI 进行距离估算?
ibeacon 通过 Signal Power(出厂校准信号强度) 和 RSSI(接收信号强度) 估算设备与 ibeacon 之间的距离,其核心原理基于蓝牙信号衰减模型。简单来讲就是设备出厂前先根据实际情况,测算在 1 米距离时的信号强度是多少,作为基准值,然后基于蓝牙信号衰减模型,根据实际信号值 RSSI 推算出实际距离。以下是具体方法和实现步骤:
注意:不同的蓝牙设备或相同设备不同的工况甚至不同的场地环境,都会影响 Signal Power 值,因此这个值虽然可以测量,但一定程度上是个经验值,很难测准。故 ibeacon 的距离估算功能只是估算大概范围,并不能用于精准定位。
1、关键概念
| 参数 | 说明 |
| Signal Power (Tx Power) | ibeacon 在 1 米距离 时的预期 RSSI 值(出厂校准值) |
| RSSI | 接收设备(如手机)实际测量到的信号强度(动态变化) |
2、距离估算公式
iBeacon 使用 对数路径损耗模型(Log-distance Path Loss Model)计算距离:

-
d:估算距离(米)。
-
n:环境衰减因子(通常 2~4,空旷环境=2,普通室内=2.5-3,复杂环境多障碍物=3.5-4),环境越复杂信号衰减越快。
-
Tx Power:Beacon 的校准信号强度(通过实际环境测量拟合,需预先标定)。
-
RSSI:手机实际测得的信号强度。
3、示例计算
Tx Power = -60 dBm
RSSI = -80 dBm
n = 2.5(室内环境)

9.3 ibeacon 应用,为什么无法显示名称?
答:

一个完整的 BLE 广播数据包最长可以有 37 个字节,其中前 6 个字节固定用于设备 MAC 地址,剩下的 31 个字节才是我们可以自由配置的广播数据区域。这 31 个字节会被划分为若干个广播数据结构体(AD Structure)。
也就是 BLE 广播包 广播数据区域不超过 31 字节,那么 iBeacon 包含的数据和包含 flag 的 AD Structure 已经占了 30 个字节,如果要设置设备命名,会超出 31 字节。
可能有人会问,不是还有 1 个字节的空间吗,设备名称用一个字节不可以吗?
答:
- 名称:
"1"(1 字符)。 - AD Structure 长度:1(数据) + 1(类型) + 1(长度) = 3 字节。
- 总长度:27(iBeacon) + 3(Flags) + 3(名称) = 33 字节 → 仍超出。