BLE主机主动扫描和被动扫描
1.目的
识别什么是主动扫描 什么是被动扫描
2.分析
在实际中如果需要获得扫描响应,需要主机设置为主动扫描。如果仅仅是需要广播数据则设置为被动扫描。主动扫描和被动扫描的区别在于:主动扫描可以获得广播数据和扫描回应数据。而被动扫描只能获得广播数据不能获得扫描数据。
3.平台:
协议栈版本:SDK10.0.0
编译软件:keil 5.12
硬件平台:微雪开发板nrf51822
例子:SDK10.0\examples\ble_central_and_peripheral\experimental\ble_app_hrs_rscs_relay\pca10028\s130\arm4
4.步骤
参考资料:《低功耗蓝牙开发权威指南》
1.被动扫描
2.主动扫描
详细参考书籍《低功耗蓝牙开发权威指南》 第114页
接下来实验:
扫描参数设置:
- /** @brief Scan parameters requested for scanning and connection. */
- static const ble_gap_scan_params_t m_scan_param =
- {
- 0, // Active scanning not set. //设置为被动扫描
- 0, // Selective scanning not set.
- NULL, // No whitelist provided.
- SCAN_INTERVAL,
- SCAN_WINDOW,
- 0x0000 // No timeout.
- };
- case BLE_GAP_EVT_ADV_REPORT:
- {
- uint32_t err_code;
- data_t adv_data;
- data_t type_data;
- // For readibility.
- const ble_gap_addr_t * const peer_addr = &p_gap_evt->params.adv_report.peer_addr;
- // Initialize advertisement report for parsing. adv_data.p_data = (uint8_t *)p_gap_evt->params.adv_report.data;
- adv_data.data_len = p_gap_evt->params.adv_report.dlen;
- //这里是打印蓝牙地址
- NRF_LOG_PRINTF(" peer_addr = %d %d %d %d %d %d\r\n", peer_addr->addr[0],peer_addr->addr[1],peer_addr->addr[2],peer_addr->addr[3],peer_addr->addr[4],peer_addr->addr[5] );
- / NRF_LOG_PRINTF(" p_gap_evt->params.adv_report.type = %d\r\n", p_gap_evt->params.adv_report.type ); //这里是打印是否为回应包 回应包为1,广播包为0
- NRF_LOG_PRINTF(" p_gap_evt->params.adv_report.scan_rsp = %d\r\n", p_gap_evt->params.adv_report.scan_rsp ); //答应对应的数据 广播包或者回应报
- NRF_LOG_PRINTF(" adv_data.p_data = %s\r\n", adv_data.p_data );
因为周围有很多蓝牙设备 。现在就来扫描了。
可以看到p_gap_evt->params.adv_report.scan_rsp = 0 表示是广播包。
再看把扫描改为主动扫描
- /** @brief Scan parameters requested for scanning and connection. */
- static const ble_gap_scan_params_t m_scan_param =
- {
- 1, // Active scanning not set. //改为主动扫描
- 0, // Selective scanning not set.
- NULL, // No whitelist provided.
- SCAN_INTERVAL,
- SCAN_WINDOW,
- 0x0000 // No timeout.
- };
结果如下:
扫描回应数据了。。。ok 实验成功!!!!!