CN / EN
文档反馈
感谢关注汇顶文档,期待您的宝贵建议!
感谢您的反馈,祝您愉快!

中央设备

中央设备支持开启传统扫描流程、开启扩展扫描流程、发起传统连接流程、发起扩展连接流程以及发起周期性广播同步流程。

开启传统扫描流程

当设备开启传统扫描流程时,APP与BLE Stack之间的交互流程如 图 9所示。
图 9 开启传统扫描流程
开启传统扫描流程的具体步骤如下:
说明:

步骤中的代码片段出自于传统广播流程示例ble_app_gap_legacy_scan

(SDK_Folder\projects\ble\ble_basic_example\)

  1. 设置扫描参数
    s_scan_param.scan_type = GAP_SCAN_ACTIVE;
    s_scan_param.scan_mode = GAP_SCAN_OBSERVER_MODE;
    s_scan_param.scan_dup_filt = GAP_SCAN_FILT_DUPLIC_DIS;
    s_scan_param.use_whitelist = 0;
    s_scan_param.interval= APP_SCAN_INTERVAL;
    s_scan_param.window= APP_SCAN_WINDOW;
    s_scan_param.timeout = 0;
    error_code = ble_gap_scan_param_set(BLE_GAP_OWN_ADDR_STATIC,&s_scan_param);
    APP_ERROR_CHECK(error_code);
    说明:
    • 参数scan_param.interval不小于scan_param.window。

      若scan_mode=GAP_SCAN_LIM_DISC_MODE或GAP_SCAN_GEN_DISC_MODE,则默认的扫描超时时间为10.24秒。

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

  2. 开启扫描
    error_code = ble_gap_scan_start();
    APP_ERROR_CHECK(error_code);
  3. 扫描开启成功后调用回调函数app_gap_scan_start_cb。
  4. 如果收到对端设备发送过来的广播数据或者扫描响应数据,app_gap_adv_report_ind_cb回调函数将被调用。

开启扩展扫描流程

当设备开启扩展扫描流程时,APP与BLE Stack之间的交互流程如 图 10所示。
图 10 开启扩展扫描流程
开启扩展扫描流程的具体步骤如下:
说明:

步骤中的代码片段出自于扩展扫描流程示例ble_app_gap_extended_scan (SDK_Folder\projects\ble\ble_basic_example\)。

  1. 设置扩展扫描参数。
    s_scan_param.type = GAP_EXT_SCAN_TYPE_OBSERVER;
    s_scan_param.prop = GAP_SCAN_PROP_PHY_1M_BIT | 
                        GAP_SCAN_PROP_FILT_TRUNC_BIT;
    s_scan_param.dup_filt_pol = GAP_EXT_DUP_FILT_DIS;
    s_scan_param.scan_param_1m.scan_intv = APP_SCAN_INTERVAL;
    s_scan_param.scan_param_1m.scan_wd= APP_SCAN_WINDOW;
    s_scan_param.duration= 0;
    s_scan_param.period= 0;
    error_code = ble_gap_ext_scan_param_set(BLE_GAP_OWN_ADDR_STATIC, 
                                            &s_scan_param);
    APP_ERROR_CHECK(error_code);
    说明:
    • 参数scan_param.scan_param_1m.scan_intv不小于scan_param.scan_param_1m.scan_wd。

      如果scan_param.type = GAP_EXT_SCAN_TYPE_LIM_DISC或者GAP_EXT_SCAN_TYPE_LIM_DISC,则默认的扫描超时时间为10.24秒。

    • 代码路径:SDK_Folder\projects\ble\ble_basic_example\ble_app_gap_extended_scan\Src\user\user_app.c
  2. 开启扫描。
    error_code = ble_gap_scan_start();
    APP_ERROR_CHECK(error_code);
  3. 扫描开启成功后调用回调函数app_gap_scan_start_cb 。
  4. 如果收到对端设备发送过来的广播数据或者扫描响应数据,app_gap_adv_report_ind_cb回调函数将被调用。

发起传统连接流程

当设备发起传统连接流程时,APP与BLE Stack之间的交互流程如 图 11所示。
图 11 发起传统连接流程
发起传统连接流程的具体步骤如下:
说明:

步骤中的代码片段出自于传统连接流程示例ble_app_gap_legacy_connect(SDK_Folder\projects\ble\ble_basic_example\)。

  1. 设置发起连接所需参数。
    //peer device address
    uint8_t peer_dev_addr[] = {0x01, 0x23, 0x45, 0x67, 0x89, 0xA0};
    memcpy(s_conn_param.peer_addr.gap_addr.addr, peer_dev_addr, 6);
    s_conn_param.type = GAP_INIT_TYPE_DIRECT_CONN_EST;
    //address type is public
    s_conn_param.peer_addr.addr_type = 0;      
    s_conn_param.interval_min = APP_CONNECTION_MIN_INTERVAL;
    s_conn_param.interval_max = APP_CONNECTION_MAX_INTERVAL;
    s_conn_param.slave_latency = APP_CONNECTION_SLAVE_LATENCY;
    s_conn_param.sup_timeout = APP_CONNECTION_MAX_TIMEOUT;
    说明:

    在测试时,m_conn_param.peer_addr需要根据用户的需求配置成实际的连接地址。如果s_conn_param.type配置为GAP_INIT_TYPE_NAME_DISC时,当连接建立后,app_gap_connect_cb不会上报事件给应用层,该Central会自动向peer获取device name。当获取到name后,app_gap_peer_name_ind_cb回调会上报。之后Central内部会终止该连接,终止连接后,app_gap_disconnect_cb也不会上报。

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

  2. 发起连接。
    error_code = ble_gap_connect(BLE_GAP_OWN_ADDR_STATIC,&s_conn_param);
    APP_ERROR_CHECK(error_code);
  3. 无论连接建立成功或连接创建失败,app_gap_connect_cb回调函数将被调用。

