当前位置: 首页 > news >正文

Active和Passive两种扫描模式下,接收到的BLE广播报文的不同

一、Active和Passive

微软官方文档BluetoothLEScanningMode Enum (Windows.Devices.Bluetooth.Advertisement) - Windows apps | Microsoft Learn

翻译

二、Active

1、代码

#include <iostream> #include <windows.h> #include <winrt/Windows.Foundation.h> #include <winrt/Windows.Foundation.Collections.h> #include <winrt/Windows.Devices.Bluetooth.Advertisement.h> #include <winrt/Windows.Storage.Streams.h> #include <atomic> #include <string> #include <sstream> #include <vector> #include <mutex> #include <iomanip> #include <chrono> using namespace winrt; using namespace Windows::Foundation; using namespace Windows::Devices::Bluetooth::Advertisement; using namespace Windows::Storage::Streams; BluetoothLEAdvertisementWatcher g_watcher{nullptr}; std::string BluetoothAddressToString(uint64_t address){ std::stringstream ss; ss << std::setw(2) << std::setfill('0') << std::hex << ((address >> 40) & 0xFF) << ":" << ((address >> 32) & 0xFF) << ":" << ((address >> 24) & 0xFF) << ":" << ((address >> 16) & 0xFF) << ":" << ((address >> 8) & 0xFF) << ":" << (address & 0xFF); return ss.str(); } std::string WStringToUtf8(const std::wstring& wstr) { if(wstr.empty()){ return ""; } int size=WideCharToMultiByte(CP_UTF8,0,wstr.c_str(),-1,nullptr,0,nullptr,nullptr); std::string str(size-1,0); WideCharToMultiByte(CP_UTF8,0,wstr.c_str(),-1,&str[0],size,nullptr,nullptr); return str; } void OnAdvertisementReceived(BluetoothLEAdvertisementWatcher sender, BluetoothLEAdvertisementReceivedEventArgs args) { std::string sout=""; auto now = std::chrono::system_clock::now(); auto ms = std::chrono::duration_cast<std::chrono::milliseconds>(now.time_since_epoch()).count()%10000; std::string mac = BluetoothAddressToString(args.BluetoothAddress()); sout+="["; sout+=std::to_string(ms); sout+= "ms]"; sout+= mac; sout+= " "; std::wstring name = args.Advertisement().LocalName().c_str(); if(!name.empty()){ sout+= WStringToUtf8(name)+" "; }else{ sout+="[Empty name]"; } sout+="UUIDS: "; for(const auto& uuid : args.Advertisement().ServiceUuids()){ sout+= WStringToUtf8(winrt::to_hstring(uuid).c_str()); } std::cout<<sout<<std::endl; std::cout<<std::flush; } int main() { winrt::init_apartment(winrt::apartment_type::multi_threaded); std::cout<<"Starting BLE Scanner......"<<std::endl; g_watcher = BluetoothLEAdvertisementWatcher(); g_watcher.ScanningMode(BluetoothLEScanningMode::Active); g_watcher.Received(OnAdvertisementReceived); g_watcher.Start(); std::cout<<"Scanning.....Press Enter to stop."<<std::endl; std::cin.get(); g_watcher.Stop(); std::cout<<"Stopped."<<std::endl; return 0; }

2、编译连接

打开Developer Command Prompt for VS 2022

cl /EHsc /MD /std:c++17 /Fe:BleActive.exe main.cpp windowsapp.lib

3、运行程序

打开蓝牙,运行程序

三、Passive

1、代码

