-
1.19.0.0 Русский
Добрый вечер. Рабочий проект версии 1.18.14.1, открываю на версии 1.19.0.0. Ошибка при открытии, на может прочитать файл *.dproj проекта. Наверное он слишком большой. Другие проекты, меньшие по размеру открываются и сразу запускается мигратор. Файл *.dproj: Faberlic.dproj.rar Или может лучше создать новый проект в версии 1.19.0.0 и перебрать всё вручную, чтобы следов прошлых версий не было в проекте?
-
BluetoothLE - не проходит событие "OnCharacteristicRead"
Работает! Спасибо! Обновил java часть FGX Native.
-
BluetoothLE - не проходит событие "OnCharacteristicRead"
Еще раз создал чистый проект на FGX, без тем, ключей. Перенес код из FMX. Не работает, не возвращается событие "OnCharacteristicRead". CL2_Test.rar
-
BluetoothLE - не проходит событие "OnCharacteristicRead"
Создал чистый FMX проект. Перенес код из FGX проекта в FMX. Ничего лишнего. targetSdkVersion = 35, Uses Premitions те же. В FMX работает, приходит событие "OnCharacteristicRead". Рабочий проект на FMX: CL2_FMX.rar unit MainForm; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Controls.Presentation, FMX.StdCtrls, System.Bluetooth, System.Bluetooth.Components, System.Permissions; type TForm1 = class(TForm) Label1: TLabel; btDevices: TButton; btSend: TButton; lbDeviceName: TLabel; BluetoothLE1: TBluetoothLE; procedure btDevicesClick(Sender: TObject); procedure BluetoothLE1EndDiscoverDevices(const Sender: TObject; const ADeviceList: TBluetoothLEDeviceList); procedure btSendClick(Sender: TObject); procedure BluetoothLE1CharacteristicWrite(const Sender: TObject; const ACharacteristic: TBluetoothGattCharacteristic; AGattStatus: TBluetoothGattStatus); procedure BluetoothLE1CharacteristicRead(const Sender: TObject; const ACharacteristic: TBluetoothGattCharacteristic; AGattStatus: TBluetoothGattStatus); private const LOCATION_PERMISSION = 'android.permission.ACCESS_FINE_LOCATION'; BLUETOOTH_SCAN_PERMISSION = 'android.permission.BLUETOOTH_SCAN'; BLUETOOTH_CONNECT_PERMISSION = 'android.permission.BLUETOOTH_CONNECT'; private { Private declarations } FBLEDevice: TBluetoothLEDevice; FGattService: TBluetoothGattService; FCharacteristic_UUID_RX: TBluetoothGattCharacteristic; FCharacteristic_UUID_TX: TBluetoothGattCharacteristic; procedure GetServiceAndCharacteristics; public { Public declarations } end; const SERVICE_UUID : TGUID = '{6E400001-B5A3-F393-E0A9-E50E24DCCA9E}'; { UUID для BLE } CHARACTERISTIC_UUID_TX : TGUID = '{6E400003-B5A3-F393-E0A9-E50E24DCCA9E}'; CHARACTERISTIC_UUID_RX : TGUID = '{6E400002-B5A3-F393-E0A9-E50E24DCCA9E}'; var Form1: TForm1; implementation {$R *.fmx} {******************************************************************************} procedure TForm1.btDevicesClick(Sender: TObject); var Permissions: TArray<string>; begin if TOSVersion.Check(12) then Permissions := [LOCATION_PERMISSION, BLUETOOTH_SCAN_PERMISSION, BLUETOOTH_CONNECT_PERMISSION] else Permissions := [LOCATION_PERMISSION]; PermissionsService.RequestPermissions(Permissions, procedure(const APermissions: TClassicStringDynArray; const AGrantResults: TClassicPermissionStatusDynArray) begin if ((Length(AGrantResults) = 3) and (AGrantResults[0] = TPermissionStatus.Granted) and (AGrantResults[1] = TPermissionStatus.Granted) and (AGrantResults[2] = TPermissionStatus.Granted)) or ((Length(AGrantResults) = 1) and (AGrantResults[0] = TPermissionStatus.Granted)) then BluetoothLE1.DiscoverDevices(2500) { Запускаем поиск устройств } else Label1.Text := 'Cannot start BLE scan because not all required permissions have been granted!'; end); end; {******************************************************************************} procedure TForm1.BluetoothLE1EndDiscoverDevices(const Sender: TObject; const ADeviceList: TBluetoothLEDeviceList); var i: Integer; begin for i := 0 to ADeviceList.Count - 1 do if Pos('CLMASTER', ADeviceList[i].DeviceName) > 0 then begin lbDeviceName.Text := ADeviceList[i].DeviceName; { Отображаем Имя устройства } FBLEDevice := BluetoothLE1.DiscoveredDevices[I]; FBLEDevice.Connect; FBLEDevice.DiscoverServices; if BluetoothLE1.GetServices(FBLEDevice).Count = 0 then Label1.Text := 'No services found!' else GetServiceAndCharacteristics; end; end; {******************************************************************************} procedure TForm1.GetServiceAndCharacteristics; var i, j, k: Integer; begin for i := 0 to FBLEDevice.Services.Count - 1 do begin Label1.Text := FBLEDevice.Services[I].UUIDName + ' : ' + FBLEDevice.Services[I].UUID.ToString; for j := 0 to FBLEDevice.Services[I].Characteristics.Count - 1 do begin Label1.Text := '--> ' + FBLEDevice.Services[I].Characteristics[J].UUIDName + ' : ' + FBLEDevice.Services[I].Characteristics[J].UUID.ToString; for k := 0 to FBLEDevice.Services[I].Characteristics[J].Descriptors.Count - 1 do begin Label1.Text := '----> ' + FBLEDevice.Services[I].Characteristics[J].Descriptors[K].UUIDName + ' : ' + FBLEDevice.Services[I].Characteristics[J].Descriptors[K].UUID.ToString; end; end; end; FGattService := nil; FCharacteristic_UUID_RX := nil; FCharacteristic_UUID_TX := nil; FGattService := BluetoothLE1.GetService(FBLEDevice, SERVICE_UUID); if FGattService <> nil then begin FCharacteristic_UUID_TX := BluetoothLE1.GetCharacteristic(FGattService, CHARACTERISTIC_UUID_TX); FCharacteristic_UUID_RX := BluetoothLE1.GetCharacteristic(FGattService, CHARACTERISTIC_UUID_RX); end else Label1.Text := 'Service not found!'; if FCharacteristic_UUID_TX <> nil then begin if BluetoothLE1.SubscribeToCharacteristic(FBLEDevice, FCharacteristic_UUID_TX) = True then Label1.Text := 'Подписались UUID_TX'; end; end; {******************************************************************************} procedure TForm1.btSendClick(Sender: TObject); var LBytes : TArray<byte>; begin { $ C I R } LBytes := TArray<byte>.Create($24, $43, $49, $52, $0D, $0A); BluetoothLE1.GetCharacteristic(FGattService, Characteristic_UUID_RX).SetValueAsString(TEncoding.ANSI.GetString(LBytes)); FBLEDevice.WriteCharacteristic(BluetoothLE1.GetCharacteristic(FGattService, Characteristic_UUID_RX)); end; {******************************************************************************} procedure TForm1.BluetoothLE1CharacteristicWrite(const Sender: TObject; const ACharacteristic: TBluetoothGattCharacteristic; AGattStatus: TBluetoothGattStatus); begin if FBLEDevice.RequestMtu(517) = True then Label1.Text := 'RequestMtu = 517'; end; {******************************************************************************} procedure TForm1.BluetoothLE1CharacteristicRead(const Sender: TObject; const ACharacteristic: TBluetoothGattCharacteristic; AGattStatus: TBluetoothGattStatus); begin Label1.Text := 'Read!!!'; if AGattStatus = TBluetoothGattStatus.Success then Label1.Text := 'Read Success!!!'; end; {******************************************************************************} end.
-
BluetoothLE - не проходит событие "OnCharacteristicRead"
В заголовочном файле Android.Api.Hardware.Bluetooth.pas посмотрел поиском: 1. GetServices - функция Есть. 2. GetCharacteristic - функция Есть. 3. WriteCharacteristic - функция Есть. 4. RequestMtu - функция Есть. 5. SubscribeToCharacteristic - Нет !!! Этой функцией подписываемся на характеристику. Может она не проходит вовне?
-
BluetoothLE - не проходит событие "OnCharacteristicRead"
HeartRateMonitor.rar
-
BluetoothLE - не проходит событие "OnCharacteristicRead"
CL2.rar
-
BluetoothLE - не проходит событие "OnCharacteristicRead"
Delphi 12.3, компонент BluetoothLE1. Работаю с устройством по BLE. 1. Обнаруживаю доступные устройства, 2. Подключаюсь к сервисам устройства, 3. Получаю характеристики, 4. Подписываюсь на характеристику для чтения. 5. Пишу команду в характеристику для записи, ответ от устройства в событии "OnCharacteristicRead" не приходит. Делал по стандартному FMX примеру "HeartRateMonitor". Работает. Создал новый проект на FGX 1.18.11.0, разместил компонент BluetoothLE1. Устройство обнаруживается, сервисы, характеристики доступны, подписка на характеристику для чтения проходит с результатом True. Но вот когда идёт передача от устройства, событие "OnCharacteristicRead" не срабатывает. Подключены System.Bluetooth, System.Bluetooth.Components. Пробовал добавлять заголовочный файл Android.Api.Hardware.Bluetooth. Что можно попробовать ещё, RTL, мосты? FGX проект: unit Form.Main; interface {$SCOPEDENUMS ON} uses System.Types, System.Classes, FGX.Forms, FGX.Forms.Types, FGX.Controls, FGX.Controls.Types, FGX.Layout, FGX.Layout.Types, FGX.NavigationBar.Types, FGX.NavigationBar, FGX.DrawerLayout, FGX.StaticLabel, System.Bluetooth, System.Bluetooth.Components, System.Permissions, FGX.Button.Types, FGX.Button, FGX.Switch; type TFormMain = class(TfgForm) fgDrawerLayout1: TfgDrawerLayout; fgNavigationBar: TfgNavigationBar; fgLabel2: TfgLabel; BluetoothLE1: TBluetoothLE; btDevices: TfgButton; loDevice: TfgLayout; loDeviceName: TfgLayout; lbDeviceName: TfgLabel; loDeviceSwitch: TfgLayout; fgSwitch: TfgSwitch; fgSend: TfgButton; procedure btDevicesTap(Sender: TObject); procedure BluetoothLE1EndDiscoverDevices(const Sender: TObject; const ADeviceList: TBluetoothLEDeviceList); procedure fgSendTap(Sender: TObject); procedure BluetoothLE1CharacteristicWrite(const Sender: TObject; const ACharacteristic: TBluetoothGattCharacteristic; AGattStatus: TBluetoothGattStatus); procedure BluetoothLE1CharacteristicRead(const Sender: TObject; const ACharacteristic: TBluetoothGattCharacteristic; AGattStatus: TBluetoothGattStatus); private const LOCATION_PERMISSION = 'android.permission.ACCESS_FINE_LOCATION'; BLUETOOTH_SCAN_PERMISSION = 'android.permission.BLUETOOTH_SCAN'; BLUETOOTH_CONNECT_PERMISSION = 'android.permission.BLUETOOTH_CONNECT'; private { Private declarations } FBLEDevice: TBluetoothLEDevice; FGattService: TBluetoothGattService; FCharacteristic_UUID_RX: TBluetoothGattCharacteristic; FCharacteristic_UUID_TX: TBluetoothGattCharacteristic; procedure GetServiceAndCharacteristics; public { Public declarations } end; const SERVICE_UUID : TGUID = '{6E400001-B5A3-F393-E0A9-E50E24DCCA9E}'; { UUID для BLE } CHARACTERISTIC_UUID_TX : TGUID = '{6E400003-B5A3-F393-E0A9-E50E24DCCA9E}'; CHARACTERISTIC_UUID_RX : TGUID = '{6E400002-B5A3-F393-E0A9-E50E24DCCA9E}'; var FormMain: TFormMain; implementation {$R *.xfm} uses System.SysUtils, FGX.Application, FGX.Dialogs, FGX.Toasts, FGX.Log, Android.Api.Hardware.Bluetooth; {******************************************************************************} procedure TFormMain.btDevicesTap(Sender: TObject); var Permissions: TArray<string>; begin if TOSVersion.Check(12) then Permissions := [LOCATION_PERMISSION, BLUETOOTH_SCAN_PERMISSION, BLUETOOTH_CONNECT_PERMISSION] else Permissions := [LOCATION_PERMISSION]; PermissionsService.RequestPermissions(Permissions, procedure(const APermissions: TClassicStringDynArray; const AGrantResults: TClassicPermissionStatusDynArray) begin if ((Length(AGrantResults) = 3) and (AGrantResults[0] = TPermissionStatus.Granted) and (AGrantResults[1] = TPermissionStatus.Granted) and (AGrantResults[2] = TPermissionStatus.Granted)) or ((Length(AGrantResults) = 1) and (AGrantResults[0] = TPermissionStatus.Granted)) then BluetoothLE1.DiscoverDevices(2500) { Запускаем поиск устройств } else TfgDialogs.ShowMessage('Cannot start BLE scan because not all required permissions have been granted!'); end); end; {******************************************************************************} procedure TFormMain.BluetoothLE1EndDiscoverDevices(const Sender: TObject; const ADeviceList: TBluetoothLEDeviceList); var i: Integer; begin for i := 0 to ADeviceList.Count - 1 do if Pos('CLMASTER', ADeviceList[i].DeviceName) > 0 then begin lbDeviceName.Text := ADeviceList[i].DeviceName; { Отображаем Имя устройства } fgSwitch.Visible := True; FBLEDevice := BluetoothLE1.DiscoveredDevices[I]; FBLEDevice.Connect; FBLEDevice.DiscoverServices; if BluetoothLE1.GetServices(FBLEDevice).Count = 0 then TfgToastFactory.Show('No services found!') else GetServiceAndCharacteristics; end; end; {******************************************************************************} procedure TFormMain.GetServiceAndCharacteristics; var i, j, k: Integer; begin for i := 0 to FBLEDevice.Services.Count - 1 do begin fgNavigationBar.Title := FBLEDevice.Services[I].UUIDName + ' : ' + FBLEDevice.Services[I].UUID.ToString; for j := 0 to FBLEDevice.Services[I].Characteristics.Count - 1 do begin fgNavigationBar.Title := '--> ' + FBLEDevice.Services[I].Characteristics[J].UUIDName + ' : ' + FBLEDevice.Services[I].Characteristics[J].UUID.ToString; for k := 0 to FBLEDevice.Services[I].Characteristics[J].Descriptors.Count - 1 do begin fgNavigationBar.Title := '----> ' + FBLEDevice.Services[I].Characteristics[J].Descriptors[K].UUIDName + ' : ' + FBLEDevice.Services[I].Characteristics[J].Descriptors[K].UUID.ToString; end; end; end; FGattService := nil; FCharacteristic_UUID_RX := nil; FCharacteristic_UUID_TX := nil; FGattService := BluetoothLE1.GetService(FBLEDevice, SERVICE_UUID); if FGattService <> nil then begin FCharacteristic_UUID_TX := BluetoothLE1.GetCharacteristic(FGattService, CHARACTERISTIC_UUID_TX); FCharacteristic_UUID_RX := BluetoothLE1.GetCharacteristic(FGattService, CHARACTERISTIC_UUID_RX); fgSwitch.Enabled := True; fgSwitch.IsChecked := True; end else TfgToastFactory.Show('Service not found!'); if FCharacteristic_UUID_TX <> nil then begin if BluetoothLE1.SubscribeToCharacteristic(FBLEDevice, FCharacteristic_UUID_TX) = True then fgNavigationBar.Title := 'Подписались UUID_TX' end; end; {******************************************************************************} procedure TFormMain.fgSendTap(Sender: TObject); var LBytes : TArray<byte>; begin { $ C I R } LBytes := TArray<byte>.Create($24, $43, $49, $52, $0D, $0A); BluetoothLE1.GetCharacteristic(FGattService, Characteristic_UUID_RX).SetValueAsString(TEncoding.ANSI.GetString(LBytes)); FBLEDevice.WriteCharacteristic(BluetoothLE1.GetCharacteristic(FGattService, Characteristic_UUID_RX)); end; {******************************************************************************} procedure TFormMain.BluetoothLE1CharacteristicWrite(const Sender: TObject; const ACharacteristic: TBluetoothGattCharacteristic; AGattStatus: TBluetoothGattStatus); begin if FBLEDevice.RequestMtu(517) = True then fgNavigationBar.Title := 'RequestMtu = 517'; end; {******************************************************************************} procedure TFormMain.BluetoothLE1CharacteristicRead(const Sender: TObject; const ACharacteristic: TBluetoothGattCharacteristic; AGattStatus: TBluetoothGattStatus); begin fgNavigationBar.Title := 'Read!!!'; if AGattStatus = TBluetoothGattStatus.Success then fgNavigationBar.Title := 'Read Success!!!'; end; {******************************************************************************} end. Работающий пример на FMX:
-
1.18.8.1 Русский
Без ошибок, при использовании JDK 22 (jdk-22.0.2_windows-x64_bin.exe) targetSdkVersion = 35, GooglePlay опубликовал! Работает, Спасибо! Ошибка была, при использовании JDK 23 (jdk-23_windows-x64_bin.exe).
-
1.18.4.0 Русский
-
1.18.4.0 Русский
Какое расположение иконки (Appearance.Icon.Location) используется? Для первого скриншота: Appearance.Icon.Location = Center Установил в крайней правой кнопке Appearance.Icon.Location = Top, иконка ушла вверх кнопки. И в дизайнере она стала маленькой.
-
1.18.4.0 Русский
В версии 1.18.4.0 иконки в TfgButton стали маленькие. В версии 1.18.3.0 иконки в TfgButton нормально отображались. Иконки из FGX Assets Manager, 24x24. Каким свойством растянуть?
-
[Установка] После месяца нормальной работы на Delphi 12.1 слетела регистрация пакетов.
-
[Установка] После месяца нормальной работы на Delphi 12.1 слетела регистрация пакетов.
Здравствуйте. Delphi 12.1, FGX-Native 1.18.1.3. После месяца нормальной работы на Delphi 12.1 слетела регистрация пакетов. Устанавливал библиотеку при закрытой IDE, в реестре, в \Disabled Packages пакетов FGX-Native нет. В ручную поставить, удалить и поставить не получается.
-
FB4D – The OpenSource Cross-Platform Library for Firebase
Yes, now added TOKENJWT in defines. Yes, it compiles without errors, gets into the phone and works! Thank you!