【WCH蓝牙系列芯片】-基于CH592开发板—蓝牙 iBeacon 应用

------------------------------------------------------------------------------------------------------------------------------------

  iBeacon 是基于蓝牙低功耗蓝牙传输技术一种应用。iBeacon 基站不断向四周发送蓝牙信号,当设备进入设定区域时,就能够收到信号。

  iBecaon是苹果基于BLE广播的一个技术规范,由于 iBeacon 只广播、不连接,且功耗极低,有很多应用。比如:

  1. 室内定位与导航: 在商场、机场或地下车库部署多个 iBeacon 节点,手机接收到不同信标的信号强度(RSSI),就可以通过三角定位算法计算出你的精确位置。

  2. 消息推送应用: 实体店可以在特定商品货架旁放置 iBeacon。当顾客拿着手机靠近时,商家的 APP 会被唤醒并推送该商品的优惠券或介绍信息,也就是说要实现动态的信息推送。

  3. 资产追踪与考勤打卡: 将 iBeacon 贴在重要资产上,通过网关持续监听其位置;或者作为固定的打卡点,员工手机靠近即可自动完成考勤。

  4. 智能家居无感触发: 当你走到家门口,手机检测到门口的 iBeacon,智能家居系统自动为你开门、亮灯。

一、 iBeacon 广播的原理

  蓝牙广播数据包的最大长度是 31 字节。苹果公司利用了蓝牙协议中的厂商自定义数据类型(类型码 0xFF),在这 31 个字节中定义了一套自己的标准,从而实现iBeacon 广播。

一个标准的 iBeacon 广播包核心包含以下几个部分:

  • UUID(16字节):临近通用唯一识别码,区分不同企业或大类业务的唯一标识。

  • Major(2字节): 主设备号,通常用来标识特定的片区。

  • Minor(2字节): 次设备号,用来标识具体的单个节点。

  • TX Power(1字节): 发射功率参考值,距离设备 1 米处的参考信号强度,用于手机端校准距离,计算 RSSI。

image

image

  AD Field Length 表示有用的广播信息长度。 Type 广播类型 Company ID 数据字段以两字节的公司 ID 码开始。SIG 将这些 ID 码发放给公司,并且能知道应用程序如何解析这些字段。如0x004C 就是 apple 公司的 ID。0x0059 是 Nordic Semiconductor 公司的 ID。

  IBeacon type 指明了其类型是“proximity beacon”,就是 0x02。

  IBeacon Length 长度字段描述了剩下的字段的长度。

  IBeacon UUID 表示该设备服务分配的私有任务的 128bit 的基础 UUID。

  Major 和 Minor 字段包含了位置信息,

  Major 字段表示分组号,指示了建筑物。

  Minor 指示的是该分组内的单元编号,指示建筑物里的位置信息。两个参数可以表示哪个分组里的哪个ibeacon。

  Tx Power 字段表示 app 通过 ibeacon 发送信号强度估算出的在 1m 的时候的 RSSI 强度。

详细的ibecaon详情可见规范:Getting Started with iBeacon (apple.com)

二、 CH592实现 iBeacon测试程序

static uint8_t advertData[] = {
    // 1. 标志位 (Flags) 
    0x02, 
    GAP_ADTYPE_FLAGS, // 0x01
    GAP_ADTYPE_FLAGS_BREDR_NOT_SUPPORTED | GAP_ADTYPE_FLAGS_GENERAL, // 不支持经典蓝牙,普通发现模式

    // 2. 厂商自定义数据 (这就是 iBeacon 的本体)
    0x1A,                             // 长度:26字节
    GAP_ADTYPE_MANUFACTURER_SPECIFIC, // 0xFF: 厂商自定义数据类型
    
    // --- 下面是 Apple 规定的 iBeacon 格式 ---
    0x4C, 0x00,                       // 苹果公司的 Company ID (0x004C,低字节在前)
    0x02, 0x15,                       // 0x02 表示 iBeacon 类型,0x15(21) 表示后续数据长度
    
    // UUID (16字节)
    0xFD, 0xA5, 0x06, 0x93, 0xA4, 0xE2, 0x4F, 0xB1, 
    0xAF, 0xCF, 0xC6, 0xEB, 0x07, 0x64, 0x78, 0x25, 
    
    // Major (主ID: 2)
    0x00, 0x02,                       
    
    // Minor (次ID: 30513)
    0x77, 0x31,                       
    
    // TX Power (-100 dBm,十六进制补码表示为 0x9C)
    0x9C,                             
};

image

在 iBeacon 规范中,通常不需要扫描响应,但为了让手机扫描工具能看到设备名字,程序中设置 scanRspData扫描应答包,

  • 0x0B:长度 11 字节。

  • GAP_ADTYPE_LOCAL_NAME_COMPLETE:完整设备名。

  • 名字:"WCH592-001"。

  在初始化函数中,将广播类型设置GAP_ADTYPE_ADV_SCAN_IND,让 CH592 发送的是可扫描但不可连接的广播。手机可以向它发请求获取 scanRspData获取到蓝牙名字,但不能与它建立蓝牙配对连接。

image

  可以用NRFconnect蓝牙调试软件,查看到整个iBeacon的数据

image

 

posted on 2026-07-31 15:52  凡仕  阅读(4)  评论(0)    收藏  举报