GR5x系列BLE知识及应用专题(6) - 如何开启各种广播

  • 前言

    通过"GR5x系列BLE知识及应用专题" 系统介绍一些 BLE 涉及的知识概念, 以及如何使用 Goodix GR5xx 系列芯片的SDK进行BLE应用开发。
    可以从下面网页获得 GR5xx 系列蓝牙芯片的介绍和选型参考.

    本文基于Goodix GR55xx 蓝牙芯片SDK 中工程 [${SDK}\projects\ble\ble_basic_example]为例, 举例说明如何开启几种典型的广播.

1. 开启传统广播

在这里插入图片描述

1.1 设置广播参数

	s_gap_adv_param.adv_intv_max = APP_ADV_MAX_INTERVAL;
	s_gap_adv_param.adv_intv_min = APP_ADV_MIN_INTERVAL;
	s_gap_adv_param.adv_mode = GAP_ADV_TYPE_ADV_IND;
	s_gap_adv_param.chnl_map = GAP_ADV_CHANNEL_37_38_39;
	s_gap_adv_param.disc_mode = GAP_DISC_MODE_NON_DISCOVERABLE;
	s_gap_adv_param.filter_pol = GAP_ADV_ALLOW_SCAN_ANY_CON_ANY;
	error_code = ble_gap_adv_param_set(0, BLE_GAP_OWN_ADDR_STATIC,&s_gap_adv_param);
	APP_ERROR_CHECK(error_code);

说明:

  • 定向广播的可发现模式只能设置为GAP_DISC_MODE_NON_DISCOVERABLE(不可发现)。
  • 发现模式如果为GAP_DISC_MODE_BROADCASTER,则广播模式只能设置为GAP_ADV_TYPE_ADV_NONCONN_IND(不可连接也不可扫描)。
  • peer_addr参数只在定向广播或者是controller privacy被使能(即ble_gap_privacy_params_set函数的第二个参 BLE_GAP_PRIV_CFG_PRIV_EN_BIT被置位)的情况下才会使用。
  • 代码路径:
SDK_Folder\projects\ble\ble_basic_example\ble_app_gap_legacy_adv\Src\user\user_app.c

1.2 设置广播数据(可选)

adv_mode为GAP_ADV_TYPE_ADV_HIGH_DIRECT_IND或GAP_ADV_TYPE_ADV_LOW_DIRECT_IND时,无需设置广播数据,其他情况则需设置。

1.3 设置扫描响应数据(可选)

adv_mode为GAP_ADV_TYPE_ADV_IND或GAP_ADV_TYPE_ADV_SCAN_IND时,需设置扫描响应数据,其他情况则无需设置。
static const uint8_t s_adv_data_set[] =
{
        0x03,
        BLE_GAP_AD_TYPE_COMPLETE_LIST_16_BIT_UUID,
        0x01, 0x00,
};
static const uint8_t s_adv_rsp_data_set[] =
{
        0x0b,
        BLE_GAP_AD_TYPE_COMPLETE_NAME,
        'L', 'e', 'g', 'a', 'c', 'y', '_', 'A', 'D', 'V',
};
error_code = ble_gap_adv_data_set(0, BLE_GAP_ADV_DATA_TYPE_DATA,s_adv_data_set, sizeof(s_adv_data_set));
APP_ERROR_CHECK(error_code);
error_code = ble_gap_adv_data_set(0, BLE_GAP_ADV_DATA_TYPE_SCAN_RSP, s_adv_rsp_data_set, sizeof(s_adv_rsp_data_set));
APP_ERROR_CHECK(error_code);

说明:

  • adv data以及adv rsp data必须按照Bluetooth Core Spec规定的格式进行组合,即(length, type, data)。其中length所指示的长度为type字段与data字段的总长度。
  • 代码路径:
SDK_Folder\projects\ble\ble_basic_example\ble_app_gap_legacy_adv\Src\user\user_app.c

