Index
作者:王世豪 | 最后修改:2026-09-23
一、BLE 概述
BLE(Bluetooth Low Energy),也称为 Bluetooth Smart,是蓝牙 4.0 及更高版本引入的低功耗无线通信技术,专为低带宽、间歇性数据传输的物联网(IoT)和穿戴设备设计。
Air6201 支持最新的 BLE 5.4 版本,BLE 5.4 在上一代基础上继续优化了功耗和性能,为用户提供了更高效、更稳定的蓝牙连接体验。具体的 BLE 版本区别若有兴趣请自行上网查询,本处不再赘述。
1.1 BLE 支持的四种模式
Air6201 的 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、 本篇文档示例 "仅限学习用途"。
二、演示功能概述
本示例将演示如何使用 Air6201 在广播者模式下工作。
广播者模式(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 Air6201 核心板
使用 Air6201 核心板,如下图所示:

淘宝购买链接:Air6201 核心板淘宝购买链接 ;
此核心板的详细使用说明参考:硬件手册和证书 中的 Air6201 核心板使用说明。
3.2 PC 电脑
WINDOWS 系统,其他暂无特别要求;
3.3 数据通信线
USB 数据线(其一端为 Type-C 接口,用于连接 Air6201 核心板)。
四、准备软件环境
4.1 软件环境
-
烧录工具:Luatools 下载调试工具
-
内核固件:Air6201 V1006 版本固件
-
脚本文件:https://gitee.com/openLuat/LuatOS/tree/master/module/Air6201/demo/ble/ibeacon
-
LuatOS 运行所需要的 lib 文件:使用 Luatools 烧录时,勾选 添加默认 lib 选项,使用默认 lib 脚本文件。
准备好软件环境之后,接下来查看如何烧录项目文件到 Air6201 核心板中,将本篇文章中演示使用的项目文件烧录到 Air6201 核心板中。
4、蓝牙调试软件:
本示例使用的蓝牙调试软件是 nrf connect(Android 版本),下载下面的压缩包即可;IOS 版请在 APP Store 搜索 nrf connect 下载。
5、LuatOS 运行所需要的 lib 文件:使用 Luatools 烧录时,勾选 添加默认 lib 选项,使用默认 lib 脚本文件。
准备好软件环境之后,接下来查看如何烧录项目文件到 Air6201 核心板中,将本篇文章中演示使用的项目文件烧录到 Air6201 核心板中。
4.2 API 介绍
ble 库:https://docs.openluat.com/osapi/core/ble/
五、程序结构
ble/
├── ibeacon/
│ ├── main.lua
│ ├── ble_ibeacon.lua
│ |── readme.md
5.1 文件说明
-
main.lua:主程序入口文件。 -
ble_ibeacon.lua:iBeacon 功能的具体实现,负责蓝牙初始化、广播配置和异常处理。
六、代码详解
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/Air6201/demo/ble/ibeacon
7.2 结果演示
打开 nrf connect 蓝牙调试软件,找到作为 ibeacon 设备的 Air6201,点击空白处展开,不需要 CONNECT。

展开后可以查看 ibeacon 的各种信息,包含厂商特定数据格式,ibeacon 类型标识符,以及设置的 UUID、Major、Minor 等关键参数。
![]()
八、总结
本篇文章通过 Air6201 核心板演示 ibeacon 功能,使用 Air6201 核心板作为 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(室内环境)
