प्रौद्योगिकी साझेदारी

Bluetooth BLE विकासाय Delphi इत्यस्य उपयोगेन एकः समस्या

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

कल्पना

Delphi मध्ये BLE विकासाय, एकं TBlueToothLe इत्येतत् अन्तरफलके कर्षयन्तु तथा च BLE विकासाय एतस्य नियन्त्रणस्य उपयोगं कुर्वन्तु, यथा Bluetooth कङ्कणं संयोजयितुं ।

Demo इत्यस्मिन् BLEScanner इति कार्यक्रमः अस्ति यः Delphi इत्यनेन सह आगच्छति, यस्य उपयोगः विकासस्य आरम्भबिन्दुरूपेण कर्तुं शक्यते ।

प्रश्न

यदि उपर्युक्तः कार्यक्रमः विण्डोज-अन्तर्गतं निष्पादितः भवति तर्हि यन्त्रस्य स्कैनिङ्गानन्तरं यदि मूषकः कस्मिंश्चित् यन्त्रे क्लिक् करोति तर्हि अन्तरफलकं स्थगितम् भवितुम् अर्हति तथा च कार्यक्रमः प्रतिक्रियां न दास्यति । कार्यप्रबन्धनक्षेत्रं दृष्ट्वा सत्यं यत् कार्यक्रमः अप्रतिसादः अस्ति, दुर्घटना च अभवत् ।

कारणविश्लेषणम्

चयनितयन्त्रस्य सेवाः स्कैन् कर्तुं मूषकं नुदन्तु । ततः यदा यन्त्रस्य सेवाः आविष्कृताः भवन्ति तदा TBluetoothLE इत्यस्य OnServicesDiscovered इवेण्ट् प्रवर्तते । अस्मिन् सन्दर्भे यन्त्रस्य बहुविधाः सेवाः एकस्मिन् लूप् मध्ये पठ्यन्ते, ततः कस्यापि सेवायाः कृते तस्य Character इति नाम लूप् मध्ये पठ्यते । क्रैश तत्रैव भवति यत्र लूप् Character इति पठति ।

किमर्थं दुर्घटना अभवत् इति अहं न जानामि। परन्तु मया समाधानं प्राप्तम्, कोडः निम्नलिखितरूपेण अस्ति।

  1. procedure TForm6.BluetoothLE1ServicesDiscovered(const Sender: TObject; const AServiceList: TBluetoothGattServiceList);
  2. var
  3. ServiceIndex: Integer;
  4. Service: TBluetoothGattService;
  5. CharacteristicIndex: Integer;
  6. Characteristic: TBluetoothGattCharacteristic;
  7. begin
  8. //以下代码如果不包到 TTask.Run 里面(原本的代码没有),在 WINDOWS 底下,执行到 for
  9. //CharacteristicIndex := 0 to Service.Characteristics.Count 会界面冻结,而且单步跟踪也停止
  10. //了,没有往下执行。
  11. TTask.Run(
  12. procedure
  13. var
  14. ServiceIndex: Integer;
  15. CharacteristicIndex: Integer;
  16. begin
  17. if AServiceList.Count > 0 then
  18. begin
  19. for ServiceIndex := 0 to AServiceList.Count - 1 do
  20. begin
  21. Service := AServiceList[ServiceIndex];
  22. TThread.Synchronize(nil,
  23. procedure
  24. begin
  25. Listbox2.Items.Add((ServiceIndex + 1).ToString + ' - ' + Service.UUIDName + ' - ' + Service.UUID.ToString);
  26. end
  27. );
  28. //以下代码会导致死机,如果断点跟踪,直接就是停在 for 这一行,不会继续往下执行。
  29. for CharacteristicIndex := 0 to Service.Characteristics.Count - 1 do
  30. begin
  31. Characteristic := Service.Characteristics[CharacteristicIndex];
  32. TThread.Synchronize(nil,
  33. procedure
  34. begin
  35. Listbox2.Items.Add(' - ' + Characteristic.UUIDName + ' - ' + Characteristic.UUID.ToString);
  36. end
  37. );
  38. end;
  39. end;
  40. end
  41. else
  42. TThread.Synchronize(nil,
  43. procedure
  44. begin
  45. Listbox2.Items.Add('- Access not allowed or no service available');
  46. end
  47. );
  48. end
  49. );
  50. //Listbox1.Enabled := True;
  51. end;

