JavaScript पर ब्लूटूथ डिवाइसों से संपर्क करना

Web Bluetooth API, वेबसाइटों को ब्लूटूथ डिवाइसों से संपर्क करने की अनुमति देता है.

François Beaufort
François Beaufort

अगर मैं आपसे कहूं कि वेबसाइटें आस-पास के ब्लूटूथ डिवाइसों से सुरक्षित और निजता बनाए रखने के तरीके से संपर्क कर सकती हैं, तो क्या होगा? इस तरह, धड़कन की दर मापने वाले मॉनिटर, लाइट बल्ब, और यहां तक कि कछुए भी सीधे किसी वेबसाइट से इंटरैक्ट कर सकते हैं.

अब तक, सिर्फ़ प्लैटफ़ॉर्म के खास ऐप्लिकेशन के लिए ही ब्लूटूथ डिवाइस से इंटरैक्ट किया जा सकता था. Web Bluetooth API का मकसद इसे बदलना है और इसे वेब ब्राउज़र पर भी उपलब्ध कराना है.

शुरू करने से पहले

यह दस्तावेज़ मानता है कि आपको ब्लूटूथ की कम ऊर्जा (BLE) और सामान्य एट्रिब्यूट प्रोफ़ाइल के काम करने के तरीके की कुछ बुनियादी जानकारी है.

भले ही, अभी तक Web Bluetooth API की खास बातें तय नहीं की गई हैं, लेकिन इस एपीआई को आज़माने के लिए, लेखक सक्रिय रूप से ऐसे डेवलपर खोज रहे हैं जो इस एपीआई को इस्तेमाल करना चाहते हैं. साथ ही, जानकारी पर सुझाव/राय दें या शिकायत करें और लागू करने से जुड़े सुझाव दें.

Web Bluetooth API का सबसेट ChromeOS, Android के लिए Chrome 6.0, Mac (Chrome 56) और Windows 10 (Chrome 70) में उपलब्ध है. इसका मतलब है कि आपको आस-पास मौजूद ब्लूटूथ स्मार्ट डिवाइसों को अनुरोध और कनेक्ट करने, ब्लूटूथ की विशेषताओं को पढ़ने/लिखने, GATT से जुड़ी सूचनाएं पाने, और यह जानने की सुविधा मिलेगी कि ब्लूटूथ डिवाइस डिसकनेक्ट होने पर, और यहां तक कि ब्लूटूथ डिस्क्रिप्टर पर भी कॉन्टेंट पढ़ा और लिखा जा सकता है. ज़्यादा जानकारी के लिए, MDN की ब्राउज़र के साथ काम करने की सुविधा टेबल देखें.

Linux और Windows के पुराने वर्शन के लिए, about://flags में #experimental-web-platform-features फ़्लैग चालू करें.

ऑरिजिन ट्रायल के लिए उपलब्ध है

फ़ील्ड में Web Bluetooth API का इस्तेमाल करने वाले डेवलपर से ज़्यादा से ज़्यादा सुझाव पाने के लिए, Chrome ने पहले Chrome 53 में इस सुविधा को ChromeOS, Android, और Mac के ऑरिजिन ट्रायल के तौर पर जोड़ा था.

जनवरी 2017 में परीक्षण सफलतापूर्वक खत्म हो गया है.

सुरक्षा से जुड़ी ज़रूरी शर्तें

सुरक्षा से जुड़ी समस्याओं को समझने के लिए, मेरा सुझाव है कि आप वेब ब्लूटूथ सिक्योरिटी मॉडल की पोस्ट, वेब ब्लूटूथ एपीआई की खास जानकारी पर काम कर रहे, Chrome टीम के सॉफ़्टवेयर इंजीनियर जेफ़री यास्किन की पोस्ट देखें.

सिर्फ़ एचटीटीपीएस

प्रयोग के तौर पर उपलब्ध यह एपीआई, वेब में जोड़ी गई एक नई सुविधा है. इसे सिर्फ़ सुरक्षित कॉन्टेक्स्ट के लिए उपलब्ध कराया गया है. इसका मतलब है कि आपको TLS को ध्यान में रखकर बनाना होगा.

उपयोगकर्ता जेस्चर ज़रूरी है

सुरक्षा सुविधा के तौर पर, navigator.bluetooth.requestDevice वाले ब्लूटूथ डिवाइसों को खोजना उपयोगकर्ता के जेस्चर से ट्रिगर होना चाहिए, जैसे कि टच या माउस क्लिक. हमें pointerup, click, और touchend इवेंट के बारे में जानना है.

