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页


接下来实验:

 扫描参数设置:

[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 );  

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


可以看到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. };  

结果如下:



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

  • 4
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Arduino ESP32是一种开源硬件平台,可以通过编程和连接各种外部设备来创建各种项目。ESP32是ESP系列的微控制器模块,具有强大的处理能力和低功耗特性。 BLE(蓝牙低功耗)是一种无线通信技术,可用于设备之间的短距离通信。通过使用ESP32的BLE库,我们可以实现BLE广播和扫描的功能。 要同时进行BLE广播和扫描,我们可以使用两个不同的ESP32设备,一个作为广播者,另一个作为扫描者。 作为广播者,我们可以使用ESP32的BLE广播库来设置广播数据包。我们可以在广播数据包中包含任何想要传输的信息,比如设备名称、传感器数据等。然后,我们可以使用BLE广播库中的函数将广播数据包发送到周围的设备。 作为扫描者,我们可以使用ESP32的BLE扫描库来搜索附近的BLE设备。我们可以设置扫描持续时间和扫描类型,并在找到设备时执行特定的动作。我们可以使用BLE扫描库中的回调函数获取扫描结果,并进行相应的处理。 在两个ESP32设备之间实现BLE广播和扫描可以通过建立连接来进一步交互和传输数据。广播者可以在广播数据包中包含用于建立连接的信息,而扫描者可以在找到广播者时尝试建立连接,并通过BLE通信协议进行数据传输。 通过在Arduino IDE中编写适当的代码,我们可以将ESP32配置为同时进行BLE广播和扫描,从而实现设备之间的无线通信。这样,我们可以开发各种基于ESP32的项目,如智能家居系统、传感器网络等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值