C# 使用 32feet.NET 连接蓝牙设备实战

清欢
清欢
发布时间:2026-10-15 | 3人浏览过
原创

在 C# 开发中连接蓝牙设备常因第三方库版本或协议参数(UUID)设置不当而报错。本文基于 32feet.NET 库,展示如何准确搜索附近蓝牙设备、解析设备唯一地址,并通过获取终端硬件特定的蓝牙服务 GUID 成功建立配对连接。

结果与目标

实现 C# 程序自动扫描附近的蓝牙设备,根据名称筛选目标模块,获取其硬件地址与正确的服务 UUID,并最终完成配对连接。

准备条件

  1. 环境依赖:需要一台具备蓝牙功能的电脑,且蓝牙适配器驱动正常。
  2. 目标设备:一个待连接的蓝牙模块(如条码扫描器),并确保已在 Windows 控制面板 → 设备和打印机 中与当前电脑完成初始物理配对。
  3. 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。

动作:

  1. 获取正确的 UUID/GUID:
    • 进入 控制面板 → 查看设备和打印机。
    • 选中设备,右键选择 属性。
    • 切换到 硬件 选项卡,双击 蓝牙HID设备(或相关蓝牙无线电服务)。
    • 在属性窗口中点击 详细信息,在下拉列表中找到 蓝牙服务Guid。
  2. 代码连接:使用解析出的 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#蓝牙通讯开发的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表