January 1, 2024
在 Windows 平台上使用蓝牙(包括传统的 SPP “串口"方式和 BLE 低功耗方式)对设备进行数据读取或写入,大致可以分成几个步骤。下面给你一个较为概括的流程介绍,帮助你对开发有一个初步的认识。
1. 设备配对与驱动层面准备
-
确认设备可以被 Windows 系统扫描到
- 对于支持传统蓝牙(SPP)方式的设备,一般情况下在"蓝牙和其他设备"设置界面可以搜索并配对成功后,Windows 会将该设备映射成一个虚拟串口(如 COM3、COM4 等)。
- 对于 BLE 设备,Windows 10 及以上版本系统本身支持 BLE,但也需要在"蓝牙和其他设备"中完成发现与配对(或在程序中使用 BLE API 搜索并连接)。
-
如果是 SPP 模式,需要确认虚拟串口号
- 一旦成功配对,系统会自动为蓝牙创建设备分配一个或多个 COM 口。可以在"设备管理器"中查看到"端口 (COM & LPT)“下多出的那个 COM 口。
- 后续在你的应用程序中,只要把这个 COM 口当作普通串口来读写即可。
-
如果是 BLE 模式,需要使用 BLE 协议访问方式
- 不会有虚拟串口号,而是通过 Windows 的 GATT API 直接与设备的服务 (Service) 和特征 (Characteristic) 进行交互。
2. SPP “串口"方式开发流程
如果决定用传统蓝牙 SPP 方式(对新手来说通常更直观):
-
在 Windows 上安装或确认已经配对好设备,拿到分配的 COM 端口号。
-
在你的应用程序中打开这个 COM 端口:
- 可以使用任何支持串口编程的语言或库,比如 C# 的 SerialPort 类,Python 的 pyserial 库,C++ 的 Win32 API 等方式。
-
发送和接收数据:
- 设备的供应商一般会告诉你他们定义的数据协议或者发送命令的格式(如果是"纯透传”,那么可能就直接把要发送的指令写到串口里,对应的数据会透传到目标硬件上)。
- 你把指令写入串口后,从串口中读回响应即可。
-
解析电表数据:
- 读回来的数据按协议或格式进行解析,比如先看协议文档中如何标识开始和结束,如何计算校验,如何区分不同数据域等。
3. BLE 低功耗方式开发流程
如果你想使用 BLE 方式,或者设备不支持 SPP,只有 BLE 透传,那么流程会有所不同:
-
在系统层面或通过程序来扫描、连接设备:
- Window 10 (UWP) 或更高版本支持 Windows.Devices.Bluetooth 命名空间下的 API,可以列举当前 BLE 设备,然后使用 BluetoothLEDevice 类进行连接。
- 也可以使用 C++ (Win32) 或其他语言(如 C# 的 .NET 6+ 结合 Windows BLE API)来进行扫描和连接。
-
枚举 GATT 服务 (Service) 和特征 (Characteristic):
- 找到设备对外暴露的对应 GATT Service UUID 和 Characteristic UUID。
- 对透传设备来说,通常会有一个自定义的 Service UUID 以及可读写的 Characteristic,用于收发数据。
-
进行数据通信:
- 在 BLE 下写数据,需要调用特征的 WriteValueAsync 或者类似写操作;读数据可以使用 ReadValueAsync 或者订阅 Notification/Indication 来异步接收数据。
- 具体的读写方式和收发一次数据的大小,需要参考设备文档(某些设备一次仅能传输 20 字节,需要分包)。
-
解析电表数据:
- 同 SPP 一样,需要按照设备的协议或透传格式来解析字节流,提取出电表所需的测量值或状态信息。
4. 一些实用建议
-
先从 SPP 入手通常更简单:
- 如果设备既支持 SPP 又支持 BLE,建议先尝试用串口读写进行"跑通”,上手快,也能方便验证设备工作正常、数据格式正确。
- 有了串口读写的经验后,再考虑 BLE 的方式。
-
搞清楚数据协议:
- 不管是 SPP 还是 BLE,本质上就是"字节流"的读写。关键是知道该发什么命令、设备会返回什么格式的数据,这部分需要参考硬件或模块的开发文档。
- 如果没有文档,就需要和硬件供应商沟通,或借助已有的软件示例来推断协议。
-
善用调试工具:
- 串口调试工具:可以先用第三方串口工具(如 SSCOM、Termite、Putty 等)做简单的读写测试,确认设备响应正确。
- BLE调试工具:可以尝试使用像 “nRF Connect for Desktop” 等应用来扫描并尝试读写特征,检验 BLE 通信是否成功。
-
选定开发语言和框架:
- C#: 在 .NET 里读写串口可以用 System.IO.Ports,BLE 则可以用 Windows.Devices.Bluetooth 下的类。
- C++: 使用 Win32 API 进行串口读写,以及 Windows BLE API(较复杂一些)。
- Python 或其他语言:Python 可以用 pyserial(串口)和一些第三方 BLE 库(如 bleak),但 BLE 部分在 Windows 下可能会依赖额外的 Bleak+WinRT 桥接,配置稍微复杂。
5. 简要总结
- 在 Windows “蓝牙和其他设备"里先配对设备,确认是否创建了虚拟串口(用于 SPP)。
- 如果使用 SPP,把它当普通串口来读写,用你熟悉的语言或库进行串口操作。
- 如果使用 BLE,需要在程序里调用相关 GATT API,找到设备和其服务特征,通过 BLE 特征读写来完成收发数据。
- 收到数据后,根据电表协议或透传协议对字节流进行解析,得到所需信息。
以上就是一个从零开始的大体思路,目的是让你对 Windows 下蓝牙读写流程有初步了解。接下来可以针对自己具体的编程环境、具体的设备协议做更深入的实现和调试。祝你开发顺利!