Visual Studio C++ MFC项目枚举连接Bluetooth LE设备咨询
完全存在可在纯C++ MFC项目中直接调用的Windows Bluetooth LE API,不需要强制依赖C++/WinRT语言投影或XAML框架,你完全可以在现有VS2017 MFC工程里直接集成BLE枚举、连接能力。
可用的两类原生API方案
WinRT COM原生接口方案(推荐,兼容性最好)
你搜到的所有C++/WinRT封装的BLE能力,底层都是标准Windows Runtime COM接口,纯C可以直接调用这些COM接口,不需要引入XAML,也不需要强制使用C/WinRT语法。核心用到的接口全部随Windows 10 SDK提供,VS2017安装对应版本Win10 SDK后即可直接引入头文件调用:- 用
BluetoothLEAdvertisementWatcher接口扫描附近广播的BLE设备 - 用
BluetoothLEDevice接口与目标设备建立连接 - 用
GattDeviceService、GattCharacteristic接口实现GATT服务遍历、特征值读写、订阅通知等后续操作
这套API从Windows 8.1开始就支持,不需要设备提前配对,扫描到广播即可发起连接。
- 用
传统Win32 BLE API方案
从Windows 10 1709版本开始,微软在传统Win32蓝牙API集合中新增了BLE相关函数,全部是标准C风格导出函数,连COM初始化都不需要,和你之前用的Bluetooth Classic API调用方式一致,核心函数包括BluetoothLEFindFirstDevice、BluetoothGATTGetServices、BluetoothGATTGetCharacteristics等,适合快速对接已有经典蓝牙的代码逻辑。注意这套API在早期版本中要求设备必须提前完成系统配对,Windows 10 1809之后才支持未配对设备连接。
常见误区说明
网上检索到的C操作BLE的示例大多绑定C/WinRT+XAML,是因为这类示例大多基于UWP项目模板编写,模板默认自带XAML和C++/WinRT依赖,并非BLE API本身强依赖这两个组件。如果你觉得手动编写COM调用逻辑太繁琐,也可以在MFC项目中单独引入C++/WinRT头文件,只使用其蓝牙相关的逻辑封装,不需要改动现有MFC界面代码,也不需要引入XAML相关的任何依赖。
VS2017 MFC项目接入注意事项
- 项目属性中目标平台SDK版本选择10.0.15063(Windows 10 1703)及以上即可,不需要升级VS版本
- 使用WinRT COM接口方案时,在应用初始化阶段调用
RoInitialize(RO_INIT_MULTITHREADED)完成WinRT环境初始化即可,MFC本身的消息泵可以正常承载BLE接口的事件回调,不需要额外搭建独立消息循环 - 注意所有BLE操作不要放在UI主线程做长时间阻塞,避免MFC界面假死,扫描、连接逻辑建议放到独立工作线程执行
内容的提问来源于stack exchange,提问作者ehardin