button.addEventListener('pointerup', function(event) {
  // Call navigator.bluetooth.requestDevice
});

कोड का इस्तेमाल करें

Web Bluetooth API, JavaScript के प्रॉमिस पर बहुत ज़्यादा भरोसा करता है. अगर आप उनके बारे में नहीं जानते, तो यह बहुत अच्छा प्रॉमिसेस ट्यूटोरियल देखें. एक और जानकारी, () => {} ECMAScript 2015 के ऐरो फ़ंक्शन हैं.

ब्लूटूथ डिवाइसों के लिए अनुरोध करें

वेब ब्लूटूथ एपीआई स्पेसिफ़िकेशन के इस वर्शन की मदद से, मुख्य भूमिका में चल रही वेबसाइटों को BLE कनेक्शन की मदद से, रिमोट GATT सर्वर से कनेक्ट किया जा सकता है. इससे ब्लूटूथ 4.0 या इसके बाद के वर्शन इंस्टॉल करने वाले डिवाइसों के बीच कम्यूनिकेशन की सुविधा मिलती है.

जब कोई वेबसाइट navigator.bluetooth.requestDevice का इस्तेमाल करके, आस-पास मौजूद डिवाइसों को ऐक्सेस करने का अनुरोध करती है, तो ब्राउज़र, उपयोगकर्ता को डिवाइस चुनने की सुविधा देता है. इस तरह, ब्राउज़र उस डिवाइस को चुन सकता है या उस अनुरोध को रद्द कर सकता है.

ब्लूटूथ डिवाइस का इस्तेमाल करने वाले व्यक्ति का अनुरोध.

navigator.bluetooth.requestDevice() फ़ंक्शन में एक ज़रूरी ऑब्जेक्ट होता है, जो फ़िल्टर के बारे में बताता है. इन फ़िल्टर का इस्तेमाल सिर्फ़ उन डिवाइसों को दिखाने के लिए किया जाता है जो विज्ञापन में दी गई कुछ ब्लूटूथ GATT सेवाओं और/या डिवाइस के नाम से मेल खाते हैं.

सेवाएं फ़िल्टर

उदाहरण के लिए, ब्लूटूथ GATT बैटरी सेवा का विज्ञापन करने वाले ब्लूटूथ डिवाइसों का अनुरोध करने के लिए:

navigator.bluetooth.requestDevice({ filters: [{ services: ['battery_service'] }] })
.then(device => { /* … */ })
.catch(error => { console.error(error); });

अगर आपकी ब्लूटूथ GATT सेवा, स्टैंडर्ड ब्लूटूथ सेवाओं की सूची में नहीं है, तो ब्लूटूथ का पूरा यूयूआईडी या 16 या 32-बिट वाला छोटा फ़ॉर्म उपलब्ध कराया जा सकता है.

navigator.bluetooth.requestDevice({
  filters: [{
    services: [0x1234, 0x12345678, '99999999-0000-1000-8000-00805f9b34fb']
  }]
})
.then(device => { /* … */ })
.catch(error => { console.error(error); });

नाम फ़िल्टर

जिस डिवाइस के नाम का विज्ञापन किया जा रहा है उसके आधार पर, ब्लूटूथ डिवाइसों के लिए अनुरोध किया जा सकता है. इसके लिए, name फ़िल्टर बटन का इस्तेमाल किया जा सकता है या namePrefix फ़िल्टर बटन के साथ इस नाम के प्रीफ़िक्स को जोड़ा जा सकता है. ध्यान दें कि इस मामले में, आपको optionalServices कुंजी भी तय करनी होगी. ऐसा करके, उन सभी सेवाओं को ऐक्सेस किया जा सकेगा जो किसी सेवा फ़िल्टर में शामिल नहीं हैं. अगर ऐसा नहीं किया जाता, तो बाद में उन्हें ऐक्सेस करते समय आपको गड़बड़ी की सूचना मिलेगी.

navigator.bluetooth.requestDevice({
  filters: [{
    name: 'Francois robot'
  }],
  optionalServices: ['battery_service'] // Required to access service later.
})
.then(device => { /* … */ })
.catch(error => { console.error(error); });

निर्माता डेटा फ़िल्टर

