我已经解决了以下结构的问题;
首先,您应该(您也可以稍后再做)定义设备的服务和特征的 UUID
const
SERVICE : TGUID = '{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}';
CHARACT : TGUID = '{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}';
并定义您想要使用的设备及其特性
Device : TBluetoothLEDevice;
FCharacteristic: TBluetoothGattCharacteristic;
那么你需要访问粗略的位置才能让扫描工作(我在 FormCreate 上做了)
{$IFDEF ANDROID}
FLocationPermission := JStringToString(TJManifest_permission.JavaClass.ACCESS_COARSE_LOCATION);
{$ENDIF}
然后,您需要执行 PermissionsService
PermissionsService.RequestPermissions([FLocationPermission], RequestPermissionsResult, DisplayRationale);
注意:您可以在 Delphi 示例应用程序中找到这些代码和更多信息(位于 ..\Embarcadero\Studio\20.0\Samples\Object Pascal\Multi-Device Samples\Device Sensors and Services\Bluetooth\BLEScanner 下)
访问所有权限(并发现设备)后,您需要写入要使用的特征;
FCharacteristic:= Device.GetService(SERVICE).GetCharacteristic(CHARACT);
FCharacteristic.SetValueAsString(RawByteString('command'));
Device.WriteCharacteristic(CHARACT);
重要提示:由于 Embarcadero 在移动编译器中禁用了 Ansichar 和 AnsiString 。(此处和此处的其他信息)要么您需要使用 TBytes,要么通过这个宏伟的库获得 Ansi 支持(因此您可以将任何命令发送到任何 8 位 IoT 设备(如大多数设备))。其余部分由 MCU 完成。