[FMX] 在 Delphi/C++ Builder 中开发低功耗蓝牙设备

从蓝牙4.0开始定义了不同类型的蓝牙协议,原来的蓝牙协议改称为经典蓝牙(Classic Bluetooth),新的低功耗版本被称为BLE(Bluetooth Low Energy)。
要在 Delphi 或 C++ Builder 中使用低功能蓝牙,需要做以下步骤:
1、在你的工程中放一个 TBlueToothLE 组件;
2、发现蓝牙设备;
3、发现并获取设备支持的服务;
4、发现并获取服务的特性;
5、读、写或订阅一个特性;
6、从原始数据中分解信息;

一、平台支持
BLE 的客户端支持 Windows 8+、OSX 10.7+、iOS 5+、Android 4.3+,更低版本无法使用;
BLE 的服务端支持 OSX 10.9+、iOS 6+、Android 5+,好吧,没 Windows 啥事。

二、常规属性配置/GATT(Gerneric Attribute Profile)
GATT 配置是用于在应用中了解如何使用服务的高级别定义。例如,对于一个健康应用或设备要有一个心率配置,设备服务端有一个心率感应器导出标准的心率服务,以便BLE客户端能发现服务并收集数据,例如每分钟的心跳数(BPM)。
GATT 配置是服务和特性的组合。
GATT 配置的官方页面是 GATT Specifications for Standard Profiles:http://developer.bluetooth.org/gatt/profiles/Pages/ProfilesHome.aspx

三、放置一个 TBluetoothLE 组件
这个没啥说的,从 Tool Palette 上找到 TBluetoothLE 组件,拖到窗体上就OK。无论实现蓝牙的客户端还是服务器端都需要它。
TBluetoothLE有一个CurrentManager属性指向了全局的 TBluetoothLEManager 对象实例,也可以用 TBluetoothLEManager.Current 来获取到它。这个是负责BLE通讯的主要类别,但你不需要创建新实例,全局用一个就OK。

四、发现设备
BLE 和经典蓝牙的不同在于它不需要配对(Windows 应用除外,好吧,看来微软在这方面已经落后不止一个身位了),但是它需要发现提供服务的服务端。
使用 DiscoverDevices 来发现 BLE 服务端。

const
HRSERVICE: TBluetoothUUID = ‘{0000180D-0000-1000-8000-00805F9B34FB}’;//这个 ID 在 http://blog.qdac.cc/?p=3363 上可以找到

private
procedure DoScan;

procedure TForm1.DoScan;
begin
BluetoothLE1.DiscoverDevices(2500) // 2500毫秒的查找时间
BluetoothLE1.DiscoverDevices(2500, [HRService]) //只查找心率设备
end;

在查找时间到了以后,会触发 OnEndDiscoverDevices 事件,在那里可以从常规的配置中获取服务和特性信息。

五、服务和特性
(一)、发现和获取服务
服务是一个设备封装的行为特性和与其它服务关系的集合。
一个GATT配置包含一到多个通过数值标记的常规服务。例如,对于心率真服务有一个官方的数值 0x180D。
官方的标准服务信息可以到 https://developer.bluetooth.org/gatt/services/Pages/ServicesHome.aspx 查询。
完整的服务ID由标准的服务编号和基础的蓝牙代码构成,例如心率设计的完整代码:https://developer.bluetooth.org/gatt/services/Pages/ServicesHome.aspx。
通过 DiscoverServices 函数来发现设备支持的服务,一旦服务发现完成,OnServiceDiscovered 事件被触发。然后可以通过GetServices来获取支持的服务列表,也可以通过GetService来获取特定的服务。
(二)、发现和获取特性
一个服务包含一到多个特性来提供服务的信息。每一个特性被一个官方数字标记。例如,对于心率服务有一个特性来测量心率,心率测量使用 UUID:00002A37-0000-1000-8000-00805F9B34FB 和其它用来标记位置的传感器,人体传感器位于 UUID:00002A38-0000-1000-8000-00805F9B34FB。
使用 GetCharacteristics 函数来获取一个服务的特性列表,或者用 GetCharacteristic 来获取指定的特性的信息。
(三)、读写或订阅特性
使用 GetCharacteristic 可以读或写(如果可以写)信息,在读取完数据后,OnCharacteristicRead 事件被触发。
要读取当前值,用 ReadCharacteristic 函数,要写入到服务器端的话,用 WriteCharacteristic 函数。
你可以订阅一个特性,以便跟踪每次的值改变。例如,要开启监测心率传感器,你可以用 GetCharacteristic 来读取当前值,然后使用 SubscribeToCharacteristic 来在其改变时获得通知。要取消监测,调用 UnsubscribeToCharacteristic 函数。
(四)、处理接收到的数据
客户端从服务端接收一组数据。要将数据转换为可读的信息,需要按照 GATT 配置的规格来。例如,你可以在官方找到关于心率测试特性的特性: https://developer.bluetooth.org/gatt/characteristics/Pages/CharacteristicViewer.aspx?u=org.bluetooth.characteristic.heart_rate_measurement.xml
对于心率测量特性,第一个字节包含来自于 BLE 协议打包的标志位。第 0 位标记心率值的格式:UINT8 或 UINT16,它决定了你如何处理后续的心率数字(是一个还是两个字节)。

六、BLE 服务器端
要创建一个服务器端或发布标准的服务
1、放置一个 TBluetoothLE 组件;
2、使用 GetGattServer 方法来发现低功耗蓝牙服务。
3、使用 TBluetoothGattServer.CreateService 方法来创建一个使用标准的UUID的服务。
4、使用 TBluetoothGattServer.CreateCharacteristic 方法来为服务创建使用标准 UUID的特性。
5、使用 AddService 方法将服务加入到 GATT 服务(第2步)。
6、使用 OnCharacteristicReadRequest 事件来响应客户端设备的读取请求。
7、使用 OnCharacteristicWriteRequest 事件来响应客户端设备的写入请求。
(一)、非标准配置
你可以创建不使用 GATT 配置的客户端和服务器端应用,这意味着你创建你私有的的服务和特性用于客户端和服务器端通讯。
对于非标准的配置,你需要一个128位的随机生成的UUID。
每一个BLE设备必需实现包含 Device Name 和 Appearance 特性的官方常规访问服务。参考:https://developer.bluetooth.org/gatt/services/Pages/ServiceViewer.aspx?u=org.bluetooth.service.generic_access.xml
(二)、添加 iOS 后台执行支持
要后台支持,得在 Info.plist 里添加 UIBackgroundModesProject 的值,Delphi/C++ Builder 允许你在 Project->Options->Version Info 里指定它。如果要在蓝牙事件发生时激活你的应用程序,设置 UIBackgroundModesProject 的值为下述值:
bluetooth-central 或 bluetooth-peripherical。

分享到:

1 条评论

沙发空缺中,还不快抢~