manufacturerData फ़िल्टर बटन की मदद से, जिस डेटा का विज्ञापन दिया जा रहा है उसके मैन्युफ़ैक्चरर के डेटा के आधार पर, ब्लूटूथ डिवाइसों के लिए अनुरोध भी किया जा सकता है. यह कुंजी, ऑब्जेक्ट का कलेक्शन है. इसमें ब्लूटूथ कंपनी आइडेंटिफ़ायर कुंजी का नाम डालना ज़रूरी है.companyIdentifier आप डेटा प्रीफ़िक्स भी दे सकते हैं, जो फ़ोन बनाने वाली कंपनी के डेटा को उस ब्लूटूथ डिवाइस से फ़िल्टर करता है जो उससे शुरू होते हैं. ध्यान दें कि अगर आपको सेवा फ़िल्टर में शामिल नहीं की गई सेवाओं को ऐक्सेस करना है, तो आपको optionalServices कुंजी भी बतानी होगी. अगर ऐसा नहीं किया जाता है, तो बाद में ऐक्सेस करते समय आपको गड़बड़ी दिखेगी.

// Filter Bluetooth devices from Google company with manufacturer data bytes
// that start with [0x01, 0x02].
navigator.bluetooth.requestDevice({
  filters: [{
    manufacturerData: [{
      companyIdentifier: 0x00e0,
      dataPrefix: new Uint8Array([0x01, 0x02])
    }]
  }],
  optionalServices: ['battery_service'] // Required to access service later.
})
.then(device => { /* … */ })
.catch(error => { console.error(error); });

मैन्युफ़ैक्चरर के डेटा में मौजूद कुछ पैटर्न से मैच करने के लिए, डेटा प्रीफ़िक्स के साथ भी मास्क का इस्तेमाल किया जा सकता है. ज़्यादा जानने के लिए, ब्लूटूथ डेटा फ़िल्टर के बारे में जानकारी देखें.

बाहर रखने के लिए फ़िल्टर

navigator.bluetooth.requestDevice() में मौजूद exclusionFilters विकल्प की मदद से, कुछ डिवाइसों को ब्राउज़र पिकर से बाहर रखा जा सकता है. इसका इस्तेमाल उन डिवाइसों को हटाने के लिए किया जा सकता है जो बड़े फ़िल्टर से मिलते-जुलते हैं, लेकिन काम नहीं करते.

// Request access to a bluetooth device whose name starts with "Created by".
// The device named "Created by Francois" has been reported as unsupported.
navigator.bluetooth.requestDevice({
  filters: [{
    namePrefix: "Created by"
  }],
  exclusionFilters: [{
    name: "Created by Francois"
  }],
  optionalServices: ['battery_service'] // Required to access service later.
})
.then(device => { /* … */ })
.catch(error => { console.error(error); });

कोई फ़िल्टर नहीं

आखिर में, filters के बजाय, आस-पास मौजूद सभी ब्लूटूथ डिवाइस दिखाने के लिए acceptAllDevices बटन का इस्तेमाल किया जा सकता है. कुछ सेवाओं को ऐक्सेस करने के लिए, आपको optionalServices कुंजी भी तय करनी होगी. अगर ऐसा नहीं किया जाता है, तो बाद में ऐक्सेस करते समय आपको गड़बड़ी होगी.

navigator.bluetooth.requestDevice({
  acceptAllDevices: true,
  optionalServices: ['battery_service'] // Required to access service later.
})
.then(device => { /* … */ })
.catch(error => { console.error(error); });

ब्‍लूटूथ उपकरण से कनेक्‍ट करना

आपके पास BluetoothDevice है, तो अब क्या करें? आइए, ब्लूटूथ रिमोट GATT सर्वर से कनेक्ट करें. इस सर्वर में, सेवा और विशेषता की परिभाषाएं मौजूद होती हैं.

navigator.bluetooth.requestDevice({ filters: [{ services: ['battery_service'] }] })
.then(device => {
  // Human-readable name of the device.
  console.log(device.name);

  // Attempts to connect to remote GATT Server.
  return device.gatt.connect();
})
.then(server => { /* … */ })
.catch(error => { console.error(error); });

ब्लूटूथ की खासियत पढ़ें

यहां हम रिमोट ब्लूटूथ डिवाइस के GATT सर्वर से कनेक्ट करते हैं. अब हम एक प्राइमरी GATT सेवा पाना चाहते हैं और इस सेवा से जुड़ी एट्रिब्यूट को पढ़ना चाहते हैं. उदाहरण के लिए, डिवाइस की बैटरी के मौजूदा चार्ज लेवल को पढ़ने की कोशिश करते हैं.