1.4 开启广播

调用ble_gap_adv_start函数开启广播时需要用户传入参数adv_idx,以便指定广播实例索引。支持最多同时建立5个传统广播,所以adv_idx的取值范围是[0,1,2,3,4]。

s_gap_adv_time_param.duration = 0;
s_gap_adv_time_param.max_adv_evt = 0;
error_code = ble_gap_adv_start(0, &s_gap_adv_time_param);
APP_ERROR_CHECK(error_code);

说明:

  • 代码路径:SDK_Folder\projects\ble\ble_basic_example\ble_app_gap_legacy_adv\Src\user\user_app.c

1.5 广播开启成功后调用回调函数app_gap_adv_start_cb

说明:

  • 如果用户希望更新广播参数,则可以在广播停止后调用ble_gap_adv_data_set和ble_gap_adv_param_set接口重新配置广播数据和广播参数,再调用ble_gap_adv_start来启动广播。
  • 如果广播参数的scan_req_ind_en值为true,那么当收到对端设备发送的扫描请求时,app_gap_scan_req_ind_cb回调函数将被调用。

2. 开启扩展广播

在这里插入图片描述

2.1 设置扩展广播参数。

s_gap_adv_param.type = GAP_ADV_TYPE_EXTENDED;
s_gap_adv_param.disc_mode = GAP_DISC_MODE_GEN_DISCOVERABLE;
/* The advertisement shall not be both connectable and scannable, and
High duty cycle directed advertising cannot be used */
s_gap_adv_param.prop = GAP_ADV_PROP_CONNECTABLE_BIT;
s_gap_adv_param.max_tx_pwr = 0;
s_gap_adv_param.filter_pol = GAP_ADV_ALLOW_SCAN_ANY_CON_ANY;
memset(&s_gap_adv_param.peer_addr, 0, sizeof(gap_bdaddr_t));
s_gap_adv_param.prim_cfg.adv_intv_min = APP_ADV_MIN_INTERVAL;
s_gap_adv_param.prim_cfg.adv_intv_max = APP_ADV_MAX_INTERVAL;
s_gap_adv_param.prim_cfg.chnl_map = GAP_ADV_CHANNEL_37_38_39;
s_gap_adv_param.prim_cfg.phy = GAP_PHY_1MBPS_VALUE;
s_gap_adv_param.second_cfg.max_skip = 0;
s_gap_adv_param.second_cfg.phy = GAP_PHY_1MBPS_VALUE;
s_gap_adv_param.second_cfg.adv_sid = 0x00;
s_gap_adv_param.period_cfg.adv_intv_min = 0;
s_gap_adv_param.period_cfg.adv_intv_max = 0;
error_code = ble_gap_ext_adv_param_set(0, BLE_GAP_OWN_ADDR_STATIC,&s_gap_adv_param);
APP_ERROR_CHECK(error_code);

说明:

  • 在两种情况下prop参数中GAP_ADV_PROP_DIRECTED_BIT可以被置位,一种情况是:disc_mode参数设置为GAP_DISC_MODE_NON_DISCOVERABLE;一种情况是:disc_mode参数设置为GAP_DISC_MODE_BROADCASTER,并且参数GAP_ADV_PROP_ANONYMOUS_BIT被置位。
  • 扩展广播不支持High Duty的定向广播,因此在扩展广播中prop参数的GAP_ADV_PROP_HDC_BIT不能被置位。
  • 扩展广播不支持既可扫描又可连接的广播,因此prop参数中GAP_ADV_PROP_CONNECTABLE_BIT和GAP_ADV_PROP_SCANNABLE_BIT不能被同时置位。
  • 如果prop参数中GAP_ADV_PROP_ANONYMOUS_BIT被置位,则disc_mode参数只能设置为:GAP_DISC_MODE_NON_DISCOVERABLE或者 GAP_DISC_MODE_BROADCASTER。
  • 如果prop参数中GAP_ADV_PROP_ANONYMOUS_BIT被置位,则prop参数中的GAP_ADV_PROP_CONNECTABLE_BIT和GAP_ADV_PROP_SCANNABLE_BIT都不能被置位。
  • peer_addr参数只在定向广播或者controller privacy被使能(即ble_gap_privacy_params_set函数的第二个参数 BLE_GAP_PRIV_CFG_PRIV_EN_BIT被置位)的情况下被使用。
  • 代码路径:SDK_Folder\projects\ble\ble_basic_example\ble_app_gap_extended_adv\Src\user\user_app.c

