C# 使用 32feet.NET 连接蓝牙设备实战
在 C# 开发中连接蓝牙设备常因第三方库版本或协议参数(UUID)设置不当而报错。本文基于 32feet.NET 库,展示如何准确搜索附近蓝牙设备、解析设备唯一地址,并通过获取终端硬件特定的蓝牙服务 GUID 成功建立配对连接。
结果与目标
实现 C# 程序自动扫描附近的蓝牙设备,根据名称筛选目标模块,获取其硬件地址与正确的服务 UUID,并最终完成配对连接。
准备条件
- 环境依赖:需要一台具备蓝牙功能的电脑,且蓝牙适配器驱动正常。
- 目标设备:一个待连接的蓝牙模块(如条码扫描器),并确保已在 Windows
控制面板→设备和打印机中与当前电脑完成初始物理配对。 - NuGet 包:项目需安装
32feet.NET库。注意不要使用已过时的InTheHand.Net.Personal,新版 API 兼容性更好。
真实操作顺序
第1步:配置蓝牙客户端并启用可发现模式
目的:初始化蓝牙通信通道,确保本机蓝牙处于可被搜索状态。
入口:C# 控制台或 WinForms/WPF 项目的业务逻辑层。
动作:
- 实例化
BluetoothClient用于处理蓝牙IO。 - 获取主机蓝牙电台
BluetoothRadio.PrimaryRadio。 - 设置电台模式为
RadioMode.Connectable,允许外部设备连接。
using InTheHand.Bluetooth;
// ... 其他命名空间
public void ConnectBluetooth()
{
// 初始化蓝牙客户端
BluetoothClient client = new BluetoothClient();
// 获取本地蓝牙适配器
BluetoothRadio radio = BluetoothRadio.PrimaryRadio;
// 关键:设置为可连接模式,否则 DiscoverDevices 可能无法列出所有设备
radio.Mode = RadioMode.Connectable;
第2步:扫描设备并解析唯一标识地址(MAC)
目的:通过名称过滤找到目标设备,并提取其唯一的蓝牙地址,这是后续连接的关键凭证。
动作:
- 调用
client.DiscoverDevices()进行全量扫描(通常耗时数秒)。 - 遍历
BluetoothDeviceInfo数组,比对DeviceName。 - 将找到的设备地址赋值给
BluetoothAddress对象。
// 默认地址占位符,防止未找到设备时空引用
BluetoothAddress blueAddress = new BluetoothAddress(new byte[] { 0x8e, 0xed, 0x10, 0xa3, 0xa8, 0xaa });
// 执行扫描,超时时间默认为短时间,可根据需求调整
BluetoothDeviceInfo[] devices = client.DiscoverDevices();
// 遍历搜索结果,定位目标设备
string targetName = "BarCode Scanner HID"; // 替换为你的设备名称
foreach (var item in devices)
{
if (item.DeviceName.Equals(targetName))
{
Console.WriteLine($"找到设备: {item.DeviceName}");
Console.WriteLine($"地址: {item.DeviceAddress}");
// 获取该设备的唯一 MAC 地址
blueAddress = item.DeviceAddress;
break;
}
}
排错提示:如果找不到设备,请检查 BluetoothRadio.PrimaryRadio 是否为空,以及设备是否已成功在系统层面配对。查看地址的另一种方法是:进入 Windows 控制面板 → 查看设备和打印机 → 右键点击设备 → 属性 → 蓝牙 标签页。
第3步:构建 EndPoint 并建立连接(核心难点)
目的:指定具体的蓝牙服务协议进行握手连接。
重要修正:网络上许多示例直接使用 BluetoothService.SerialPort 枚举作为服务类型。这在很多场景下会失败,因为 SerialPort 对应的 UUID 是 Android 等移动设备的默认值,而 PC 端或特定工业蓝牙模块往往使用不同的 Service GUID。
动作:
- 获取正确的 UUID/GUID:
- 进入
控制面板→查看设备和打印机。 - 选中设备,右键选择
属性。 - 切换到
硬件选项卡,双击蓝牙HID设备(或相关蓝牙无线电服务)。 - 在属性窗口中点击
详细信息,在下拉列表中找到蓝牙服务Guid。
- 进入
- 代码连接:使用解析出的 GUID 字符串创建
BluetoothEndPoint并进行连接。
// 假设通过上述步骤查得服务的 GUID 为 "00001124-0000-1000-8000-00805f9b34fb"
Guid serviceGuid = Guid.Parse("00001124-0000-1000-8000-00805f9b34fb");
// 绑定地址和服务ID到 EndPoint
BluetoothEndPoint ep = new BluetoothEndPoint(blueAddress, serviceGuid);
try
{
// 发起配对/连接请求
client.Connect(ep);
if (client.Connected)
{
Console.WriteLine("蓝牙连接成功!");
// 此处可开始读取流 Stream
}
}
catch (Exception ex)
{
Console.WriteLine($"连接失败: {ex.Message}");
}
}
完成判断与总结
当 client.Connected 返回 true 且未抛出异常时,即表示 C# 程序已成功通过指定的蓝牙服务 GUID 与硬件设备建立了底层连接。此时即可通过 client.GetStream() 进行数据的读写操作。
本方案解决了常规教程中因 UUID 不匹配导致的连接失败问题,核心在于从操作系统层面获取终端设备具体的蓝牙服务 ID,而非盲目套用通用枚举。
以上就是C#连接蓝牙设备的详细内容,更多关于C#蓝牙通讯开发的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