आगे दिए गए उदाहरण में, battery_level, बैटरी लेवल की स्टैंडर्ड के हिसाब से खासियत है.

navigator.bluetooth.requestDevice({ filters: [{ services: ['battery_service'] }] })
.then(device => device.gatt.connect())
.then(server => {
  // Getting Battery Service…
  return server.getPrimaryService('battery_service');
})
.then(service => {
  // Getting Battery Level Characteristic…
  return service.getCharacteristic('battery_level');
})
.then(characteristic => {
  // Reading Battery Level…
  return characteristic.readValue();
})
.then(value => {
  console.log(`Battery percentage is ${value.getUint8(0)}`);
})
.catch(error => { console.error(error); });

अगर पसंद के मुताबिक ब्लूटूथ GATT की विशेषता का इस्तेमाल किया जाता है, तो service.getCharacteristic के लिए पूरा ब्लूटूथ यूयूआईडी या 16- या 32-बिट का छोटा फ़ॉर्म भरा जा सकता है.

ध्यान दें कि characteristicvaluechanged इवेंट लिसनर को किसी विशेषता पर भी जोड़ा जा सकता है, ताकि इसकी वैल्यू को पढ़ा जा सके. आने वाली GATT सूचनाओं को मैनेज करने का तरीका भी जानने के लिए, वैल्यू में बदलाव किए गए एट्रिब्यूट को पढ़ें देखें.

…
.then(characteristic => {
  // Set up event listener for when characteristic value changes.
  characteristic.addEventListener('characteristicvaluechanged',
                                  handleBatteryLevelChanged);
  // Reading Battery Level…
  return characteristic.readValue();
})
.catch(error => { console.error(error); });

function handleBatteryLevelChanged(event) {
  const batteryLevel = event.target.value.getUint8(0);
  console.log('Battery percentage is ' + batteryLevel);
}

ब्लूटूथ एट्रिब्यूट के लिए लिखें

ब्लूटूथ GATT की खासियत के बारे में लिखना, उसे पढ़ने जितना ही आसान है. इस बार, धड़कन की दर वाले मॉनिटर डिवाइस पर, एनर्जी एक्सटेंडेट फ़ील्ड की वैल्यू को 0 पर रीसेट करने के लिए, धड़कन की दर कंट्रोल पॉइंट का इस्तेमाल करते हैं.

मैं वादा करता हूं कि यहां कोई जादू नहीं है. इस बारे में धड़कन की दर कंट्रोल पॉइंट की खासियत वाले पेज पर बताया गया है.

navigator.bluetooth.requestDevice({ filters: [{ services: ['heart_rate'] }] })
.then(device => device.gatt.connect())
.then(server => server.getPrimaryService('heart_rate'))
.then(service => service.getCharacteristic('heart_rate_control_point'))
.then(characteristic => {
  // Writing 1 is the signal to reset energy expended.
  const resetEnergyExpended = Uint8Array.of(1);
  return characteristic.writeValue(resetEnergyExpended);
})
.then(_ => {
  console.log('Energy expended has been reset.');
})
.catch(error => { console.error(error); });

GATT सूचनाएं पाएं

आइए, अब देखते हैं कि डिवाइस पर धड़कन की दर मापने की खासियत में बदलाव होने पर, सूचना कैसे दी जाए:

navigator.bluetooth.requestDevice({ filters: [{ services: ['heart_rate'] }] })
.then(device => device.gatt.connect())
.then(server => server.getPrimaryService('heart_rate'))
.then(service => service.getCharacteristic('heart_rate_measurement'))
.then(characteristic => characteristic.startNotifications())
.then(characteristic => {
  characteristic.addEventListener('characteristicvaluechanged',
                                  handleCharacteristicValueChanged);
  console.log('Notifications have been started.');
})
.catch(error => { console.error(error); });

function handleCharacteristicValueChanged(event) {
  const value = event.target.value;
  console.log('Received ' + value);
  // TODO: Parse Heart Rate Measurement value.
  // See https://github.com/WebBluetoothCG/demos/blob/gh-pages/heart-rate-sensor/heartRateSensor.js
}

सूचनाओं के सैंपल में, stopNotifications() से सूचनाएं पाने की सुविधा बंद करने और जोड़े गए characteristicvaluechanged इवेंट लिसनर को हटाने का तरीका बताया गया है.

ब्लूटूथ डिवाइस से डिसकनेक्ट करना

