蓝牙BLE从机Peripheral讲解(扩展广播/Extern Adv)

本文介绍了蓝牙5.0新增的第二广播信道,重点讨论了主广播信道和扩展广播类型,包括EXT_CONN_DIRECT、EXT_SCAN_UNDIRECT等,并提供了Peripheral_Init函数示例,展示了如何设置不同类型的广播数据和信道使用。
部署运行你感兴趣的模型镜像

前言:

蓝牙5.0把广播信道抽象为两类,一种叫主广播信道(primary advertisement channels),工作在37,38,39三个信道中,蓝牙4.0的广播使用的都是主广播信道,另一种叫第二广播信道(Secondary Advertising Packets),工作在0–36信道中,这是蓝牙5.0新增的。
如下所示,对比4.0广播包,处于Secondary Advertising新增了许多类型的广播包。

//v5.x
#define GAP_ADTYPE_EXT_CONN_DIRECT              0x05  //!< extend Connectable directed event type
#define GAP_ADTYPE_EXT_SCAN_UNDIRECT            0x06  //!< extend Scannable undirected event type
#define GAP_ADTYPE_EXT_NONCONN_NONSCAN_UNDIRECT 0x07 //!< extend Non-Connectable and Non-Scannable undirected event type
#define GAP_ADTYPE_EXT_CONN_UNDIRECT            0x08  //!< extend Connectable undirected event type
#define GAP_ADTYPE_EXT_SCAN_DIRECT              0x09  //!< extend Scannable directed event type
#define GAP_ADTYPE_EXT_NONCONN_NONSCAN_DIRECT   0x0A  //!< extend Non-Connectable and Non-Scannable directed event type

扩展广播实例(CH58x):

static uint8_t advertData_ext[] = {
        0x12, // length of this data
        GAP_ADTYPE_LOCAL_NAME_COMPLETE,
        'E','x','t','A','D','V',' ','P','e','r','i','p','h','e','r','a','l',
        0x40,
        GAP_ADTYPE_MANUFACTURER_SPECIFIC,
        0x01,0x02,0x03,0x04,
        0x01,0x02,0x03,0x04,
        0x01,0x02,0x03,0x04,
        0x01,0x02,0x03,0x04,
        0x01,0x02,0x03,0x04,
        0x01,0x02,0x03,0x04,
        0x01,0x02,0x03,0x04,
        0x01,0x02,0x03,0x04,
        0x01,0x02,0x03,0x04,
        0x01,0x02,0x03,0x04,
        0x01,0x02,0x03,0x04,
        0x01,0x02,0x03,0x04,
        0x01,0x02,0x03,0x04,
        0x01,0x02,0x03,0x04,
        0x01,0x02,0x03,0x04,
        0x01,0x02,0x03
};
 
static uint8_t scanrspData_ext[] = {
        0x12, // length of this data
        GAP_ADTYPE_LOCAL_NAME_COMPLETE,
        'E','x','t','R','S','P',' ','P','e','r','i','p','h','e','r','a','l',
        0x40,
        GAP_ADTYPE_MANUFACTURER_SPECIFIC,
        0x07,0x08,0x09,0x00,
        0x07,0x08,0x09,0x00,
        0x07,0x08,0x09,0x00,
        0x07,0x08,0x09,0x00,
        0x07,0x08,0x09,0x00,
        0x07,0x08,0x09,0x00,
        0x07,0x08,0x09,0x00,
        0x07,0x08,0x09,0x00,
        0x07,0x08,0x09,0x00,
        0x07,0x08,0x09,0x00,
        0x07,0x08,0x09,0x00,
        0x07,0x08,0x09,0x00,
        0x07,0x08,0x09,0x00,
        0x07,0x08,0x09,0x00,
        0x07,0x08,0x09,0x00,
        0x07,0x08,0x09
};
 
