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 |
暂无使用 |