首先,Delphi 官方的例子程序里面,有BLE的例子,可以先参考。
蓝牙的不同版本:2.0 3.0 4.0 其通讯协议有很大的不同。4.0 就是 BLE,低功耗蓝牙。
以下是我经过自己写例子代码操作蓝牙设备的测试摸索后对BLE蓝牙编程原理的理解。安卓手机上测试通过。
Delphi 提供了BLE的控件:TBluetoothLE
拖一个控件放到界面上,设置控件的 Enable 为 True。程序启动后,该控件可以工作。
对一个 BLE 设备的读写操作的基本原理:
BLE 设备有多个不同的【服务】,Service;每个服务底下,有多个不同的【特征】, Characteristic。读写操作就是针对特征的【值】。
每个服务有一个 UUID,每个特征也有一个 UUID。
在 Delphi 底下采用 TBluetoothLE 控件操作 BLE 的基本方式:
1. 首先是设备发现。执行完设备发现后,TBluetoothLE 里面会产生多个设备实例对象。
启动设备发现的代码:BluetoothLE1.DiscoverDevices(3000); 这里的 3000 是超时值。可以是 10 秒甚至更多。
设备发现(扫描BLE蓝牙设备)中,BluetoothLE1 会触发事件:OnDiscoverLEDevice。这里会不停地触发。扫描动作完成后,会触发 OnEndDiscoverDevice 事件。可以在这个事件里面查看是否扫描到你要的设备。
2. 设备发现完成后,BluetoothLE1 里面就有多个设备的对象实例 TBluetoothLEDevice,通过 BluetoothLE1.DiscoveredDevices[i] 可以获取到。
3. 针对某个设备,执行服务发现(扫描其提供什么服务):BluetoothLE1.DiscoveredDevices[AIndex].DiscoverServices
3.1. 上述服务发现方法被调用后,会触发 OnServicesDiscovered 事件。这个事件提供了 AServiceList: TBluetoothGattServiceList,可以从里面获取到这个设备的所有服务对象。
4. 要操作某个设备的某个值:
4.1. 首先要根据服务的 UUID 获取到设备对象,方法:BluetoothLE1.DiscoveredDevices[i]
4.2. 然后,针对该设备对象,获取其服务对象(根据该服务的 UUID),方法:BluetoothLE1.GetService;
4.3. 获取特征对象(采用该特征的 UUID),方法:BluetoothLE1.GetCharacteristic;
4.4. 如果是写数据到蓝牙设备,则是修改该特征对象的值:ACharacteristic.Value := AValue; 然后,将该特征对象写入蓝牙设备:BluetoothLE1.WriteCharacteristic(ADevice, ACharacteristic); 到此数据已经写入蓝牙设备。
4.5. 如果是要监听某个特征的广播,注册:ADevice.SetCharacteristicNotification(ACharacteristic, True); 注册完成后,收到蓝牙设备的广播数据,BluetoothLE1 会触发 OnE1CharacteristicRead 事件。通过该事件提供的 ACharacteristic: TBluetoothGattCharacteristic 特征对象,读到来自蓝牙的广播数据。数据如何解释,则看具体设备或具体的定义了。