跳转至

04 BLE 广播者模式(ibeacon)

一、BLE 概述

BLE(Bluetooth Low Energy),也称为 Bluetooth Smart,是蓝牙 4.0 及更高版本引入的低功耗无线通信技术,专为低带宽、间歇性数据传输的物联网(IoT)和穿戴设备设计。

Air8000 支持最新的 BLE 5.4 版本,BLE 5.4 在上一代基础上继续优化了功耗和性能,为用户提供了更高效、更稳定的蓝牙连接体验。具体的 BLE 版本区别若有兴趣请自行上网查询,本处不再赘述。

Air8000 的 BLE 支持 4 种模式,分别是中心设备模式(central),外围设备模式(peripheral),广播者模式(ibeacon),以及观察者模式(scan)。

1.中心设备模式(central):

中心设备模式是能够搜索别人并主动建立连接的一方,从扫描状态转化而来的。其可以和一个或多个从设备进行连接通信,它会定期的扫描周围的广播状态设备发送的广播信息,可以对周围设备进行搜索并选择所需要连接的从设备进行配对连接,建立通信链路成功后,主从双方就可以发送接收数据。

2.外围设备模式(peripheral):

外围设备模式是从广播者模式转化而来的,未被连接的外围设备首先进入广播状态,等待被中心设备搜索,当中心设备扫描到从设备建立连接后,就可以和中心设备进行数据的收发,其不能主动的建立连接,只能等别人来连接自己。和广播模式有区别的地方在于,外围设备模式的设备是可以被连接的,定期的和中心设备进行连接和数据传输,在数据传输过程中作外围设备。

3.广播者模式(ibeacon)

处于广播模式的设备,会周期性的广播 beacon 信息, 可以被扫描到, 但一般不会被连接。

4.观察者模式(scan)

观察者模式,该模式下模块为非连接,相对广播者模式的一对多发送广播,观察者可以一对多接收数据。在该模式中,设备可以仅监听和读取空中的广播数据。和中心设备唯一的区别是不能发起连接,只能持续扫描外围设备。

二、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,0x15, 表示子类型为 ibeacon。

Proximity UUID(16 字节):通用唯一标识符。

Major(2 字节):主标识,用于区分同一组织(UUID 相同)下的不同区域或组别。

Minor(2 字节):次标识,用于在同一个 Major 组内进行更细粒度的区分。

Signal Power(1 字节):校准信号强度的参考值,单位 dBm。(该位为 8 位有符号数据

注:如何获取厂商标识符?

(1)向蓝牙技术联盟(SIG)直接申请。

(2)使用已授权厂商的 ID,申请得到其授权。

三、演示功能概述

本示例将演示如何使用 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()

四、准备硬件环境

4.1 Air8000 核心板

使用 Air8000 开发套件,如下图所示:

淘宝购买链接:Air8000 开发套件淘宝购买链接

此开发套件的详细使用说明参考:硬件手册和证书 - product@air8000 - 合宙模组资料中心中的 Core_Air8000 核心板使用说明 V1.3.pdf

4.2 PC 电脑

WIN10 以及以上版本的 WINDOWS 系统;

4.3 数据通信线

USB 数据线(其一端为 Type-C 接口,用于连接 Air8000 开发板)。

五、准备软件环境

5.1 下载调试工具

使用说明参考:如何使用 LuaTools 烧录软件 - luatos@air8000 - 合宙模组资料中心

5.2 蓝牙调试工具

本示例使用的蓝牙调试软件是 nrf connect ,Android 版,下载下面的压缩包;IOS 版请在 APP Store 搜索 nrf connect 下载。

点我,下载ANDROID版 nrf connect APP

六、软硬件资料

6.1 源码及固件

1、Air8000 固件:https://docs.openluat.com/air8000/luatos/firmware/

2、源码链接:https://gitee.com/openLuat/LuatOS/blob/master/module/Air8000/demo/ble/ibeacon

6.2 demo 使用 api 介绍

本教程使用 api 接口为:

https://docs.openluat.com/osapi/core/ble/

七、代码解析

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()

7.1 初始化蓝牙框架

-- 初始化蓝牙框架, 仅需要调用一次
-- 若创建失败, 会返回nil, 请检查内存是否足够
bluetooth_device = bluetooth.init()

7.2 创建 BLE 对象

ble_callback 是自定义函数,用于处理 BLE 事件,本示例演示的是 ibeacon,回调函数 ble_callback 不需要操作。

-- 创建BLE对象, 需要先调用bluetooth.init()
ble_device = bluetooth_device:ble(ble_callback)

7.3 创建广播信息

ble_device:adv_create,创建一个广播。

ble_device:adv_create({
    addr_mode = ble.PUBLIC, -- 广播地址模式, 可选值: ble.PUBLIC, ble.RANDOM, ble.RPA, ble.NRPA
    channel_map = ble.CHNLS_ALL, -- 广播的通道, 可选值: ble.CHNLS_37, ble.CHNLS_38, ble.CHNLS_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)},  --  0x06表示设备持续可被发现,同时设备不兼容经典蓝牙
        {ble.MANUFACTURER_SPECIFIC_DATA, adv_data} 
    }
})

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)。