发起扩展连接流程

当设备发起扩展连接流程时,APP与BLE Stack之间的交互流程如图 12所示。

图 12 发起扩展连接流程
发起扩展连接流程的具体步骤如下:
说明:

步骤中的代码片段出自于扩展连接流程示例ble_app_gap_extended_connect(SDK_Folder\projects\ble\ble_basic_example\)。

  1. 设置发起连接所需的参数。
    uint8_t test_addr[] = {0x01, 0x23, 0x45, 0x67, 0x89, 0xA0};
    gap_ext_init_param_t ext_conn_param;
    memset(&ext_conn_param, 0 , sizeof(ext_conn_param));
    ext_conn_param.type = GAP_INIT_TYPE_DIRECT_CONN_EST;
    ext_conn_param.prop = GAP_INIT_PROP_1M_BIT;
    ext_conn_param.conn_to = 0;
    ext_conn_param.scan_param_1m.scan_intv = 15;
    ext_conn_param.scan_param_1m.scan_wd = 15;
    ext_conn_param.conn_param_1m.conn_intv_min = 6;
    ext_conn_param.conn_param_1m.conn_intv_max = 10;
    ext_conn_param.conn_param_1m.conn_latency = 1;
    ext_conn_param.conn_param_1m.supervision_to = 100;
    ext_conn_param.conn_param_1m.ce_len = 0;
    ext_conn_param.peer_addr.addr_type = 0;
    memcpy(ext_conn_param.peer_addr.gap_addr.addr, test_addr, 6);
    说明:

    在测试时ext_conn_param.peer_addr需要根据用户的需求配置成实际的连接地址。如果ext_conn_param.type 配置为GAP_INIT_TYPE_NAME_DISC时,当连接建立后,app_gap_connect_cb不会上报,该Central 会自动向peer获取device name。当获取到name后,app_gap_peer_name_ind_cb回调会上报。之后Central内部会终止该连接,终止连接后,app_gap_disconnect_cb也不会上报。

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

  2. 发起连接。
    error_code = ble_gap_ext_connect(BLE_GAP_OWN_ADDR_STATIC,&ext_conn_param);
    APP_ERROR_CHECK(error_code);
  3. 无论连接建立成功或连接创建失败,app_gap_connect_cb回调函数将被调用。

发起周期性广播同步流程

当发起周期性广播同步流程时,APP与BLE Stack之间的交互流程如图 13所示。

图 13 发起周期性广播流程
发起周期性广播同步流程的具体步骤如下:
说明:

步骤中的代码片段出自于周期性广播同步流程示例ble_app_gap_periodic _sync(SDK_Folder\projects\ble\ble_basic_example\)。

  1. 在开启周期性广播同步之前,需要先进行扩展扫描。所以,首先另外发起一个开启扩展扫描流程,详见开启扩展扫描流程
  2. 设置扩展扫描参数。
    s_scan_param.type = GAP_EXT_SCAN_TYPE_OBSERVER;
    s_scan_param.prop = GAP_SCAN_PROP_PHY_1M_BIT | 
                        GAP_SCAN_PROP_FILT_TRUNC_BIT;
    s_scan_param.dup_filt_pol = GAP_EXT_DUP_FILT_DIS;
    s_scan_param.scan_param_1m.scan_intv = APP_SCAN_INTERVAL;
    s_scan_param.scan_param_1m.scan_wd= APP_SCAN_WINDOW;
    s_scan_param.duration= 0;
    s_scan_param.period= 0;
    error_code = ble_gap_ext_scan_param_set(BLE_GAP_OWN_ADDR_STATIC, 
                                            &s_scan_param);
    APP_ERROR_CHECK(error_code);
    说明:

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

  3. 启动扩展扫描。
    error_code = ble_gap_scan_start();
    APP_ERROR_CHECK(error_code);
  4. 设置周期性广播同步参数。

    在static void app_gap_adv_report_ind_cb(uint8_t conidx, const gap_ext_adv_report_ind_t *param)回调函数中配置周期性广播同步参数并开启周期性广播同步。

    s_per_sync_param.skip = 0;
    s_per_sync_param.sync_to = APP_SYNC_TIMEOUT;
    s_per_sync_param.type = GAP_PER_SYNC_TYPE_GENERAL;
    s_per_sync_param.adv_addr.adv_sid = p_adv_report->adv_sid;
    memcpy(s_per_sync_param.adv_addr.bd_addr.gap_addr.addr, s_peer_dev_addr, 6);
    s_per_sync_param.adv_addr.bd_addr.addr_type = 0;
    ble_gap_per_sync_param_set(0, &s_per_sync_param);
    说明:

    在测试过程中,设置peer_dev_addr = 开启周期性广播的设备的地址。

    代码路径:SDK_Folder\projects\ble\ble_basic_example\ble_app_gap_periodic_sync\Src\user_callback\user_gap_callback.c

  5. 开始周期性广播同步。调用ble_gap_per_sync_start函数开启周期性同步时需要用户传入参数per_sync_idx。per_sync_idx的取值范围是[0,1,2,3,4]。
    ble_gap_per_sync_start(0);
  6. 无论周期性同步建立成功或周期性广播同步创建失败,app_gap_sync_establish_cb回调函数将被调用。
  7. 周期性同步建立成功后,接收到的周期性广播数据将通过app_gap_adv_report_ind_cb回调函数上报用户。

扫描关注

打开微信,使用“扫一扫”即可关注。