मुख्य सामग्री पर जाएँ
CrossFly 100% ओपन सोर्सGitHub पर फ़ॉलो करें
CrossFlyCrossFly
शुरू करें

यह पृष्ठ पुर्तगाली से मशीन-अनुवादित है और इसमें त्रुटियाँ हो सकती हैं। पुर्तगाली संस्करण प्रामाणिक है।

Bluetooth BLE / GATT

CrossFly एक एसिंक्रोनस BLE/GATT स्टैक (dev.crossfly.device.bluetooth) का उपयोग करता है, जिसने पुराने JSR-82/SPP की जगह ली। मॉडलिंग CompletableFuture पर आधारित है।

⚠️ ईमानदारी की टिप्पणी (कोड करने से पहले पढ़ें)

core में, कई ऑपरेशन इन-मेमोरी स्टेट पर स्केलेटन हैं — BluetoothConnectionBuilder.build() खाली स्ट्रीम बनाता है, GattCharacteristic.read()/write() सिर्फ़ लोकल कैश को छूते हैं, और discoverServices() खाली सूची लौटाता है। असली रेडियो ट्रांसपोर्ट प्लेटफ़ॉर्म लॉन्चरों (Android/iOS) से आता है। मॉडलिंग (UUIDs, futures, service→characteristic→descriptor पदानुक्रम) पहले से ही निश्चित है; API पर भरोसा करें, पर हर प्लेटफ़ॉर्म पर असली डिवाइस पर परीक्षण करें।

खोज और कनेक्शन

BluetoothManager bt = BluetoothManager.getInstance();   // throws IOException

// स्कैन करें (असिंक्रोनस)
bt.scanForDevices(10, TimeUnit.SECONDS, new BluetoothManager.ScanCallback() {
   public void onSuccess(List<BluetoothDevice> devices) { /* एक चुनें */ }
   public void onError(String error) { Debug.log(error); }
});

// कनेक्ट करें (असिंक्रोनस) — एक BluetoothConnection लौटाता है
bt.connect(device, new BluetoothManager.ConnectionCallback() {
   public void onSuccess(BluetoothConnection conn) { usar(conn); }
   public void onError(String error) { Debug.log(error); }
});

*Sync वेरिएंट भी हैं (scanForDevicesSync, connectSync) — इन्हें केवल worker थ्रेड में उपयोग करें, कभी पेंट थ्रेड पर नहीं।

GATT — बैटरी पढ़ना और नोटिफ़िकेशन की सदस्यता लेना

मॉडल service → characteristic → descriptor, I/O CompletableFuture के ज़रिए:

device.discoverServices(services -> {
   GattService bateria = device.getService("0000180F-0000-1000-8000-00805F9B34FB");
   GattCharacteristic nivel = bateria.getCharacteristic("00002A19-0000-1000-8000-00805F9B34FB");

   nivel.read().thenAccept(bytes -> {
      int pct = bytes[0] & 0xFF;
      Component.onUI(() -> label.setText(pct + "%"));
   });

   nivel.enableNotifications(bytes ->                     // बदलावों की सदस्यता लेता है
      Component.onUI(() -> label.setText((bytes[0] & 0xFF) + "%")));
});

GattCharacteristic read() → CompletableFuture<byte[]>, write(byte[]) → CompletableFuture<Void>, enableNotifications(Consumer<byte[]>), और क्षमता परीक्षण canRead()/canWrite()/canNotify() को उजागर करता है।

BluetoothConnection AutoCloseable है

try (BluetoothConnection conn = bt.connectSync(device)) {   // केवल worker thread पर
   conn.write("PING".getBytes());
   byte[] resp = conn.read();
}   // खुद ही बंद हो जाता है

अच्छी प्रथाएँ

  • UI पर एसिंक्रोनस (connect(...)), *Sync केवल worker में।
  • कॉलबैक/futures Component.onUI(...) के साथ UI पर लौटें।
  • BluetoothConnection पर try-with-resources।
  • हर प्लेटफ़ॉर्म पर असली डिवाइस पर परीक्षण करें (core मॉडलिंग है; रेडियो लॉन्चर में रहता है)।

आम गलतियाँ

  • पेंट थ्रेड पर *Sync वेरिएंट कॉल करना (UI ब्लॉक करता है)।
  • यह उम्मीद करना कि core असली रेडियो I/O करेगा (यह स्केलेटन है; ट्रांसपोर्ट प्लेटफ़ॉर्म का है)।
  • thenAccept/कॉलबैक के भीतर onUI(...) के बिना UI छूना।

यह भी देखें

क्या यह पृष्ठ उपयोगी था?