中央设备
中央设备支持开启传统扫描流程、开启扩展扫描流程、发起传统连接流程、发起扩展连接流程以及发起周期性广播同步流程。
开启传统扫描流程
步骤中的代码片段出自于传统广播流程示例ble_app_gap_legacy_scan
(SDK_Folder\projects\ble\ble_basic_example\)。
- 设置扫描参数
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
-
- 开启扫描
error_code = ble_gap_scan_start(); APP_ERROR_CHECK(error_code); - 扫描开启成功后调用回调函数app_gap_scan_start_cb。
- 如果收到对端设备发送过来的广播数据或者扫描响应数据,app_gap_adv_report_ind_cb回调函数将被调用。
开启扩展扫描流程
步骤中的代码片段出自于扩展扫描流程示例ble_app_gap_extended_scan (SDK_Folder\projects\ble\ble_basic_example\)。
- 设置扩展扫描参数。
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
- 参数scan_param.scan_param_1m.scan_intv不小于scan_param.scan_param_1m.scan_wd。
- 开启扫描。
error_code = ble_gap_scan_start(); APP_ERROR_CHECK(error_code); - 扫描开启成功后调用回调函数app_gap_scan_start_cb 。
- 如果收到对端设备发送过来的广播数据或者扫描响应数据,app_gap_adv_report_ind_cb回调函数将被调用。
发起传统连接流程
步骤中的代码片段出自于传统连接流程示例ble_app_gap_legacy_connect(SDK_Folder\projects\ble\ble_basic_example\)。
- 设置发起连接所需参数。
//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
- 发起连接。
error_code = ble_gap_connect(BLE_GAP_OWN_ADDR_STATIC,&s_conn_param); APP_ERROR_CHECK(error_code); - 无论连接建立成功或连接创建失败,app_gap_connect_cb回调函数将被调用。
发起扩展连接流程
当设备发起扩展连接流程时,APP与BLE Stack之间的交互流程如图 12所示。
步骤中的代码片段出自于扩展连接流程示例ble_app_gap_extended_connect(SDK_Folder\projects\ble\ble_basic_example\)。
- 设置发起连接所需的参数。
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
- 发起连接。
error_code = ble_gap_ext_connect(BLE_GAP_OWN_ADDR_STATIC,&ext_conn_param); APP_ERROR_CHECK(error_code); - 无论连接建立成功或连接创建失败,app_gap_connect_cb回调函数将被调用。
发起周期性广播同步流程
当发起周期性广播同步流程时,APP与BLE Stack之间的交互流程如图 13所示。
步骤中的代码片段出自于周期性广播同步流程示例ble_app_gap_periodic _sync(SDK_Folder\projects\ble\ble_basic_example\)。
- 在开启周期性广播同步之前,需要先进行扩展扫描。所以,首先另外发起一个开启扩展扫描流程,详见开启扩展扫描流程。
- 设置扩展扫描参数。
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
- 启动扩展扫描。
error_code = ble_gap_scan_start(); APP_ERROR_CHECK(error_code); - 设置周期性广播同步参数。
在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
- 开始周期性广播同步。调用ble_gap_per_sync_start函数开启周期性同步时需要用户传入参数per_sync_idx。per_sync_idx的取值范围是[0,1,2,3,4]。
ble_gap_per_sync_start(0); - 无论周期性同步建立成功或周期性广播同步创建失败,app_gap_sync_establish_cb回调函数将被调用。
- 周期性同步建立成功后,接收到的周期性广播数据将通过app_gap_adv_report_ind_cb回调函数上报用户。