यह पृष्ठ पुर्तगाली से मशीन-अनुवादित है और इसमें त्रुटियाँ हो सकती हैं। पुर्तगाली संस्करण प्रामाणिक है।
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 छूना।