le mie informazioni di contatto
Posta[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Per lo sviluppo BLE in Delphi, trascina un TBlueToothLe sull'interfaccia e usa questo controllo per sviluppare BLE, ad esempio collegando un braccialetto Bluetooth.
Nella demo fornita con Delphi è presente un programma BLEScanner che può essere utilizzato come punto di partenza per lo sviluppo.
Se il programma di cui sopra viene eseguito in Windows, dopo la scansione del dispositivo, se si fa clic con il mouse su un dispositivo, l'interfaccia potrebbe bloccarsi e il programma non risponderà. Osservando l'area di gestione delle attività, è vero che il programma non risponde e si è bloccato.
Fare clic con il mouse per scansionare i servizi del dispositivo selezionato. Quindi, quando vengono rilevati i servizi del dispositivo, viene attivato l'evento OnServicesDiscovered di TBluetoothLE. In questo caso, più servizi del dispositivo vengono letti in loop e quindi, per un determinato servizio, il nome del personaggio viene letto in loop. L'incidente è dove il ciclo legge Character.
Perché si è schiantato, non lo so. Ma ho trovato una soluzione, il codice è il seguente:
- procedure TForm6.BluetoothLE1ServicesDiscovered(const Sender: TObject; const AServiceList: TBluetoothGattServiceList);
- var
- ServiceIndex: Integer;
- Service: TBluetoothGattService;
- CharacteristicIndex: Integer;
- Characteristic: TBluetoothGattCharacteristic;
- begin
- //以下代码如果不包到 TTask.Run 里面(原本的代码没有),在 WINDOWS 底下,执行到 for
- //CharacteristicIndex := 0 to Service.Characteristics.Count 会界面冻结,而且单步跟踪也停止
- //了,没有往下执行。
- TTask.Run(
- procedure
- var
- ServiceIndex: Integer;
- CharacteristicIndex: Integer;
- begin
- if AServiceList.Count > 0 then
- begin
- for ServiceIndex := 0 to AServiceList.Count - 1 do
- begin
- Service := AServiceList[ServiceIndex];
-
- TThread.Synchronize(nil,
- procedure
- begin
- Listbox2.Items.Add((ServiceIndex + 1).ToString + ' - ' + Service.UUIDName + ' - ' + Service.UUID.ToString);
- end
- );
-
-
- //以下代码会导致死机,如果断点跟踪,直接就是停在 for 这一行,不会继续往下执行。
- for CharacteristicIndex := 0 to Service.Characteristics.Count - 1 do
- begin
- Characteristic := Service.Characteristics[CharacteristicIndex];
-
- TThread.Synchronize(nil,
- procedure
- begin
- Listbox2.Items.Add(' - ' + Characteristic.UUIDName + ' - ' + Characteristic.UUID.ToString);
- end
- );
-
- end;
-
- end;
- end
- else
- TThread.Synchronize(nil,
- procedure
- begin
- Listbox2.Items.Add('- Access not allowed or no service available');
- end
- );
-
- end
- );
-
- //Listbox1.Enabled := True;
- end;
Nel codice precedente, TTask.Run è stato aggiunto da me. Anche TThread.Synchronize è stato aggiunto da me. Rimuovi TTask.Run e TThread.Synchronize e il codice rimanente è il codice originale della demo fornita con Delphi.
Innanzitutto, inserisci il codice originale in TTask.Run, il che significa inserire questi codici in un thread per l'esecuzione. Invece di consentire l'esecuzione del thread che ha originariamente generato l'evento OnServicesDiscovered. Possibile motivo: il thread che ha attivato OnServicesDiscovered non può eseguire troppe attività che richiedono molto tempo.
Il codice viene eseguito nel thread. Quando è necessario scrivere dati nel controllo dell'interfaccia, ad esempio il codice Listbox2.Items.Add, è necessario eseguire la sincronizzazione del thread. Quindi aggiungi TThread.Synchronize.
il mio ambiente di sviluppo
In ambienti diversi, i fenomeni possono essere diversi. Pertanto, ecco il mio ambiente di sviluppo:
Edizione comunitaria Delphi 11;
Windows 11 Home Edition;
Il programma di destinazione da compilare ed eseguire è la versione Win32.
Non è possibile verificare se questa demo presenterà i problemi di cui sopra su Android. Ma credo che su Android sarà meglio aggiungere TTask.Run.
La demo qui menzionata, dopo aver installato Delphi, se è installata per impostazione predefinita, il programma demo è:
C:UtentiPubblicoDocumentiEmbarcaderoStudio22.0CampioniObject PascalCampioni multi-dispositivoSensori e servizi per dispositiviBluetoothBLEScanner
Non ci sono problemi nell'usare Delphi per sviluppare programmi BLE, come creare un'APP per braccialetti. Tuttavia va notato che in molti eventi del controllo TBluetoothLE è meglio non eseguire troppo codice. Se è presente una logica aziendale complessa, è meglio eseguirla in un thread separato. Nel metodo dell'evento, è sufficiente avviare il thread corrispondente.
Per Delphi, il TTask.Run appena aggiunto ci consente di inserire molto codice nell'esecuzione del thread. Il metodo di scrittura del codice è molto più semplice di prima quando dovevamo creare una classe thread.