बेहतर उपयोगकर्ता अनुभव देने के लिए, डिसकनेक्ट होने के इवेंट सुने जा सकते हैं. साथ ही, उपयोगकर्ता को फिर से कनेक्ट करने के लिए न्योता दिया जा सकता है:

navigator.bluetooth.requestDevice({ filters: [{ name: 'Francois robot' }] })
.then(device => {
  // Set up event listener for when device gets disconnected.
  device.addEventListener('gattserverdisconnected', onDisconnected);

  // Attempts to connect to remote GATT Server.
  return device.gatt.connect();
})
.then(server => { /* … */ })
.catch(error => { console.error(error); });

function onDisconnected(event) {
  const device = event.target;
  console.log(`Device ${device.name} is disconnected.`);
}

अपने वेब ऐप्लिकेशन को ब्लूटूथ डिवाइस से डिसकनेक्ट करने के लिए, device.gatt.disconnect() को भी कॉल किया जा सकता है. इससे, gattserverdisconnected इवेंट को सुनने वाले मौजूदा लोगों को ट्रिगर कर दिया जाएगा. ध्यान दें कि अगर कोई दूसरा ऐप्लिकेशन पहले से ही ब्लूटूथ डिवाइस से कनेक्ट कर रहा है, तो ब्लूटूथ डिवाइस से संपर्क करने की सुविधा बंद नहीं होगी. ज़्यादा जानकारी के लिए, डिवाइस डिसकनेक्ट करने का सैंपल और अपने-आप फिर से कनेक्ट होने का सैंपल देखें.

ब्लूटूथ डिस्क्रिप्टर पर पढ़ें और लिखें

ब्लूटूथ GATT डिस्क्रिप्टर, ऐसे एट्रिब्यूट होते हैं जो किसी एट्रिब्यूट की वैल्यू के बारे में बताते हैं. इन्हें ब्लूटूथ GATT की विशेषताओं की तरह ही पढ़ा और लिखा जा सकता है.

उदाहरण के लिए, आइए देखते हैं कि डिवाइस के हेल्थ थर्मामीटर के मेज़रमेंट इंटरवल से जुड़ी उपयोगकर्ता की जानकारी को कैसे पढ़ें.

नीचे दिए गए उदाहरण में, health_thermometer, हेल्थ Thermometer सेवा, measurement_interval मेज़रमेंट इंटरवल की विशेषता, और gatt.characteristic_user_description उपयोगकर्ता की जानकारी की विशेषता बताने वाला एट्रिब्यूट है.

navigator.bluetooth.requestDevice({ filters: [{ services: ['health_thermometer'] }] })
.then(device => device.gatt.connect())
.then(server => server.getPrimaryService('health_thermometer'))
.then(service => service.getCharacteristic('measurement_interval'))
.then(characteristic => characteristic.getDescriptor('gatt.characteristic_user_description'))
.then(descriptor => descriptor.readValue())
.then(value => {
  const decoder = new TextDecoder('utf-8');
  console.log(`User Description: ${decoder.decode(value)}`);
})
.catch(error => { console.error(error); });

हमने डिवाइस के हेल्थ Thermometer ऐप्लिकेशन के मेज़रमेंट इंटरवल का उपयोगकर्ता ब्यौरा पढ़ लिया है. आइए, अब इसे अपडेट करने और कस्टम वैल्यू लिखने का तरीका देखते हैं.

navigator.bluetooth.requestDevice({ filters: [{ services: ['health_thermometer'] }] })
.then(device => device.gatt.connect())
.then(server => server.getPrimaryService('health_thermometer'))
.then(service => service.getCharacteristic('measurement_interval'))
.then(characteristic => characteristic.getDescriptor('gatt.characteristic_user_description'))
.then(descriptor => {
  const encoder = new TextEncoder('utf-8');
  const userDescription = encoder.encode('Defines the time between measurements.');
  return descriptor.writeValue(userDescription);
})
.catch(error => { console.error(error); });

सैंपल, डेमो, और कोडलैब (कोड बनाना सीखना)

वेब ब्लूटूथ के नीचे दिए गए सभी सैंपल की जांच पूरी हो गई है. इन नमूनों का पूरा आनंद लेने के लिए, मेरी सलाह है कि आप [BLE पेरिफ़रल सिम्युलेटर Android ऐप्लिकेशन] इंस्टॉल करें, जो बैटरी सेवा, दिल की धड़कन की गति सेवा या हेल्थ थर्मामीटर सेवा के साथ एक बीएलई सहायक डिवाइस की नकल करता है.

बिगिनर

कई कार्रवाइयों को जोड़ना