void Peripheral_Init(){
    {   //扩展广播...
        uint8 adv_type;
        adv_type = GAP_ADTYPE_EXT_CONN_UNDIRECT; //可选择非定向的其他类型,这里为举例
 
        if(adv_type == GAP_ADTYPE_EXT_SCAN_UNDIRECT)
        {
            printf("scan\n");
            GAPRole_SetParameter(GAPROLE_ADV_EVENT_TYPE, sizeof(uint8_t), &adv_type);
            GAPRole_SetParameter(GAPROLE_SCAN_RSP_DATA, sizeof( scanrspData_ext ), scanrspData_ext ); //非定向扫描扩展需使用扫描数据
        }
        else if(adv_type == GAP_ADTYPE_EXT_NONCONN_NONSCAN_UNDIRECT)
        {
            printf("no con no scan\n");
            GAPRole_SetParameter(GAPROLE_ADV_EVENT_TYPE, sizeof(uint8_t), &adv_type);
            GAPRole_SetParameter(GAPROLE_ADVERT_DATA, sizeof( advertData_ext ), advertData_ext ); //非定向不可扫描不可连接扩展使用广播数据
        }
        else if(adv_type == GAP_ADTYPE_EXT_CONN_UNDIRECT)
        {
            printf("con\n");
            GAPRole_SetParameter(GAPROLE_ADV_EVENT_TYPE, sizeof(uint8_t), &adv_type);
            GAPRole_SetParameter(GAPROLE_ADVERT_DATA, sizeof( advertData_ext ), advertData_ext ); //非定向可连接扩展需使用广播数据
        }
    }
}

需注意扩展广播开启后对应的GAPROLE_SCAN_RSP_DATAGAPROLE_ADVERT_DATA作区分。

开启扩展广播后在0-36信道上发送对应的广播数据,37/38/39信道的广播不复存在。

您可能感兴趣的与本文相关的镜像

Python3.10

Python3.10

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

