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.被动扫描 

BLE主机主动扫描和被动扫描_第1张图片


2.主动扫描

 BLE主机主动扫描和被动扫描_第2张图片

详细参考书籍《低功耗蓝牙开发权威指南》 第114页


接下来实验:

 扫描参数设置:

[cpp]  view plain  copy
  1. /** @brief Scan parameters requested for scanning and connection. */  
  2. static const ble_gap_scan_params_t m_scan_param =  
  3. {  
  4.     0,              // Active scanning not set.  //设置为被动扫描  
  5.     0,              // Selective scanning not set.  
  6.     NULL,           // No whitelist provided.  
  7.     SCAN_INTERVAL,  
  8.     SCAN_WINDOW,  
  9.     0x0000          // No timeout.  
  10. };  


[cpp]  view plain  copy
  1.     case BLE_GAP_EVT_ADV_REPORT:  
  2.     {  
  3.         uint32_t err_code;  
  4.         data_t   adv_data;  
  5.         data_t   type_data;  
  6.   
  7.         // For readibility.  
  8.         const ble_gap_addr_t  * const peer_addr = &p_gap_evt->params.adv_report.peer_addr;  
  9.   
  10.         // Initialize advertisement report for parsing.                                                                                      adv_data.p_data     = (uint8_t *)p_gap_evt->params.adv_report.data;  
  11.         adv_data.data_len   = p_gap_evt->params.adv_report.dlen;  
  12.       //这里是打印蓝牙地址                      
  13.         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] );  
  14. / NRF_LOG_PRINTF(" p_gap_evt->params.adv_report.type  = %d\r\n", p_gap_evt->params.adv_report.type );                            //这里是打印是否为回应包 回应包为1,广播包为0        
  15. NRF_LOG_PRINTF(" p_gap_evt->params.adv_report.scan_rsp  = %d\r\n", p_gap_evt->params.adv_report.scan_rsp );                         //答应对应的数据  广播包或者回应报  
  16. NRF_LOG_PRINTF(" adv_data.p_data = %s\r\n", adv_data.p_data );  

因为周围有很多蓝牙设备 。现在就来扫描了。

BLE主机主动扫描和被动扫描_第3张图片

可以看到p_gap_evt->params.adv_report.scan_rsp = 0 表示是广播包。


再看把扫描改为主动扫描

[cpp]  view plain  copy
  1. /** @brief Scan parameters requested for scanning and connection. */  
  2. static const ble_gap_scan_params_t m_scan_param =  
  3. {  
  4.     1,              // Active scanning not set. //改为主动扫描  
  5.     0,              // Selective scanning not set.   
  6.     NULL,           // No whitelist provided.  
  7.     SCAN_INTERVAL,  
  8.     SCAN_WINDOW,  
  9.     0x0000          // No timeout.  
  10. };  

结果如下:

BLE主机主动扫描和被动扫描_第4张图片


扫描回应数据了。。。ok 实验成功!!!!!

你可能感兴趣的:(蓝牙)