keer_zu 发表于 2025-5-6 00:00

Windows 下经典蓝牙(Classic Bluetooth)的完整操作方案

以下是 **Windows 下经典蓝牙(Classic Bluetooth)的完整操作方案**,涵盖扫描、配对、连接和数据传输的详细步骤,并提供多种实现方法:

---

### 一、方案概览

| **步骤**| **工具/方法**            | **关键说明**      |
| --------------- | ------------------------------ | ------------------------- |
| 1. 扫描设备   | Windows 内置功能 / Python / C# | 发现附近的经典蓝牙设备    |
| 2. 配对设备   | Windows 设置 / 编程接口      | 通过 PIN 码完成安全认证   |
| 3. 连接通信   | 虚拟串口 (SPP) / C# API      | 使用 SPP 协议进行数据传输 |
| 4. 发送接收数据 | Python 串口库 / C# SerialPort| 通过虚拟串口读写数据      |

---

### 二、具体实现方案

#### **方案1:通过 Windows 内置功能手动操作**

**适用场景**:快速测试或简单连接(如连接蓝牙耳机、ESP32 等)。

##### 步骤1:扫描并配对设备

1. **打开蓝牙设置**:
   Win + S → 搜索 **蓝牙和其他设备设置** → 打开蓝牙开关。
2. **扫描设备**:
   点击 **添加设备** → 选择 **蓝牙** → 等待设备列表出现(如 ESP32 的蓝牙名称)。
3. **输入配对码**:
   选择目标设备 → 输入默认配对码(经典蓝牙通常为 `1234` 或 `0000`)。

##### 步骤2:连接并使用虚拟串口(SPP)

1. **获取虚拟串口号**:
   配对成功后,设备会分配一个 COM 端口(如 `COM4`)。
   * 查看方法:**设备管理器 → 端口 (COM 和 LPT)**。
2. **通过串口工具通信**:
   使用 **PuTTY**、**Arduino IDE 串口监视器** 或 **Python 脚本** 打开对应 COM 端口,设置波特率(如 `115200`)即可收发数据。

---

#### **方案2:使用 Python 编程实现(需 PyBluez 库)**

**适用场景**:自动化脚本控制(需安装蓝牙库,Windows 兼容性有限)。

##### 环境准备

1. 安装 PyBluez(可能需旧版 Python 3.7):

   ```
   pip install pybluez
   ```

   \*注:PyBluez 在 Windows 10/11 上可能无法正常扫描设备,建议搭配方案1使用。\*

##### 代码示例

```
import bluetooth

# 扫描经典蓝牙设备
def scan_devices():
    devices = bluetooth.discover_devices(lookup_names=True)
    print("Found devices:")
    for addr, name in devices:
      print(f"{name} - {addr}")

# 配对设备(需系统支持)
def pair_device(address):
    # Windows 下 PyBluez 无法直接配对,需调用系统功能
    import subprocess
    subprocess.run(["btpair", "-p", address])# 模拟命令行配对(非实际代码)

# 通过 RFCOMM 连接并发送数据
def send_data(address, port=1):
    sock = bluetooth.BluetoothSocket(bluetooth.RFCOMM)
    sock.connect((address, port))
    sock.send("Hello from PC!")
    response = sock.recv(1024)
    print(f"Received: {response}")
    sock.close()

if __name__ == "__main__":
    scan_devices()
    # 手动输入目标设备地址
    target_address = "00:11:22:33:44:55"
    pair_device(target_address)# 需配合Windows API
    send_data(target_address)
```

---

#### **方案3:使用 C# 编程实现(调用 Windows API)**

**适用场景**:稳定可靠的桌面应用程序开发。

##### 步骤1:引用 Windows 蓝牙 API

1. 使用 **32feet.NET** 库(经典蓝牙开发库):

   ```
   Install-Package InTheHand.Net.Bluetooth -Version 4.0.5
   ```

##### 代码示例

```
using InTheHand.Net;
using InTheHand.Net.Bluetooth;
using InTheHand.Net.Sockets;
using System.IO;

public class BluetoothManager
{
    // 扫描设备
    public void ScanDevices()
    {
      BluetoothClient client = new BluetoothClient();
      BluetoothDeviceInfo[] devices = client.DiscoverDevices();
      foreach (var device in devices)
      {
            Console.WriteLine($"Device: {device.DeviceName} - {device.DeviceAddress}");
      }
    }

    // 配对设备
    public bool PairDevice(BluetoothAddress address)
    {
      BluetoothSecurity.PairRequest(address, "1234"); // 使用默认PIN码
      return BluetoothSecurity.IsPaired(address);
    }

    // 连接并发送数据
    public void ConnectAndSend(BluetoothAddress address)
    {
      BluetoothClient client = new BluetoothClient();
      BluetoothEndPoint ep = new BluetoothEndPoint(address, BluetoothService.SerialPort);
      client.Connect(ep);
      Stream stream = client.GetStream();
      
      // 发送数据
      byte[] data = System.Text.Encoding.ASCII.GetBytes("Hello from PC!");
      stream.Write(data, 0, data.Length);
      
      // 接收数据
      byte[] buffer = new byte;
      int bytesRead = stream.Read(buffer, 0, buffer.Length);
      Console.WriteLine($"Received: {System.Text.Encoding.ASCII.GetString(buffer, 0, bytesRead)}");
      
      stream.Close();
      client.Close();
    }
}
```

---

### 三、数据传输优化技巧

1. **虚拟串口(SPP)稳定性**:

   * 使用 **校验位(Parity)** 和 **流控制(Flow Control)** 减少数据丢失。
   * 设置合理的波特率(如 `115200` 或 `9600`)。
2. **错误处理**:

   ```
   try
   {
       // 蓝牙操作代码
   }
   catch (BluetoothException ex)
   {
       Console.WriteLine($"蓝牙错误: {ex.Message}");
   }
   ```
3. **多线程通信**:
   在 GUI 应用中,使用后台线程 (`BackgroundWorker` 或 `Task`) 处理蓝牙通信,避免界面卡顿。

---

### 四、常见问题解决

1. **扫描不到设备**:
   * 确保设备处于 **可发现模式**(如 ESP32 需执行 `SerialBT.begin("DeviceName")`)。
   * 关闭防火墙或安全软件临时测试。
2. **连接失败**:
   * 确认设备支持的 **服务协议**(如 SPP 对应的 UUID `00001101-0000-1000-8000-00805F9B34FB`)。
   * 重启蓝牙服务:Win + R → `services.msc` → 重启 `Bluetooth Support Service`。
3. **数据传输延迟**:
   * 减少单次发送数据量(如分片发送 512 字节)。
   * 使用 `Thread.Sleep(10)` 在发送间隙插入短暂延迟。

---

### 五、方案对比

| **方法**   | **优点**             | **缺点**               |
| ---------------- | -------------------------- | ------------------------------ |
| Windows 手动操作 | 无需编程,适合快速测试   | 无法自动化,功能受限         |
| Python + PyBluez | 脚本灵活,适合简单控制   | Windows 兼容性差,API 功能有限 |
| C# + 32feet.NET| 功能完整,适合开发稳定应用 | 需要 .NET 环境,学习成本略高   |

---

### 六、最终推荐

* **快速验证**:使用 **方案1(手动操作)** 结合串口工具。
* **自动化控制**:选择 **方案3(C# + 32feet.NET)** 开发稳定应用。
* **ESP32 示例代码**:确保 ESP32 运行经典蓝牙 SPP 服务端代码(参考前文示例)。
页: [1]
查看完整版本: Windows 下经典蓝牙(Classic Bluetooth)的完整操作方案