一、系统架构设计
┌─────────────────────────────────────────────────────────────┐
│ Windows 蓝牙管理系统 │
├─────────────────────────────────────────────────────────────┤
│ 本地蓝牙管理 │ 远程设备扫描 │ 设备连接管理 │ 服务管理 │
│ │ │ │ │
│ • 枚举本地 │ • 发现设备 │ • 配对连接 │ • 服务枚举 │
│ 蓝牙适配器 │ • 获取设备信息 │ • 断开连接 │ • 服务绑定 │
│ • 获取适配器 │ • 过滤设备 │ • 连接状态 │ • 数据传输 │
│ 信息 │ • 实时扫描 │ 监控 │ │
└─────────────────────────────────────────────────────────────┘
二、源代码实现
2.1 头文件与库依赖 (BluetoothManager.h)
#pragma once#include <windows.h>
#include <winsock2.h>
#include <ws2bth.h>
#include <bluetoothapis.h>
#include <vector>
#include <string>
#include <memory>
#include <functional>
#include <atomic>#pragma comment(lib, "Ws2_32.lib")
#pragma comment(lib, "Bthprops.lib")// 蓝牙设备信息结构体
struct BluetoothDeviceInfo {BLUETOOTH_ADDRESS address;std::wstring name;std::wstring deviceClass;DWORD classOfDevice;BOOL authenticated;BOOL connected;BOOL remembered;SYSTEMTIME lastSeen;std::vector<GUID> services;
};// 蓝牙适配器信息结构体
struct BluetoothAdapterInfo {HANDLE hRadio;BLUETOOTH_RADIO_INFO radioInfo;BLUETOOTH_DEVICE_INFO deviceInfo;BOOL isDefault;
};// 连接状态枚举
enum class ConnectionState {Disconnected,Connecting,Connected,Pairing,Failed
};// 蓝牙管理器类
class BluetoothManager {
public:BluetoothManager();~BluetoothManager();// 本地蓝牙管理BOOL EnumerateLocalAdapters(std::vector<BluetoothAdapterInfo>& adapters);BOOL GetAdapterInfo(HANDLE hRadio, BLUETOOTH_RADIO_INFO& info);BOOL IsBluetoothEnabled();BOOL EnableBluetooth(BOOL enable);// 远程设备扫描BOOL StartDeviceDiscovery(std::function<void(const BluetoothDeviceInfo&)> callback);BOOL StopDeviceDiscovery();BOOL EnumerateRemoteDevices(std::vector<BluetoothDeviceInfo>& devices);BOOL RefreshDeviceList();// 设备连接管理BOOL ConnectToDevice(const BLUETOOTH_ADDRESS& address, const GUID& serviceGuid);BOOL DisconnectFromDevice(const BLUETOOTH_ADDRESS& address);BOOL PairDevice(const BLUETOOTH_ADDRESS& address);BOOL UnpairDevice(const BLUETOOTH_ADDRESS& address);ConnectionState GetConnectionState(const BLUETOOTH_ADDRESS& address);// 服务管理BOOL EnumerateServices(const BLUETOOTH_ADDRESS& address, std::vector<GUID>& services);BOOL RegisterService(const GUID& serviceGuid, LPCWSTR serviceName);BOOL UnregisterService(const GUID& serviceGuid);// 设备信息查询BOOL GetDeviceInfo(const BLUETOOTH_ADDRESS& address, BLUETOOTH_DEVICE_INFO& info);std::wstring GetDeviceName(const BLUETOOTH_ADDRESS& address);BOOL IsDeviceConnected(const BLUETOOTH_ADDRESS& address);BOOL IsDeviceAuthenticated(const BLUETOOTH_ADDRESS& address);private:// Winsock 初始化BOOL InitializeWinsock();void CleanupWinsock();// 蓝牙API辅助函数static std::wstring ClassOfDeviceToString(DWORD cod);static std::wstring AddressToString(const BLUETOOTH_ADDRESS& address);static BOOL StringToAddress(const std::wstring& str, BLUETOOTH_ADDRESS& address);private:WSADATA m_wsaData;BOOL m_wsaInitialized;std::vector<BluetoothAdapterInfo> m_adapters;std::vector<BluetoothDeviceInfo> m_devices;std::atomic<BOOL> m_discoveryActive;HBLUETOOTH_DEVICE_FIND m_deviceFindHandle;
};
2.2 核心实现代码 (BluetoothManager.cpp)
#include "BluetoothManager.h"
#include <sstream>
#include <iomanip>// 常见蓝牙服务UUID
namespace BluetoothServices {const GUID SerialPort = {0x00001101, 0x0000, 0x1000, {0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB}};const GUID GenericAccess = {0x00001800, 0x0000, 0x1000, {0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB}};const GUID DeviceInformation = {0x0000180A, 0x0000, 0x1000, {0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB}};const GUID BatteryService = {0x0000180F, 0x0000, 0x1000, {0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB}};
}// 构造函数
BluetoothManager::BluetoothManager() : m_wsaInitialized(FALSE), m_discoveryActive(FALSE), m_deviceFindHandle(nullptr) {InitializeWinsock();
}// 析构函数
BluetoothManager::~BluetoothManager() {if (m_discoveryActive) {StopDeviceDiscovery();}CleanupWinsock();
}// 初始化Winsock
BOOL BluetoothManager::InitializeWinsock() {if (m_wsaInitialized) return TRUE;int result = WSAStartup(MAKEWORD(2, 2), &m_wsaData);if (result != 0) {return FALSE;}m_wsaInitialized = TRUE;return TRUE;
}// 清理Winsock
void BluetoothManager::CleanupWinsock() {if (m_wsaInitialized) {WSACleanup();m_wsaInitialized = FALSE;}
}// 枚举本地蓝牙适配器
BOOL BluetoothManager::EnumerateLocalAdapters(std::vector<BluetoothAdapterInfo>& adapters) {adapters.clear();BLUETOOTH_FIND_RADIO_PARAMS params = { sizeof(BLUETOOTH_FIND_RADIO_PARAMS) };HBLUETOOTH_RADIO_FIND hFind = BluetoothFindFirstRadio(¶ms, &adapters);if (hFind == nullptr) {return FALSE;}do {BluetoothAdapterInfo adapter;adapter.hRadio = hFind->hRadio;// 获取无线电信息if (GetAdapterInfo(adapter.hRadio, adapter.radioInfo)) {// 获取设备信息adapter.deviceInfo.dwSize = sizeof(BLUETOOTH_DEVICE_INFO);if (BluetoothGetDeviceInfo(adapter.hRadio, &adapter.deviceInfo) == ERROR_SUCCESS) {adapter.isDefault = (adapters.size() == 0);adapters.push_back(adapter);}}// 关闭无线电句柄CloseHandle(hFind->hRadio);} while (BluetoothFindNextRadio(hFind, &adapters));BluetoothFindRadioClose(hFind);m_adapters = adapters;return adapters.size() > 0;
}// 获取适配器信息
BOOL BluetoothManager::GetAdapterInfo(HANDLE hRadio, BLUETOOTH_RADIO_INFO& info) {info.dwSize = sizeof(BLUETOOTH_RADIO_INFO);DWORD result = BluetoothGetRadioInfo(hRadio, &info);return (result == ERROR_SUCCESS);
}// 检查蓝牙是否启用
BOOL BluetoothManager::IsBluetoothEnabled() {std::vector<BluetoothAdapterInfo> adapters;if (EnumerateLocalAdapters(adapters)) {for (const auto& adapter : adapters) {if (adapter.radioInfo.dwFlags & BLUETOOTH_RADIO_INFO_FLAGS_ENABLED) {return TRUE;}}}return FALSE;
}// 启用/禁用蓝牙
BOOL BluetoothManager::EnableBluetooth(BOOL enable) {// 注意:这需要管理员权限std::vector<BluetoothAdapterInfo> adapters;if (EnumerateLocalAdapters(adapters)) {for (const auto& adapter : adapters) {DWORD flags = enable ? (adapter.radioInfo.dwFlags | BLUETOOTH_RADIO_INFO_FLAGS_ENABLED) :(adapter.radioInfo.dwFlags & ~BLUETOOTH_RADIO_INFO_FLAGS_ENABLED);// 使用BluetoothSetRadioMode设置模式DWORD mode = enable ? BLUETOOTH_RADIO_MODE_DISCOVERABLE : BLUETOOTH_RADIO_MODE_POWER_OFF;if (BluetoothSetRadioMode(adapter.hRadio, mode) != ERROR_SUCCESS) {return FALSE;}}return TRUE;}return FALSE;
}// 开始设备扫描
BOOL BluetoothManager::StartDeviceDiscovery(std::function<void(const BluetoothDeviceInfo&)> callback) {if (m_discoveryActive) {return FALSE;}m_discoveryActive = TRUE;// 在新线程中执行扫描std::thread( {BLUETOOTH_DEVICE_SEARCH_PARAMS searchParams = {0};BLUETOOTH_DEVICE_INFO deviceInfo = {0};searchParams.dwSize = sizeof(BLUETOOTH_DEVICE_SEARCH_PARAMS);searchParams.fReturnAuthenticated = TRUE;searchParams.fReturnRemembered = TRUE;searchParams.fReturnUnknown = TRUE;searchParams.fReturnConnected = TRUE;searchParams.fIssueInquiry = TRUE;searchParams.cTimeoutMultiplier = 10; // 10秒超时deviceInfo.dwSize = sizeof(BLUETOOTH_DEVICE_INFO);m_deviceFindHandle = BluetoothFindFirstDevice(&searchParams, &deviceInfo);if (m_deviceFindHandle == nullptr) {m_discoveryActive = FALSE;return;}do {if (!m_discoveryActive) break;BluetoothDeviceInfo devInfo;devInfo.address = deviceInfo.Address;devInfo.name = deviceInfo.szName;devInfo.classOfDevice = deviceInfo.ulClassofDevice;devInfo.deviceClass = ClassOfDeviceToString(deviceInfo.ulClassofDevice);devInfo.authenticated = deviceInfo.fAuthenticated;devInfo.connected = deviceInfo.fConnected;devInfo.remembered = deviceInfo.fRemembered;devInfo.lastSeen = deviceInfo.stLastSeen;// 获取设备服务EnumerateServices(devInfo.address, devInfo.services);callback(devInfo);} while (m_discoveryActive && BluetoothFindNextDevice(m_deviceFindHandle, &deviceInfo));BluetoothFindDeviceClose(m_deviceFindHandle);m_deviceFindHandle = nullptr;m_discoveryActive = FALSE;}).detach();return TRUE;
}// 停止设备扫描
BOOL BluetoothManager::StopDeviceDiscovery() {if (m_discoveryActive) {m_discoveryActive = FALSE;if (m_deviceFindHandle) {BluetoothFindDeviceClose(m_deviceFindHandle);m_deviceFindHandle = nullptr;}return TRUE;}return FALSE;
}// 枚举远程设备
BOOL BluetoothManager::EnumerateRemoteDevices(std::vector<BluetoothDeviceInfo>& devices) {devices.clear();BLUETOOTH_DEVICE_SEARCH_PARAMS searchParams = {0};BLUETOOTH_DEVICE_INFO deviceInfo = {0};searchParams.dwSize = sizeof(BLUETOOTH_DEVICE_SEARCH_PARAMS);searchParams.fReturnAuthenticated = TRUE;searchParams.fReturnRemembered = TRUE;searchParams.fReturnUnknown = TRUE;searchParams.fReturnConnected = TRUE;searchParams.fIssueInquiry = TRUE;searchParams.cTimeoutMultiplier = 10;deviceInfo.dwSize = sizeof(BLUETOOTH_DEVICE_INFO);HBLUETOOTH_DEVICE_FIND hFind = BluetoothFindFirstDevice(&searchParams, &deviceInfo);if (hFind == nullptr) {return FALSE;}do {BluetoothDeviceInfo devInfo;devInfo.address = deviceInfo.Address;devInfo.name = deviceInfo.szName;devInfo.classOfDevice = deviceInfo.ulClassofDevice;devInfo.deviceClass = ClassOfDeviceToString(deviceInfo.ulClassofDevice);devInfo.authenticated = deviceInfo.fAuthenticated;devInfo.connected = deviceInfo.fConnected;devInfo.remembered = deviceInfo.fRemembered;devInfo.lastSeen = deviceInfo.stLastSeen;// 获取设备服务EnumerateServices(devInfo.address, devInfo.services);devices.push_back(devInfo);} while (BluetoothFindNextDevice(hFind, &deviceInfo));BluetoothFindDeviceClose(hFind);m_devices = devices;return devices.size() > 0;
}// 刷新设备列表
BOOL BluetoothManager::RefreshDeviceList() {return EnumerateRemoteDevices(m_devices);
}// 连接到设备
BOOL BluetoothManager::ConnectToDevice(const BLUETOOTH_ADDRESS& address, const GUID& serviceGuid) {// 首先检查是否已配对if (!IsDeviceAuthenticated(address)) {if (!PairDevice(address)) {return FALSE;}}// 获取设备信息BLUETOOTH_DEVICE_INFO deviceInfo = {0};deviceInfo.dwSize = sizeof(BLUETOOTH_DEVICE_INFO);deviceInfo.Address = address;// 设置服务状态为启用DWORD result = BluetoothSetServiceState(nullptr, &deviceInfo, (LPGUID)&serviceGuid, BLUETOOTH_SERVICE_ENABLE);return (result == ERROR_SUCCESS);
}// 断开设备连接
BOOL BluetoothManager::DisconnectFromDevice(const BLUETOOTH_ADDRESS& address) {BLUETOOTH_DEVICE_INFO deviceInfo = {0};deviceInfo.dwSize = sizeof(BLUETOOTH_DEVICE_INFO);deviceInfo.Address = address;// 禁用所有服务std::vector<GUID> services;if (EnumerateServices(address, services)) {for (const auto& service : services) {BluetoothSetServiceState(nullptr, &deviceInfo, (LPGUID)&service, BLUETOOTH_SERVICE_DISABLE);}}return TRUE;
}// 配对设备
BOOL BluetoothManager::PairDevice(const BLUETOOTH_ADDRESS& address) {BLUETOOTH_DEVICE_INFO deviceInfo = {0};deviceInfo.dwSize = sizeof(BLUETOOTH_DEVICE_INFO);deviceInfo.Address = address;DWORD result = BluetoothAuthenticateDevice(nullptr, nullptr, &deviceInfo, nullptr);return (result == ERROR_SUCCESS);
}// 取消配对
BOOL BluetoothManager::UnpairDevice(const BLUETOOTH_ADDRESS& address) {BLUETOOTH_DEVICE_INFO deviceInfo = {0};deviceInfo.dwSize = sizeof(BLUETOOTH_DEVICE_INFO);deviceInfo.Address = address;DWORD result = BluetoothRemoveDevice(&address);return (result == ERROR_SUCCESS);
}// 获取连接状态
ConnectionState BluetoothManager::GetConnectionState(const BLUETOOTH_ADDRESS& address) {BLUETOOTH_DEVICE_INFO deviceInfo;if (GetDeviceInfo(address, deviceInfo)) {if (deviceInfo.fConnected) {return ConnectionState::Connected;} else if (deviceInfo.fAuthenticated) {return ConnectionState::Disconnected;} else {return ConnectionState::Failed;}}return ConnectionState::Failed;
}// 枚举设备服务
BOOL BluetoothManager::EnumerateServices(const BLUETOOTH_ADDRESS& address, std::vector<GUID>& services) {services.clear();BLUETOOTH_DEVICE_INFO deviceInfo = {0};deviceInfo.dwSize = sizeof(BLUETOOTH_DEVICE_INFO);deviceInfo.Address = address;DWORD serviceCount = 0;DWORD result = BluetoothEnumerateInstalledServices(nullptr, &deviceInfo, &serviceCount, nullptr);if (result == ERROR_SUCCESS && serviceCount > 0) {services.resize(serviceCount);result = BluetoothEnumerateInstalledServices(nullptr, &deviceInfo, &serviceCount, services.data());return (result == ERROR_SUCCESS);}return FALSE;
}// 获取设备信息
BOOL BluetoothManager::GetDeviceInfo(const BLUETOOTH_ADDRESS& address, BLUETOOTH_DEVICE_INFO& info) {info.dwSize = sizeof(BLUETOOTH_DEVICE_INFO);info.Address = address;DWORD result = BluetoothGetDeviceInfo(nullptr, &info);return (result == ERROR_SUCCESS);
}// 获取设备名称
std::wstring BluetoothManager::GetDeviceName(const BLUETOOTH_ADDRESS& address) {BLUETOOTH_DEVICE_INFO info;if (GetDeviceInfo(address, info)) {return info.szName;}return L"Unknown Device";
}// 检查设备是否已连接
BOOL BluetoothManager::IsDeviceConnected(const BLUETOOTH_ADDRESS& address) {BLUETOOTH_DEVICE_INFO info;if (GetDeviceInfo(address, info)) {return info.fConnected;}return FALSE;
}// 检查设备是否已认证
BOOL BluetoothManager::IsDeviceAuthenticated(const BLUETOOTH_ADDRESS& address) {BLUETOOTH_DEVICE_INFO info;if (GetDeviceInfo(address, info)) {return info.fAuthenticated;}return FALSE;
}// 设备类别转换为字符串
std::wstring BluetoothManager::ClassOfDeviceToString(DWORD cod) {std::wstringstream ss;// 主要设备类别DWORD majorClass = (cod & 0x1F00) >> 8;switch (majorClass) {case 0x01: ss << L"Computer"; break;case 0x02: ss << L"Phone"; break;case 0x03: ss << L"LAN/Network Access Point"; break;case 0x04: ss << L"Audio/Video"; break;case 0x05: ss << L"Peripheral"; break;case 0x06: ss << L"Imaging"; break;case 0x07: ss << L"Wearable"; break;case 0x08: ss << L"Toy"; break;case 0x09: ss << L"Health"; break;default: ss << L"Unknown"; break;}// 次要设备类别DWORD minorClass = (cod & 0xFC) >> 2;if (majorClass == 0x02) { // Phoneswitch (minorClass) {case 0x01: ss << L" Cellular"; break;case 0x02: ss << L" Cordless"; break;case 0x03: ss << L" Smartphone"; break;case 0x04: ss << L" Modem"; break;case 0x05: ss << L" ISDN"; break;}}return ss.str();
}// 地址转换为字符串
std::wstring BluetoothManager::AddressToString(const BLUETOOTH_ADDRESS& address) {std::wstringstream ss;ss << std::hex << std::uppercase << std::setfill(L'0')<< std::setw(2) << (int)address.rgBytes[5] << L":"<< std::setw(2) << (int)address.rgBytes[4] << L":"<< std::setw(2) << (int)address.rgBytes[3] << L":"<< std::setw(2) << (int)address.rgBytes[2] << L":"<< std::setw(2) << (int)address.rgBytes[1] << L":"<< std::setw(2) << (int)address.rgBytes[0];return ss.str();
}// 字符串转换为地址
BOOL BluetoothManager::StringToAddress(const std::wstring& str, BLUETOOTH_ADDRESS& address) {if (str.length() != 17) return FALSE;int values[6];swscanf_s(str.c_str(), L"%02x:%02x:%02x:%02x:%02x:%02x",&values[0], &values[1], &values[2], &values[3], &values[4], &values[5]);for (int i = 0; i < 6; i++) {address.rgBytes[i] = (BYTE)values[5-i];}return TRUE;
}
2.3 主程序示例 (Main.cpp)
#include "BluetoothManager.h"
#include <iostream>
#include <conio.h>using namespace std;// 显示设备信息
void DisplayDeviceInfo(const BluetoothDeviceInfo& device) {wcout << L"=========================================" << endl;wcout << L"设备名称: " << device.name << endl;wcout << L"设备地址: ";// 显示地址for (int i = 5; i >= 0; i--) {wprintf(L"%02X", device.address.rgBytes[i]);if (i > 0) wcout << L":";}wcout << endl;wcout << L"设备类别: " << device.deviceClass << endl;wcout << L"已认证: " << (device.authenticated ? L"是" : L"否") << endl;wcout << L"已连接: " << (device.connected ? L"是" : L"否") << endl;wcout << L"已记住: " << (device.remembered ? L"是" : L"否") << endl;if (device.services.size() > 0) {wcout << L"支持的服务 (" << device.services.size() << L"):" << endl;for (size_t i = 0; i < device.services.size(); i++) {wcout << L" Service " << i+1 << L": ";// 检查是否是常见服务if (IsEqualGUID(device.services[i], BluetoothServices::SerialPort)) {wcout << L"串口服务";} else if (IsEqualGUID(device.services[i], BluetoothServices::GenericAccess)) {wcout << L"通用访问服务";} else if (IsEqualGUID(device.services[i], BluetoothServices::DeviceInformation)) {wcout << L"设备信息服务";} else {wcout << L"未知服务";}wcout << endl;}}wcout << endl;
}// 显示本地适配器信息
void DisplayAdapterInfo(const BluetoothAdapterInfo& adapter) {wcout << L"=========================================" << endl;wcout << L"蓝牙适配器: " << adapter.radioInfo.szName << endl;wcout << L"制造商: " << adapter.radioInfo.szManufacturer << endl;wcout << L"版本: " << adapter.radioInfo.lmpVersion << L"." << adapter.radioInfo.lmpSubversion << endl;wcout << L"地址: ";for (int i = 5; i >= 0; i--) {wprintf(L"%02X", adapter.radioInfo.address.rgBytes[i]);if (i > 0) wcout << L":";}wcout << endl;wcout << L"状态: " << (adapter.radioInfo.dwFlags & BLUETOOTH_RADIO_INFO_FLAGS_ENABLED ? L"启用" : L"禁用") << endl;wcout << L"默认适配器: " << (adapter.isDefault ? L"是" : L"否") << endl;wcout << endl;
}int main() {setlocale(LC_ALL, ""); // 设置本地化以支持中文wcout << L"Windows 蓝牙设备管理器" << endl;wcout << L"==============================" << endl << endl;BluetoothManager btManager;// 1. 枚举本地蓝牙适配器wcout << L"1. 枚举本地蓝牙适配器..." << endl;vector<BluetoothAdapterInfo> adapters;if (btManager.EnumerateLocalAdapters(adapters)) {wcout << L"找到 " << adapters.size() << L" 个蓝牙适配器:" << endl;for (const auto& adapter : adapters) {DisplayAdapterInfo(adapter);}} else {wcout << L"未找到蓝牙适配器!" << endl;return 1;}// 2. 检查蓝牙状态wcout << L"2. 检查蓝牙状态..." << endl;if (btManager.IsBluetoothEnabled()) {wcout << L"蓝牙已启用" << endl;} else {wcout << L"蓝牙未启用,正在尝试启用..." << endl;if (btManager.EnableBluetooth(TRUE)) {wcout << L"蓝牙已启用" << endl;} else {wcout << L"无法启用蓝牙!" << endl;}}// 3. 扫描远程设备wcout << L"\n3. 扫描远程蓝牙设备 (按任意键停止扫描)..." << endl;atomic<bool> scanCompleted(false);btManager.StartDeviceDiscovery(const BluetoothDeviceInfo& device {if (!scanCompleted) {DisplayDeviceInfo(device);}});// 等待用户按键_getch();btManager.StopDeviceDiscovery();scanCompleted = true;// 4. 枚举所有远程设备wcout << L"\n4. 已发现的设备列表:" << endl;vector<BluetoothDeviceInfo> devices;if (btManager.EnumerateRemoteDevices(devices)) {wcout << L"找到 " << devices.size() << L" 个远程设备:" << endl;for (size_t i = 0; i < devices.size(); i++) {wcout << i+1 << L". ";DisplayDeviceInfo(devices[i]);}} else {wcout << L"未发现远程设备!" << endl;}// 5. 连接设备示例if (devices.size() > 0) {wcout << L"\n5. 连接设备示例:" << endl;wcout << L"选择要连接的设备 (1-" << devices.size() << L"): ";int choice;wcin >> choice;if (choice >= 1 && choice <= (int)devices.size()) {const BluetoothDeviceInfo& selectedDevice = devices[choice-1];wcout << L"正在连接设备: " << selectedDevice.name << L"..." << endl;// 连接到串口服务if (btManager.ConnectToDevice(selectedDevice.address, BluetoothServices::SerialPort)) {wcout << L"连接成功!" << endl;// 检查连接状态ConnectionState state = btManager.GetConnectionState(selectedDevice.address);wcout << L"连接状态: " << (state == ConnectionState::Connected ? L"已连接" : L"未连接") << endl;// 断开连接wcout << L"按任意键断开连接..." << endl;_getch();btManager.DisconnectFromDevice(selectedDevice.address);wcout << L"已断开连接" << endl;} else {wcout << L"连接失败!" << endl;}}}wcout << L"\n程序结束。" << endl;return 0;
}
参考代码 Windows枚举本地蓝牙设备 www.youwenfan.com/contentcnu/60491.html
三、Visual Studio 项目配置
3.1 项目属性设置
1. 右键项目 -> 属性
2. 配置属性 -> C/C++- 常规 -> 附加包含目录: 添加Windows SDK头文件路径- 代码生成 -> 运行库: 多线程 (/MT) 或 多线程DLL (/MD)
3. 配置属性 -> 链接器- 输入 -> 附加依赖项: 添加 Ws2_32.lib; Bthprops.lib;- 系统 -> 子系统: 控制台 (/SUBSYSTEM:CONSOLE)
3.2 编译注意事项
- 管理员权限: 某些蓝牙操作需要管理员权限,请右键"以管理员身份运行"Visual Studio
- Windows SDK: 确保安装了Windows SDK
- Unicode设置: 项目使用Unicode字符集,确保字符串处理正确
四、功能扩展建议
4.1 可以添加的功能
- 设备过滤: 按设备类别过滤显示
- 自动重连: 检测断开后自动重连
- 数据传输: 实现串口数据收发
- GUI界面: 使用Qt或MFC创建图形界面
- 设备缓存: 保存已配对设备信息
- RSSI监测: 显示信号强度
4.2 常见问题解决
| 问题 | 解决方案 |
|---|---|
| 无法发现设备 | 确保蓝牙已启用,设备处于可发现模式 |
| 连接失败 | 检查设备是否已配对,服务是否支持 |
| 权限不足 | 以管理员身份运行程序 |
| 编译错误 | 检查Windows SDK版本,链接库是否正确 |