हमारे खास आपके लिए चुने गए वेब ब्लूटूथ डेमो और आधिकारिक वेब ब्लूटूथ कोडलैब भी देखें.

लाइब्रेरी

  • web-bluetooth-utils एक एनपीएम मॉड्यूल है, जो एपीआई में कुछ आसान फ़ंक्शन जोड़ता है.
  • वेब ब्लूटूथ एपीआई शिम noble में उपलब्ध है. यह सबसे लोकप्रिय Node.js BLE सेंट्रल मॉड्यूल है. इससे आपको WebSocket सर्वर या अन्य प्लगिन की ज़रूरत के बिना, वेबपैक/ब्राउज़राइज़ करने की सुविधा मिलती है.
  • angular-web-ब्लूटूथ, Angular के लिए एक मॉड्यूल है. यह Web Bluetooth API को कॉन्फ़िगर करने के लिए, ज़रूरी सभी बॉयलरप्लेट को ऐब्स्ट्रैक्ट करता है.

टूल

  • वेब ब्लूटूथ का इस्तेमाल शुरू करना एक आसान वेब ऐप्लिकेशन है. यह किसी ब्लूटूथ डिवाइस से इंटरैक्ट करने के लिए, सभी JavaScript बॉयलरप्लेट कोड जनरेट करेगा. डिवाइस का नाम, सेवा, और विशेषता डालें. साथ ही, इसकी प्रॉपर्टी की जानकारी दें और आप इसका इस्तेमाल कर सकते हैं.
  • अगर आप पहले से ही एक ब्लूटूथ डेवलपर हैं, तो वेब ब्लूटूथ डेवलपर स्टूडियो प्लगिन आपके ब्लूटूथ डिवाइस के लिए वेब ब्लूटूथ JavaScript कोड भी जनरेट करेगा.

सलाह

ब्लूटूथ इंटरनल पेज, Chrome में about://bluetooth-internals पर उपलब्ध है, ताकि आप आस-पास मौजूद सभी ब्लूटूथ डिवाइसों की जांच कर सकें: स्टेटस, सेवाएं, विशेषताएं, और डिस्क्रिप्टर.

Chrome में ब्लूटूथ को डीबग करने के लिए, इंटरनल पेज का स्क्रीनशॉट
ब्लूटूथ डिवाइसों को डीबग करने के लिए, Chrome में अंदरूनी पेज.

हमारा सुझाव है कि आप वेब ब्लूटूथ की गड़बड़ियों को फ़ाइल करने का तरीका वाला आधिकारिक पेज देखें. ऐसा इसलिए, क्योंकि कभी-कभी ब्लूटूथ को डीबग करना मुश्किल हो सकता है.

आगे क्या करना है

ब्राउज़र और प्लैटफ़ॉर्म को लागू करने की स्थिति देखें और जानें कि अभी Web Bluetooth API के कौनसे हिस्से लागू किए जा रहे हैं.

यह अब भी अधूरा है, लेकिन यहां एक झलक दी गई है कि आने वाले समय में क्या उम्मीद की जा सकती है:

  • आस-पास के BLE विज्ञापनों के लिए स्कैन, navigator.bluetooth.requestLEScan() के साथ होगा.
  • serviceadded का नया इवेंट, खोजी गई नई ब्लूटूथ GATT सेवाओं को ट्रैक करेगा. वहीं, serviceremoved इवेंट, हटाई गई सेवाओं को ट्रैक करेगा. ब्लूटूथ GATT सेवा से किसी विशेषता और/या डिस्क्रिप्टर को जोड़ने या हटाने पर, एक नया servicechanged इवेंट ट्रिगर हो जाएगा.

एपीआई के साथ काम करता है

क्या आपको Web Bluetooth API का इस्तेमाल करना है? आपकी सार्वजनिक मदद से Chrome टीम को सुविधाओं को प्राथमिकता देने में मदद मिलती है. साथ ही, दूसरे ब्राउज़र वेंडर को यह भी पता चलता है कि उनकी मदद करना कितना ज़रूरी है.

हैशटैग #WebBluetooth का इस्तेमाल करके @ChromiumDev को एक ट्वीट भेजें और हमें बताएं कि आप उसका इस्तेमाल कहां और कैसे कर रहे हैं.

रिसॉर्स

स्वीकार हैं

इस लेख को पढ़ने के लिए, केसी बास्क का धन्यवाद. हीरो इमेज, बोल्डर, अमेरिका के SparkFun Electronics से मिली है.