CH5xx系列蓝牙芯片扩展广播完整配置指南

扩展广播是蓝牙5.0及以上版本的核心增强特性。它打破了经典广播31字节的数据容量限制,允许单个广播包承载最多255字节的数据,极大地扩展了BLE设备的应用场景。本文将以CH5xx系列芯片(如CH585/4、CH592/1、CH583/2)为例,详细介绍扩展广播的模式配置与数据结构。

一、扩展广播模式配置

在Peripheral_Init等初始化函数中,通过设置广播类型变量并调用对应的GAPRole_SetParameter接口,可以灵活配置多种工作模式。以下是三种典型模式的配置方法:

uint8_t ext_adv_type = GAP_ADTYPE_EXT_CONN_UNDIRECT; // 以可连接模式为例

if (ext_adv_type == GAP_ADTYPE_EXT_SCAN_UNDIRECT) {
    // 模式:可扫描的扩展不可定向广播
    // 特性:设备允许被扫描以获取更多信息,但不接受连接请求。适用于信标、信息发布等场景。
    PRINT("GAP_ADTYPE_EXT_SCAN_UNDIRECT\n");
    GAPRole_SetParameter(GAPROLE_ADV_EVENT_TYPE, sizeof(uint8_t), &ext_adv_type);
    // 注意:此模式需设置扫描响应数据
    GAPRole_SetParameter(GAPROLE_SCAN_RSP_DATA, sizeof(ext_scan_response_data), ext_scan_response_data);
} else if (ext_adv_type == GAP_ADTYPE_EXT_NONCONN_NONSCAN_UNDIRECT) {
    // 模式:不可连接且不可扫描的扩展不可定向广播
    // 特性:设备仅进行单向数据广播,功耗极低。适用于远程传感器等只发不收的场景。
    PRINT("GAP_ADTYPE_EXT_NONCONN_NONSCAN_UNDIRECT\n");
    GAPRole_SetParameter(GAPROLE_ADV_EVENT_TYPE, sizeof(uint8_t), &ext_adv_type);
    GAPRole_SetParameter(GAPROLE_ADVERT_DATA, sizeof(ext_advertising_data), ext_advertising_data);
} else if (ext_adv_type == GAP_ADTYPE_EXT_CONN_UNDIRECT) {
    // 模式:可连接的扩展不可定向广播
    // 特性:最常用的模式,既可发送长广播数据,也允许中心设备发起连接以进行双向通信。
    PRINT("GAP_ADTYPE_EXT_CONN_UNDIRECT\n");
    GAPRole_SetParameter(GAPROLE_ADV_EVENT_TYPE, sizeof(uint8_t), &ext_adv_type);
    GAPRole_SetParameter(GAPROLE_ADVERT_DATA, sizeof(ext_advertising_data), ext_advertising_data);
}

二、广播数据与扫描响应数据结构详解

以下为完整的广播数据 (ext_advertising_data) 和扫描响应数据 (ext_scan_response_data) 示例。每个数组都严格遵循 “长度 | 类型 | 内容” 的数据段结构,充分利用了扩展广播的大容量优势。

// 扩展广播数据 (总计 71 字节)
static uint8_t ext_advertising_data[] = {
    // 数据段 1: 完整设备名称 (共 7 字节)
    0x07,                               // 本段总长度:1字节类型 + 6字节名称 = 7字节
    GAP_ADTYPE_LOCAL_NAME_COMPLETE,     // 数据类型:完整的本地设备名称
    'E','x','t','A','D','V',            // 设备名称:"ExtADV" (6字节)

    // 数据段 2: 厂商自定义数据 (共 64 字节)
    0x40,                               // 本段总长度:1字节类型 + 63字节数据 = 64字节
    GAP_ADTYPE_MANUFACTURER_SPECIFIC,   // 数据类型:厂商自定义数据
    // 以下是63字节的厂商自定义测试数据(连续值1-63)
    0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A, // 1-10
    0x0B,0x0C,0x0D,0x0E,0x0F,0x10,0x11,0x12,0x13,0x14, // 11-20
    0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E, // 21-30
    0x1F,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28, // 31-40
    0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,0x30,0x31,0x32, // 41-50
    0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C, // 51-60
    0x3D,0x3E,0x3F                               // 61-63
};

// 扩展扫描响应数据 (总计 71 字节)
static uint8_t ext_scan_response_data[] = {
    // 数据段 1: 扫描响应中的设备名称 (共 7 字节)
    0x07,                               // 本段总长度:7字节
    GAP_ADTYPE_LOCAL_NAME_COMPLETE,     // 数据类型:完整的本地设备名称
    'E','x','t','R','S','P',            // 扫描响应中使用的设备名称:"ExtRSP"

    // 数据段 2: 扫描响应中的厂商自定义数据 (共 64 字节)
    0x40,                               // 本段总长度:64字节
    GAP_ADTYPE_MANUFACTURER_SPECIFIC,   // 数据类型:厂商自定义数据
    // 以下是63字节的厂商自定义测试数据(连续值64-126)
    0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49, // 64-73
    0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,0x50,0x51,0x52,0x53, // 74-83
    0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x5B,0x5C,0x5D, // 84-93
    0x5E,0x5F,0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67, // 94-103
    0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F,0x70,0x71, // 104-113
    0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7A,0x7B, // 114-123
    0x7C,0x7D,0x7E                               // 124-126
};

关键点解析:

数据总长度:每个数组的总长度为 1 + 6 + 1 + 63 = 71 字节,远超过经典广播的31字节限制。

数据结构:每个数据段都严格遵循BLE规范的数据结构,首字节为长度,次字节为AD Type,之后为有效载荷。

数据内容:

广播数据 (ext_advertising_data):通常包含设备的核心信息,如名称和主要厂商数据。本例中,厂商数据部分填充了从 0x01 到 0x3F(十进制1-63)的连续值,便于测试和验证数据完整性。

扫描响应数据 (ext_scan_response_data):当设备处于可扫描模式时,此数据将在收到扫描请求后发出。它可以承载补充信息。本例中填充了从 0x40 到 0x7E(十进制64-126)的连续值,以示区分。

通过上述配置,开发者可以充分利用CH5xx系列芯片的扩展广播能力,为复杂应用(如传输设备详细描述、传感器历史数据摘要、配置信息等)提供坚实的数据传输基础。

posted on 2026-02-06 12:33  WCH蓝牙应用分享  阅读(203)  评论(0)    收藏  举报