2.2 设置广播数据(可选)

如果prop参数中GAP_ADV_PROP_SCANNABLE_BIT被置位,则无需设置。

2.3 设置扫描响应数据(可选)

如果prop参数中GAP_ADV_PROP_SCANNABLE_BIT被置位,则需设置。

static const uint8_t s_adv_data_set[] =
{
        0x03,
        BLE_GAP_AD_TYPE_COMPLETE_LIST_16_BIT_UUID,
        0x01, 0x00,
};
static const uint8_t s_adv_rsp_data_set[] =
{
        0x0d,
        BLE_GAP_AD_TYPE_COMPLETE_NAME,
        'E', 'x', 't', 'e', 'n', 'd', 'e', 'd', '_', 'A', 'D', 'V',
};
error_code = ble_gap_adv_data_set(0, BLE_GAP_ADV_DATA_TYPE_DATA,
s_adv_data_set,sizeof(s_adv_data_set));
APP_ERROR_CHECK(error_code);
error_code = ble_gap_adv_data_set(0, BLE_GAP_ADV_DATA_TYPE_SCAN_RSP,
s_adv_rsp_data_set,sizeof(s_adv_rsp_data_set));
APP_ERROR_CHECK(error_code);

说明:

  • adv data以及adv rsp data必须按照Bluetooth Core Spec规定的格式进行组合,即(length, type, data)。length的长度为type字段与data字段的总长度。
  • 代码路径:SDK_Folder\projects\ble\ble_basic_example\ble_app_gap_extended_adv\Src\user\user_app.c

2.4 开启广播

调用ble_gap_adv_start函数开启广播时需要用户传入参数adv_idx,以便指定广播实例索引。支持最多同时建立5个扩展广播,所以adv_idx的取值范围是[0,1,2,3,4]。

s_gap_adv_time_param.duration = 0;
s_gap_adv_time_param.max_adv_evt = 0;
error_code = ble_gap_adv_start(0, &s_gap_adv_time_param);
APP_ERROR_CHECK(error_code);

说明:

  • 代码路径:SDK_Folder\projects\ble\ble_basic_example\ble_app_gap_extended_adv\Src\user\user_app.c
  • 广播开启成功后调用回调函数app_gap_adv_start_cb。
  • 如果广播参数的prop中的GAP_ADV_PROP_SCAN_REQ_NTF_EN_BIT置位,那么当收到对端设备发送过来的扫描请求时,app_gap_scan_req_ind_cb回调函数将被调用。

3. 开启周期性广播

在这里插入图片描述

3.1设置广播参数。