#include <iostream> #include <windows.h> #include <winrt/Windows.Foundation.h> #include <winrt/Windows.Foundation.Collections.h> #include <winrt/Windows.Devices.Bluetooth.Advertisement.h> #include <winrt/Windows.Storage.Streams.h> #include <atomic> #include <string> #include <sstream> #include <vector> #include <mutex> #include <iomanip> #include <chrono> using namespace winrt; using namespace Windows::Foundation; using namespace Windows::Devices::Bluetooth::Advertisement; using namespace Windows::Storage::Streams; BluetoothLEAdvertisementWatcher g_watcher{nullptr}; std::string BluetoothAddressToString(uint64_t address){ std::stringstream ss; ss << std::setw(2) << std::setfill('0') << std::hex << ((address >> 40) & 0xFF) << ":" << ((address >> 32) & 0xFF) << ":" << ((address >> 24) & 0xFF) << ":" << ((address >> 16) & 0xFF) << ":" << ((address >> 8) & 0xFF) << ":" << (address & 0xFF); return ss.str(); } std::string WStringToUtf8(const std::wstring& wstr) { if(wstr.empty()){ return ""; } int size=WideCharToMultiByte(CP_UTF8,0,wstr.c_str(),-1,nullptr,0,nullptr,nullptr); std::string str(size-1,0); WideCharToMultiByte(CP_UTF8,0,wstr.c_str(),-1,&str[0],size,nullptr,nullptr); return str; } void OnAdvertisementReceived(BluetoothLEAdvertisementWatcher sender, BluetoothLEAdvertisementReceivedEventArgs args) { std::string sout=""; auto now = std::chrono::system_clock::now(); auto ms = std::chrono::duration_cast<std::chrono::milliseconds>(now.time_since_epoch()).count()%10000; std::string mac = BluetoothAddressToString(args.BluetoothAddress()); sout+="["; sout+=std::to_string(ms); sout+= "ms]"; sout+= mac; sout+= " "; std::wstring name = args.Advertisement().LocalName().c_str(); if(!name.empty()){ sout+= WStringToUtf8(name)+" "; }else{ sout+="[Empty name]"; } sout+="UUIDS: "; for(const auto& uuid : args.Advertisement().ServiceUuids()){ sout+= WStringToUtf8(winrt::to_hstring(uuid).c_str()); } std::cout<<sout<<std::endl; std::cout<<std::flush; } int main() { winrt::init_apartment(winrt::apartment_type::multi_threaded); std::cout<<"Starting BLE Scanner......"<<std::endl; g_watcher = BluetoothLEAdvertisementWatcher(); g_watcher.ScanningMode(BluetoothLEScanningMode::Passive); g_watcher.Received(OnAdvertisementReceived); g_watcher.Start(); std::cout<<"Scanning.....Press Enter to stop."<<std::endl; std::cin.get(); g_watcher.Stop(); std::cout<<"Stopped."<<std::endl; return 0; }

2、编译连接

cl /EHsc /MD /std:c++17 /Fe:BlePassive.exe main.cpp windowsapp.lib

3、运行程序

四、对比运行结果

可以明显看到,Active模式下,能收到两种不同的广播报文,一条含UUID,一条含Name;而Passive模式下,只能收到一种广播报文,即只含有UUID的广播报文。

http://www.jsqmd.com/news/588136/

相关文章:

  • 支付宝消费券闲置?京顺回收助你安全高效变现 - 京顺回收
  • 2026年营销增长全景图:市场营销人员10大必备AI工具深度解析与实战指南!
  • LLM - 2026 AI 文本转可视化工具终极指南:PicDoc.ai vs Napkin.ai 及 EdrawMax、Whimsical 等 8 大神器深度对比
  • 基于西门子PLC的空压机组与风冷机组自动控制系统:“手动自动切换,三机自动控制与实时检测
  • 解释器指令入口——转发表
  • 书匠策AI:期刊论文创作的“智能导航仪”,让学术之路畅通无阻
  • 省面90 分学员复盘:杨森老师的 “神算子” 教学法,如何实现高分断层?
  • 把 Antigravity 用成一个更像 VS Code 的 AI IDE
  • 大语言模型并非所有层都必要
  • 免费电脑重启还原工具
  • 零中频接收机设计避坑指南:从IQ信号处理到链路预算,这些细节ADS仿真时千万别忽略
  • 4月3日打卡
  • 鼠标连点效率革命:MouseClick智能自动化工具全解析
  • C# ArrayList
  • 魔因漫创 Moyin Creator
  • 智慧桥梁裂缝缺陷检测识别 桥梁结构健康监测、自动化巡检、安全隐患预警桥梁裂缝识别 图像数据集第10638期
  • Cursor AI 开发环境配置:告别依赖冲突,用 Conda 虚拟环境管理你的数据科学项目
  • Serverless社区
  • DNF 下载 RPM 依赖包及忽略特定依赖的方法
  • 用lazarus封装了linux的rsync
  • 成都拉布灯箱技术白皮书:2026年户外广告新趋势解析
  • TimescaleDB实战:5分钟搞定物联网传感器数据存储与查询(附Grafana配置)
  • 2026鸿蒙应用开发Kuikly:驱动高效落地的核心实践
  • Buildroot与Qt5的X11VNC集成:解决EGLFS与XCB插件冲突的实践指南
  • 如何快速构建微信视频号直播数据管道:5大核心特性深度解析
  • ToonFlow
  • PLC控制四轴攻丝机全伺服工程案例(含接线图):附带启动停止原点定位等控制指令详解及文本屏即用程序
  • python_获取飞书审批数据
  • 可独立部署的健身饮食管理推荐:wger,Docker一键安装部署教程
  • 计算机网络 之 【TCP协议】(面向字节流、TCP异常情况、保活机制、文件与Socket的关系、网络协议栈的本质)