我已经解决了以下结构的问题;
首先你应该(你也可以稍后再做)定义设备的服务和特征的 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\蓝牙\BLEScanner)
在访问所有权限(并发现设备)后,您需要写入要使用的特征;
FCharacteristic:= Device.GetService(SERVICE).GetCharacteristic(CHARACT);
FCharacteristic.SetValueAsString(RawByteString('command'));
Device.WriteCharacteristic(CHARACT);
重要:由于 Embarcadero 在移动编译器中禁用了 Ansichar 和 AnsiString。 (here 和 here 中的其他信息)您需要使用 TBytes 或获取 Ansi 支持 with this magnificent library(因此您可以将任何命令发送到任何 8 位 IoT 设备(就像大多数设备一样))。其余部分由 MCU 完成。