配置 ibeacon 广播数据包。

厂商标识符(2 字节):0x004C,本例演示的是 ibeacon,所以采用 Apple 的 ID(iBeacon 是 Apple 的专有技术,采用 Apple 的 ID 才能显示成 ibeacon)

ibeacon 类型标识符(2 字节):固定为 0x02,0x15, 表示子类型为 ibeacon。(ibeacon 的固定标识)

Proximity UUID(16 字节):01020304-0506-0708-090a-0b0c0d0e0f10 (自定义)

Major(2 字节):0x00,0x01 (自定义)

Minor(2 字节):0x00,0x02 (自定义)

Signal Power(1 字节):0xC0,代表 RSSI at 1m: -64 dBm (该位为 8 位有符号数据

注意: 1、0xC0 的二进制表示是 1100 0000,最高位 1 代表负数,对应十进制是-64。

2、本示例使用的厂商标识符 0x004C,代码中需要写成 0x4C,0x00

Apple 的公司 ID 是 0x004C(大端序),但在蓝牙数据包中按规范存储为 4C 00(小端序)。

3、本篇文档示例 "仅限学习用途"

local adv_data = string.char(0x4C, 0x00, -- Manufacturer ID(2字节)
                            0x02, 0x15, -- ibeacon数据类型(2字节)
                            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字节)

7.4 启动 BLE 广播功能

ble_device:adv_start()

八、运行结果展示

8.1 完整代码

完整代码请参考:https://gitee.com/openLuat/LuatOS/blob/master/module/Air8000/demo/ble/ibeacon

8.2 结果演示

打开 nrf connect 蓝牙调试软件,找到作为 ibeacon 设备的 Air8000,点击空白处展开,不需要 CONNECT。

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

九、总结

本篇文章通过 Air8000 核心板演示 ibeacon 功能,使用 Air8000 核心板作为 ibeacon 设备,定期广播 ibeacon 信号,

其他支持 ibeacon 的设备(比如手机)可以接收这些信号并进行相应的处理。

十、常见问题

10.1 ibeacon 如何利用 Signal Power 和 RSSI 进行距离估算?

ibeacon 通过 Signal Power(出厂校准信号强度) 和 RSSI(接收信号强度) 估算设备与 Beacon 之间的距离,其核心原理基于蓝牙信号衰减模型。简单来讲就是设备出厂前先根据实际情况,测算在 1 米距离时的信号强度是多少,作为基准值,然后基于蓝牙信号衰减模型,根据实际信号值 RSSI 推算出实际距离。以下是具体方法和实现步骤:

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(室内环境)