संहिता व्याख्या

उपरिष्टाद् कोड् मध्ये TTask.Run मया योजितम् । TThread.Synchronize इति अपि मया योजितम् । TTask.Run तथा TThread.Synchronize इत्येतत् निष्कासयन्तु शेषः कोडः Delphi इत्यनेन सह आगच्छति Demo इत्यस्य मूलकोड् अस्ति ।

प्रथमं मूलसङ्केतं TTask.Run इत्यत्र स्थापयन्तु, यस्य अर्थः अस्ति यत् एतान् कोड् निष्पादनार्थं थ्रेड् मध्ये स्थापयन्तु । मूलतः OnServicesDiscovered इवेण्ट् उत्थापितस्य थ्रेड् इत्यस्य कार्यान्वयनस्य स्थाने । सम्भाव्यकारणम्: OnServicesDiscovered इत्यस्य प्रेरणायुक्तः थ्रेड् बहुकालं यावत् कार्यं कर्तुं न शक्नोति ।

कोडः थ्रेड् मध्ये निष्पादितः भवति यदा भवन्तः इन्टरफेस् नियन्त्रणे दत्तांशं लिखितुम् अर्हन्ति, यथा Listbox2.Items.Add कोड्, तदा भवन्तः थ्रेड् समन्वयनं कर्तुं प्रवृत्ताः भवन्ति । अतः TThread.Synchronize इति योजयन्तु ।

मम विकासपर्यावरणम्

भिन्न-भिन्न-वातावरणेषु घटनाः भिन्नाः भवितुम् अर्हन्ति । अतः अत्र मम विकासपर्यावरणम् अस्ति : १.

डेल्फी ११ सामुदायिक संस्करणम्;

विण्डोज ११ गृहसंस्करणम्;

संकलितं चालनीयं च लक्ष्यप्रोग्रामं Win32 संस्करणम् अस्ति ।

अस्मिन् Demo इत्यस्मिन् Android इत्यस्य अन्तर्गतं उपर्युक्ताः समस्याः भविष्यन्ति वा इति परीक्षणं नास्ति । परन्तु मम विश्वासः अस्ति यत् एण्ड्रॉयड् इत्यस्य अन्तर्गतं TTask.Run इत्येतत् योजयितुं श्रेयस्करं भविष्यति।

डेमो प्रोग्राम स्थानं

अत्र उल्लिखितः Demo, Delphi संस्थापनानन्तरं यदि पूर्वनिर्धारितरूपेण संस्थापितः अस्ति तर्हि Demo कार्यक्रमः अस्ति :

C:UsersPublicDocumentsEmbarcaderoStudio22.0SamplesObject Pascalबहु-उपकरणनमूनायन्त्रसंवेदकाः सेवाश्चBluetoothBLEScanner

उपसंहारे

BLE कार्यक्रमानां विकासाय Delphi इत्यस्य उपयोगे कोऽपि समस्या नास्ति, यथा bracelet APP इत्यस्य निर्माणम् । परन्तु ज्ञातव्यं यत् TBluetoothLE नियन्त्रणस्य अनेकघटनासु अत्यधिकं कोडं न निष्पादयितुं सर्वोत्तमम् । यदि जटिलव्यापारतर्कः अस्ति तर्हि तत् पृथक् थ्रेड् मध्ये निष्पादयितुं सर्वोत्तमम् ।

Delphi कृते नवनिर्मितं TTask.Run अस्मान् थ्रेड् निष्पादने बहु कोडं क्षिप्तुं शक्नोति कोडलेखनविधिः पूर्वापेक्षया बहु सरलः यदा अस्माभिः थ्रेड् क्लास् निर्मातव्यम् आसीत् ।