一、开源项目

1.PC端的蓝牙通信开源项目不多,一些项目没有文档。个别现成的蓝牙桌面工具集成起来比较麻烦。

2.最终使用的是一款开源的C#实现的低功耗蓝牙控制台工具:BLEConsole(要求:Windows 10, BT 4.0 adapter)

二、实现思路

Step 1:蓝牙通信概念

  1. 首先要了解到低功耗蓝牙设备之间通信方式:都是基于服务(Service)和特性(Characteristic)。一个蓝牙设备可包含多个服务,一个服务可包含多个特性。每一个服务或者特性都有一个UUID。

  2. 蓝牙的数据交互都是基于一个个特性进行的,特性下的属性(Property)有五种,分别是Read,Write,Write WithOutRespons,Notify,Indication。UUID和服务以及特性名称是服务端那边定义的,蓝牙连接成功之后可以直接获取到UUID和名称进行相应操作。

Step 2:文档与工具使用

  1. BLEConsole有比较清晰的命令行使用文档,先将这个工具使用熟练,使用ls命令可以列出蓝牙设备列表,使用open命令可以通过蓝牙设备名称/地址进行连接等等。

  2. 这里我们要实现实时数据交互,发送一条消息,立刻接收到返回数据。这里用到的是特性中的Write和Notify,分用于主机写入数据以及从机通知主机,当我用Write发送一条指令后,需要先订阅属性为Notify的特性,订阅操作这里使用的是subs命令,只要从机发数据给主机,主机就会接收到,如此就实现了双向的实时收发。

Step 3:代码实现

  1. BLEConsole与ESP32蓝牙通信收发没有问题后,就可以将BLEConsole的代码进行裁剪集成了,封装成SDK或者直接使用。

  2. 主要方法:搜索蓝牙设备列表,连接断开设备,选择当前服务,读写特征值数据,订阅、值变化通知、取消订阅等。代码片段如下:

//{bb7bb05e-5972-42b5-94fc-76eaa7084d49} 是用于筛选所有支持低功耗蓝牙(BLE)协议的设备。
static string _aqsAllBLEDevices = “(System.Devices.Aep.ProtocolId:=”{bb7bb05e-5972-42b5-94fc-76eaa7084d49}“)”;
//可以请求获取每个发现的 BLE 设备的设备地址和连接性状态
static string[] _requestedBLEProperties = { “System.Devices.Aep.DeviceAddress”, “System.Devices.Aep.Bluetooth.Le.IsConnectable”, };
//实现一个 BLE 设备监视器
watcher = DeviceInformation.CreateWatcher(_aqsAllBLEDevices, _requestedBLEProperties, DeviceInformationKind.AssociationEndpoint);