τα στοιχεία επικοινωνίας μου
Ταχυδρομείο[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Για την ανάπτυξη BLE στους Δελφούς, σύρετε ένα TBlueToothLe στη διεπαφή και χρησιμοποιήστε αυτό το στοιχείο ελέγχου για να αναπτύξετε το BLE, όπως τη σύνδεση ενός βραχιολιού Bluetooth.
Υπάρχει ένα πρόγραμμα BLEScanner στο Demo που συνοδεύει το Delphi, το οποίο μπορεί να χρησιμοποιηθεί ως αφετηρία για ανάπτυξη.
Εάν το παραπάνω πρόγραμμα εκτελεστεί στα Windows, μετά τη σάρωση της συσκευής, εάν το ποντίκι κάνει κλικ σε μια συσκευή, η διεπαφή μπορεί να παγώσει και το πρόγραμμα να μην ανταποκρίνεται. Κοιτάζοντας την περιοχή διαχείρισης εργασιών, είναι αλήθεια ότι το πρόγραμμα δεν ανταποκρίνεται και έχει διακοπεί.
Κάντε κλικ με το ποντίκι για να σαρώσετε τις υπηρεσίες της επιλεγμένης συσκευής. Στη συνέχεια, όταν ανακαλυφθούν οι υπηρεσίες της συσκευής, ενεργοποιείται το συμβάν OnServicesDiscovered του TBluetoothLE. Σε αυτήν την περίπτωση, πολλαπλές υπηρεσίες της συσκευής διαβάζονται σε βρόχο και, στη συνέχεια, για μια συγκεκριμένη υπηρεσία, το όνομα του χαρακτήρα της διαβάζεται σε βρόχο. Η συντριβή είναι όπου ο βρόχος διαβάζει Χαρακτήρα.
Γιατί συνετρίβη, δεν ξέρω. Βρήκα όμως μια λύση, ο κώδικας είναι ο εξής:
- 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;
Στον παραπάνω κώδικα, το TTask.Run προστέθηκε από εμένα. Το TThread.Synchronize προστέθηκε επίσης από εμένα. Καταργήστε τα TTask.Run και TThread.Synchronize και ο κωδικός που απομένει είναι ο αρχικός κώδικας του Demo που συνοδεύει τους Delphi.
Πρώτα, βάλτε τον αρχικό κώδικα στο TTask.Run, που σημαίνει ότι τοποθετείτε αυτούς τους κωδικούς σε ένα νήμα για εκτέλεση. Αντί να εκτελεστεί το νήμα που ανέβασε αρχικά το συμβάν OnServicesDiscovered. Πιθανή αιτία: Το νήμα που ενεργοποίησε το OnServicesDiscovered δεν μπορεί να εκτελέσει πάρα πολλές χρονοβόρες εργασίες.
Ο κώδικας εκτελείται στο νήμα Όταν χρειάζεται να γράψετε δεδομένα στο στοιχείο ελέγχου διεπαφής, όπως το Listbox2.Items.Add code, πρέπει να κάνετε συγχρονισμό νήματος. Προσθέστε λοιπόν TThread.Synchronize.
το αναπτυξιακό μου περιβάλλον
Σε διαφορετικά περιβάλλοντα, τα φαινόμενα μπορεί να είναι διαφορετικά. Επομένως, εδώ είναι το περιβάλλον ανάπτυξής μου:
Delphi 11 Community Edition;
Windows 11 Home Edition.
Το πρόγραμμα-στόχος που πρέπει να μεταγλωττιστεί και να εκτελεστεί είναι η έκδοση Win32.
Δεν υπάρχει δοκιμή εάν αυτό το Demo θα έχει τα παραπάνω προβλήματα στο Android. Αλλά πιστεύω ότι στο Android, θα είναι καλύτερο να προσθέσετε το TTask.Run.
Το Demo που αναφέρεται εδώ, μετά την εγκατάσταση του Delphi, εάν είναι εγκατεστημένο από προεπιλογή, το πρόγραμμα επίδειξης είναι:
C:UsersPublicDocumentsEmbarcaderoStudio22.0SamplesObject Pascal Δείγματα πολλαπλών συσκευών Αισθητήρες και υπηρεσίες συσκευήςBluetoothBLEScanner
Δεν υπάρχει πρόβλημα στη χρήση των Delphi για την ανάπτυξη προγραμμάτων BLE, όπως η κατασκευή μιας εφαρμογής βραχιολιού. Ωστόσο, πρέπει να σημειωθεί ότι σε πολλά συμβάντα του στοιχείου ελέγχου TBluetoothLE, είναι καλύτερο να μην εκτελείτε πάρα πολύ κώδικα. Εάν υπάρχει πολύπλοκη επιχειρηματική λογική, είναι καλύτερο να την εκτελέσετε σε ξεχωριστό νήμα Στη μέθοδο συμβάντος, απλώς ξεκινήστε το αντίστοιχο νήμα.
Για τους Delphi, το TTask.Run που προστέθηκε πρόσφατα μας επιτρέπει να ρίξουμε πολύ κώδικα στην εκτέλεση νήματος Η μέθοδος γραφής κώδικα είναι πολύ πιο απλή από πριν όταν έπρεπε να δημιουργήσουμε μια κλάση νήματος.