打开主菜单

谷雨文档中心 β

更改

NRF52832DK协议栈实验

添加6,601字节2019年7月12日 (五) 14:15
工程说明
====== scan_evt_handler()函数 ======
定义连接的参数,这个参数将在sd_ble_gap_connect()函数中被调用。<syntaxhighlight lang="c" line="1" start="65">// 定义连接参数static ble_gap_conn_params_t m_conn_params = { .min_conn_interval = MSEC_TO_UNITS(NRF_BLE_SCAN_MIN_CONNECTION_INTERVAL, UNIT_1_25_MS), // 最小连接间隔7.5ms .max_conn_interval = MSEC_TO_UNITS(NRF_BLE_SCAN_MAX_CONNECTION_INTERVAL, UNIT_1_25_MS), // 最大连接间隔30ms .slave_latency = NRF_BLE_SCAN_SLAVE_LATENCY, // 隐藏周期0 .conn_sup_timeout = MSEC_TO_UNITS(NRF_BLE_SCAN_SUPERVISION_TIMEOUT, UNIT_10_MS), // 超时时间4000ms };</syntaxhighlight>我们可以看到,在扫描回调事件处理的函数中,前面一部分还是和之前一样的,就是获取扫描到的从机设备的信息。
在159行,我们对扫描到的从机设备的RSSI进行了判断,我们人为定义,当设备的RSSI大于-30dBm的时候,也就是信号强度非常好,我们就默认连接该设备。
====== 工程说明 ======
过滤连接,我们主要关注的是扫描初始化中对于过滤连接设备的设置,以及过滤连接成功或者失败返回的扫描回调函数的事件ID。
===== 从机部分 =====
从机部分就不给大家介绍了,和前面的过滤广播的例程是重复的,仅修改了打印连接的对方设备的信息的部分。从机部分就不给大家介绍了,和前面的过滤广播的例程是重复的,仅修改了连接之后获取并打印对方设备的信息。 ====== scan_init()函数 ======连接参数定义,用于配置init_scan.p_conn_param参数,也就是我们的过滤扫描之后发起连接的连接参数。<syntaxhighlight lang="c" line="1" start="65">// 定义连接参数static ble_gap_conn_params_t m_conn_params = { .min_conn_interval = MSEC_TO_UNITS(NRF_BLE_SCAN_MIN_CONNECTION_INTERVAL, UNIT_1_25_MS), // 最小连接间隔7.5ms .max_conn_interval = MSEC_TO_UNITS(NRF_BLE_SCAN_MAX_CONNECTION_INTERVAL, UNIT_1_25_MS), // 最大连接间隔30ms .slave_latency = NRF_BLE_SCAN_SLAVE_LATENCY, // 隐藏周期0 .conn_sup_timeout = MSEC_TO_UNITS(NRF_BLE_SCAN_SUPERVISION_TIMEOUT, UNIT_10_MS), // 超时时间4000ms };</syntaxhighlight>在扫描初始化函数中,我们可以看到我们初始化了init_scan.connect_if_match = 1,然后我们还配置了init_scan.p_conn_param = &m_conn_params,后面的限制UUID是和过滤扫描一样的。 这样配置好之后,我们发起扫描,一旦扫描到我们的过滤后的设备,就会使用我们配置好的连接参数,对这个从机设备发起连接。连接成功或者失败,都会在扫描回调函数中进行事件通知。<syntaxhighlight lang="c" line="1" start="182">//******************************************************************// fn : scan_init//// brief : 初始化扫描(未设置扫描数据限制)//// param : none//// return : nonestatic void scan_init(void){ ret_code_t err_code; nrf_ble_scan_init_t init_scan;  // 清空扫描结构体参数 memset(&init_scan, 0, sizeof(init_scan)); init_scan.connect_if_match = 1; init_scan.conn_cfg_tag = APP_BLE_CONN_CFG_TAG; // 配置扫描的参数 init_scan.p_scan_param = &m_scan_params;  // 配置连接的参数 init_scan.p_conn_param = &m_conn_params; // 初始化扫描 err_code = nrf_ble_scan_init(&m_scan, &init_scan, scan_evt_handler); APP_ERROR_CHECK(err_code); // 设置扫描的UUID限制 err_code = nrf_ble_scan_filter_set(&m_scan, SCAN_UUID_FILTER, &m_nus_uuid); APP_ERROR_CHECK(err_code);  // 使能扫描的UUID限制 err_code = nrf_ble_scan_filters_enable(&m_scan, NRF_BLE_SCAN_UUID_FILTER, false); APP_ERROR_CHECK(err_code);}</syntaxhighlight> ====== scan_evt_handler()扫描回调函数 ======在扫描回调函数中,过滤扫描的事件是和之前一样的,我们不做介绍。 我们关注一下事件ID,NRF_BLE_SCAN_EVT_CONNECTED与NRF_BLE_SCAN_EVT_CONNECTING_ERROR,当我们设置init_scan.connect_if_match = 1后,如果扫描到并且成功连接上目标从设备,则返回连接成功的ID,如果失败了,则返回连接ERR。{{Note|text=注意:由于这两个事件返回的信息和ble协议栈返回的事件ID携带的信息相同,所以这边我们不重复打印。case NRF_BLE_SCAN_EVT_CONNECTED:{NRF_LOG_INFO("SCAN CONNECTED!");  // NRF_LOG_INFO("Connected. conn_DevAddr: %s\nConnected. conn_handle: 0x%04x\nConnected. conn_Param: %d,%d,%d,%d", // Util_convertBdAddr2Str((uint8_t*)p_scan_evt->params.connected.p_connected->peer_addr.addr), // p_scan_evt->params.connected.conn_handle, // p_scan_evt->params.connected.p_connected->conn_params.min_conn_interval, // p_scan_evt->params.connected.p_connected->conn_params.max_conn_interval, // p_scan_evt->params.connected.p_connected->conn_params.slave_latency, // p_scan_evt->params.connected.p_connected->conn_params.conn_sup_timeout // ); }break; case NRF_BLE_SCAN_EVT_CONNECTING_ERROR:{NRF_LOG_INFO("SCAN CONNECTING ERROR!"); // NRF_LOG_INFO("Disconnected. reason: 0x%04x", // p_scan_evt->params.connecting_err.err_code); }break;|type=warning}}<syntaxhighlight lang="c" line="1" start="111">//******************************************************************// fn : scan_evt_handler//// brief : 处理扫描回调事件//// param : scan_evt_t 扫描事件结构体//// return : nonestatic void scan_evt_handler(scan_evt_t const * p_scan_evt){ switch(p_scan_evt->scan_evt_id) { // 匹配的扫描数据(也就是过滤之后的) case NRF_BLE_SCAN_EVT_FILTER_MATCH: { ... } break;  case NRF_BLE_SCAN_EVT_CONNECTED: { NRF_LOG_INFO("SCAN CONNECTED!"); // NRF_LOG_INFO("Connected. conn_DevAddr: %s\nConnected. conn_handle: 0x%04x\nConnected. conn_Param: %d,%d,%d,%d",// Util_convertBdAddr2Str((uint8_t*)p_scan_evt->params.connected.p_connected->peer_addr.addr),// p_scan_evt->params.connected.conn_handle,// p_scan_evt->params.connected.p_connected->conn_params.min_conn_interval,// p_scan_evt->params.connected.p_connected->conn_params.max_conn_interval,// p_scan_evt->params.connected.p_connected->conn_params.slave_latency,// p_scan_evt->params.connected.p_connected->conn_params.conn_sup_timeout// ); }break; case NRF_BLE_SCAN_EVT_CONNECTING_ERROR: { NRF_LOG_INFO("SCAN CONNECTING ERROR!");// NRF_LOG_INFO("Disconnected. reason: 0x%04x",// p_scan_evt->params.connecting_err.err_code); }break; default: break; }}</syntaxhighlight>
==== 实验总结 ====
经过本实验的学习,大家需要了解到
=== 连接参数更新实验 ===
510
个编辑