s_gap_adv_param.type = GAP_ADV_TYPE_PERIODIC;
s_gap_adv_param.disc_mode = GAP_DISC_MODE_GEN_DISCOVERABLE;
/* Connectable, anonymous, scannable, high duty circle bit must be set to 0 */
s_gap_adv_param.prop = 0;
s_gap_adv_param.max_tx_pwr = 0;
s_gap_adv_param.filter_pol = GAP_ADV_ALLOW_SCAN_ANY_CON_ANY;
memset(&s_gap_adv_param.peer_addr, 0, sizeof(gap_bdaddr_t));
s_gap_adv_param.prim_cfg.adv_intv_min = APP_PRIMARY_ADV_MIN_INTERVAL;
s_gap_adv_param.prim_cfg.adv_intv_max = APP_PRIMARY_ADV_MAX_INTERVAL;
s_gap_adv_param.prim_cfg.chnl_map = GAP_ADV_CHANNEL_37_38_39;
s_gap_adv_param.prim_cfg.phy = GAP_PHY_1MBPS_VALUE;
s_gap_adv_param.second_cfg.max_skip = 0;
s_gap_adv_param.second_cfg.phy = GAP_PHY_1MBPS_VALUE;
s_gap_adv_param.second_cfg.adv_sid = 0x00;
s_gap_adv_param.period_cfg.adv_intv_min = APP_PERIODIC_ADV_MIN_INTERVAL;
s_gap_adv_param.period_cfg.adv_intv_max = APP_PERIODIC_ADV_MAX_INTERVAL;
error_code = ble_gap_ext_adv_param_set(0, BLE_GAP_OWN_ADDR_STATIC,&s_gap_adv_param);
APP_ERROR_CHECK(error_code);

说明:

  • 在配置周期性广播参数过程中,prop参数的GAP_ADV_PROP_CONNECTABLE_BIT,GAP_ADV_PROP_SCANNABLE_BIT,GAP_ADV_PROP_ANONYMOUS_BIT,GAP_ADV_PROP_HDC_BIT都不能被置位。
  • peer_addr参数只在定向广播或者controller privacy被使能(即ble_gap_privacy_params_set函数的第二个参数BLE_GAP_PRIV_CFG_PRIV_EN_BIT被置位)的情况下才会使用。
  • 代码路径:SDK_Folder\projects\ble\ble_basic_example\ble_app_gap_periodic_adv\Src\user\user_app.c

3.2 设置广播数据

3.3 设置周期性广播数据(可选)

static const uint8_t s_adv_data_set[] =
{
        0x03,
        BLE_GAP_AD_TYPE_COMPLETE_LIST_16_BIT_UUID,
        0x01, 0x00,
        0x0d,
        BLE_GAP_AD_TYPE_COMPLETE_NAME,
        'P', 'e', 'r', 'i', 'o', 'd', 'i', 'c', '_', 'A', 'D', 'V',
};
static const uint8_t s_periodic_adv_data[] =
{
        0x01, 0x02, 0x03, 0x04, 0x05, 0x06
};
error_code = ble_gap_adv_data_set(0, BLE_GAP_ADV_DATA_TYPE_DATA,s_adv_data_set, sizeof(s_adv_data_set));
APP_ERROR_CHECK(error_code);
error_code = ble_gap_adv_data_set(0, BLE_GAP_ADV_DATA_TYPE_PER_DATA,s_periodic_adv_data,sizeof(s_periodic_adv_data));
APP_ERROR_CHECK(error_code);

说明:

  • adv data以及periodic_adv_data必须按照Bluetooth Core Spec规定的格式进行组合,即(length, type,data)。其中length所指示的长度为type字段与data字段的总长度。
  • 代码路径:SDK_Folder\projects\ble\ble_basic_example\ble_app_gap_periodic_adv\Src\user\user_app.c

3.4 开启广播

调用ble_gap_adv_start函数开启广播时需要用户传入参数adv_idx,以便指定广播实例索引。支持最多同时建立5个周期性广播,所以adv_idx的取值范围是[0,1,2,3,4]。

s_gap_adv_time_param.duration = 0;
s_gap_adv_time_param.max_adv_evt = 0;
error_code = ble_gap_adv_start(0, &s_gap_adv_time_param);
APP_ERROR_CHECK(error_code);

说明:

  • 代码路径:SDK_Folder\projects\ble\ble_basic_example\ble_app_gap_periodic_adv\Src\user\user_app.c

3.5 广播开启成功后调用回调函数app_gap_adv_start_cb

另外,需要注意的是系统在同一时间最多能同时开启五个广播,含传统广播、扩展广播和周期性广播。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值