3.4.11. APP - BLE Beacon

3.4.11.1. 概述

Note

BLE 信标广播实现,支持 iBeacon 与 Eddystone UID/TLM/URL/EID/ETLM 帧的组包与广播开关。

3.4.11.2. 工程配置

  • app配置,在工程代码中找到对应的文件(apps/demo/transfer/include/app_config.h)进行APP选择,本案例中选择CONFIG_APP_BEACON,其结果如下所示:

//apps example 选择,只能选1个,要配置对应的board_config.h,配置应用切换时对应选择的应用都要置1
#define CONFIG_APP_BEACON                 1 /*!< BLE 信标广播(iBeacon/Eddystone),仅广播不连接 */
  • 板级选择,接着在文件(apps/demo/transfer/board/bd57/board_config.h)下进行对应的板级选择如下:

#define CONFIG_BOARD_AW33N_DEMO
#include "board_aw33n_demo_cfg.h"

3.4.11.3. 主要功能代码说明

  • 该demo是 BLE 信标(Beacon)示例应用:只做无连接广播,不开 GATT、不做配对,把 iBeacon / Eddystone 各帧格式打包成 ≤31 字节的广播包持续发出去。

apps/demo/transfer/examples/ble_beacon/app_beacon.c

  • 应用框架层:注册 application、消息循环、按键/蓝牙/电源事件分发、软关机、低功耗 idle 查询。

apps/demo/transfer/examples/ble_beacon/ble_beacon.c

  • 信标业务实现:各帧的静态模板数据、URL 编码、EID/ETLM 加密、广播参数/数据设置、广播开关、BLE 状态机。

apps/demo/transfer/examples/ble_beacon/ble_beacon.h

  • 定义 iBeacon、Eddystone UID/TLM/URL/EID/ETLM 六种广播帧结构体(#pragma pack(1)),以及组包、EID/ETLM 计算、profile 回调的声明。

3.4.11.4. 运行链路

开机时由 app_main.c:252-254 选中 ACTION_BEACON_MAIN:

beacon_state_machine(APP_STA_START)

→ beacon_app_start() 时钟配置 + 消息循环

→ btstack_ble_start_before_init(&beacon_data_config)

→ btstack_init()

→ BT_STATUS_INIT_OK 事件

→ btstack_ble_start_after_init()

→ beacon_bt_ble_init() 拼广播名(原名 + “(BLE)” 后缀)

→ beacon_ble_module_enable(1)

→ set_adv_enable() → advertisements_setup_init()

  ble_op_set_adv_param() / set adv data / set scan rsp

→ ble_op_adv_enable(1) 开始广播

3.4.11.5. 支持的帧格式

帧类型

结构体

固定长度

内容

iBeacon

ibeacon_para_t

26B

company_id + UUID(16) + major/minor + 1m 校准功率

Eddystone UID

eddystone_uid_t

24B

10B namespace + 6B instance

Eddystone TLM

eddystone_tlm_t

18B

电池电压、温度、广播计数、运行时间

Eddystone URL

eddystone_url_t

动态

前缀/后缀压缩后的 URL

Eddystone EID

eddystone_eid_t

14B

8B 轮换的加密标识符

Eddystone ETLM

eddystone_etlm_t

26B

TLM 的 EAX 加密版本(帧类型同为 0x20,tlm_version=1 区分)

注:配套的算法能力:eddystone_encode_url() 做 URL 前后缀编码;get_eid() 用 AES128 两段式计算 EID;get_etml() 用 AES-EAX 做认证加密,实现在外部 aes_eax.c。

3.4.11.6. 当前默认配置

  • 帧类型:BEACON_ADV_FRAME_TYPE = EDDYSTONE_ETLM_PACKET(ble_beacon.c:66),改成 IBEACON_PACKET / EDDYSTONE_UID_PACKET 等即可切帧。

  • 广播周期:ADV_INTERVAL_MIN = 160*2,单位 0.625ms → 200ms(ble_beacon.c:33)。

  • 广播类型:BEACON_SCAN_RSP_NAME_EN = 1 时用 ADV_SCAN_IND(可扫描不可连接),扫描响应里带设备名;置 0 则用 ADV_NONCONN_IND。

  • 所有帧内容都是 static const 模板:公司 ID 0x004c(Apple)、UUID、major/minor、namespace/instance 等都是示例值,要按产品改。

3.4.11.7. 应用层行为

  • 按键:ADKEY 三击触发 POWER_EVENT_POWER_SOFTOFF(app_beacon.c:168),走软关机前先 btstack_ble_exit(),避免等链路超时。

  • 低功耗:注册了 lp_target,软关机流程中 beacon_is_active=1 阻止进入 sleep。 无 GATT:beacon_ble_profile_init() 是空函数,”profile” 就是广播数据本身。

3.4.11.8. 使用注意

  • ETLM/EID 的加密数据目前没接入广播流程。get_etml()、get_eid() 只是提供好的接口,make_set_adv_data() 直接从静态模板 memcpy,默认广播出去的 ETLM 载荷是占位值(全 0 密文、random=1、check=2)。要发真实加密帧,需要在 make_set_adv_data() 里调用它们并周期性刷新。

  • URL 帧必须配 URL。BEACON_ADV_FRAME_URL 默认是 NULL,切到 EDDYSTONE_URL_PACKET 时若仍为 NULL,编码返回 0、广播数据为空并打印 encode url fail。另外 URL 长度上限 17 字节(编码后 18 字节)。

3.4.11.9. case默认应用资源(默认使用AW33N DEMO开发板)

Note

demo默认占用外设资源如下,具体可以查看 apps/demo/transfer/board/bd57/board_aw33n_demo_cfg.h

I/O口占用情况

PA口 I/O

默认占用情况

PA4

默认打印UART0引脚

PA1

adkey检测引脚

硬件定时器占用情况

定时器

默认占用情况

TIMER0

暂无使用

TIMER1

暂无使用

TIMER2

暂无使用

TIMER3

暂无使用

串口占用情况

串口

默认占用情况

UART0

SDK打印

UART1

暂无使用

UART2

暂无使用