/** __ ___ _ ____ * ___\ \/ / |__ | | ___ __ _|___ \ * / _ \\ /| '_ \| |/ _ \ \ \ / / __) | * | __// \| |_) | | __/ \ V / / __/ * \___/_/\_\_.__/|_|\___| \_/ |_____| * * @file ex2_app_mouse.c * @brief exBLE v2 dual-mode mouse product demo. * @author onmicro * @date 2021/11 */ /******************************************************************************* * INCLUDES */ #include <stdbool.h> #include <stdio.h> #include <string.h> /* exBLE */ #include "ex2_api.h" #include "ex2_hal.h" #include "om_driver.h" #include "ex2_app_mouse.h" #include "evt.h" #include "mouse.h" /******************************************************************************* * TYPEDEFS */ /******************************************************************************* * CONST & VARIABLES */ mouse_adv_state_t mouse_state = MOUSE_LE_STATE_ADV; /* Peripheral Preferred Connection Parameters @ref ex2_gap_ppcp_t */ extern ex2_gap_ppcp_t ex2_gap_ppcp_value; /******************************************************************************* * LOCAL FUNCTIONS */ static bool ex2_app_mouse_broadcast_enable(uint32_t adv_interval_ms, uint32_t adv_timeout_ms, bool is_disc, bool swift_en) { uint8_t adv_ind_len; /* ADV_IND.AdvData */ uint8_t adv_ind[37] = { ///Flags: BLE limited discoverable mode and BR/EDR not supported 0x02, 0x01, BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE, ///Complete list of service class UUIDs: HID 0x03, 0x03, 0x12, 0x18, ///Apperance: Mouse 0x03, 0x19, 0xC2, 0x03, ///Complete Local Name in 11 bytes always. (0 + 1), 0x09, }; if (!is_disc) { adv_ind[2] = BLE_GAP_ADV_FLAGS_LE_ONLY_NON_DISC_MODE; } /// Complete Local Name. adv_ind[11] = strlen(mouse_name) + 1U; memcpy(adv_ind+13, mouse_name, adv_ind[11] - 1U); adv_ind_len = 11 + adv_ind[11] + 1U; // 11 = 3(Flags) + 4 (HID UUID) + 4(Apperance); NameLength /// swift if (swift_en) { /// Manufacturer Specific Data: Swift const char swift_flag[] = {0x06, 0xFF, 0x06, 0x00, 0x03, 0x00, 0x80}; memcpy(&adv_ind[adv_ind_len], swift_flag, sizeof(swift_flag)); adv_ind_len += sizeof(swift_flag); } hid_notification_enable(0); return ex2_gap_set_broadcast_mode(adv_ind, adv_ind_len, is_disc, adv_interval_ms, adv_timeout_ms); } extern bool bhost_conn_ok; uint32_t adv_interval_ms; void ex2_app_mouse_broadcast_fsm(void) { // 广播状态 bool is_disc; bool swift_en; uint32_t adv_timeout_ms; bool adv_en; bhost_conn_ok = false; adv_en = true; switch (mouse_state) { case MOUSE_LE_STATE_ADV: mouse_state = MOUSE_LE_STATE_STOP; /* Enter swift adv for pair w/ Manufacture field at 100ms advInterval. Stop adv in 180 seconds. */ adv_interval_ms = 20; adv_timeout_ms = 120*1000; is_disc = true; swift_en = true; break; case MOUSE_LE_STATE_STOP: adv_en = false; break; case MOUSE_LE_STATE_ADV_SWIFT: mouse_state = MOUSE_LE_STATE_ADV; /* Advertise w/o Manufacture field for swift before 3.5 seconds. */ /* Enter normal(advInterval=10ms) adv and discoverable mode for pair 3.5s timeout. */ adv_interval_ms = 10; adv_timeout_ms = 3500; is_disc = true; swift_en = false; break; case MOUSE_LE_STATE_DISCONN: mouse_state = MOUSE_LE_STATE_DISCONN_ADV; /* Enter fast(advInterval=5ms) adv and non-discoverable, connectable mode for connect-back. Stop connect-back in 10 seconds */ adv_interval_ms = 5; adv_timeout_ms = 5*1000; is_disc = false; swift_en = false; break; case MOUSE_LE_STATE_DISCONN_ADV: mouse_state = MOUSE_LE_STATE_STOP; /* Enter slow(advInterval=100ms) adv and non-discoverable, connectable mode for connect-back. Stop connect-back in 60 seconds */ adv_interval_ms = 20; adv_timeout_ms = 55*1000; is_disc = false; swift_en = false; break; default: adv_en = false; break; } if (adv_en) { ex2_app_mouse_broadcast_enable(adv_interval_ms, adv_timeout_ms, is_disc, swift_en); } } extern bool bble_conn_en; extern uint8_t mouse_bd_addr[]; extern ms_sleep_level_t ms_sleep_level; /******************************************************************************* * PUBLIC FUNCTIONS */ void ex2_app_mouse_ble_init(void) { adv_interval_ms = 0; ms_sleep_level = MS_SLEEP_LEVEL0; evt_callback_register(EVT_TYPE_BLE, ex2_stk_process); /* Part B, 1.3.2.1 Static device address */ mouse_bd_addr[5] |= 0xc0; ex2_stk_init(mouse_bd_addr); ex2_stk_register_app_evt_handler(app_ble_evt_dispatch); ex2_smp_enable_bond(); if(bble_conn_en) { drv_rf_set_tx_power(DRV_RF_PA_PWR_N12dBm); mouse_state = MOUSE_LE_STATE_ADV_SWIFT; } else { drv_rf_set_tx_power(DRV_RF_PA_PWR_5dBm); mouse_state = MOUSE_LE_STATE_DISCONN; } ex2_app_mouse_broadcast_fsm(); } /** @} */ 写上完整详细注释,不更改代码
08-22
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值