Bluetooth

Dokumen ini menjelaskan cara menggunakan Bluetooth, Soket Bluetooth, dan Bluetooth Rendah Energy API untuk berkomunikasi dengan perangkat Bluetooth dan Bluetooth Hemat Energi.

Untuk informasi latar belakang tentang Bluetooth, lihat spesifikasi Bluetooth resmi.

Persyaratan manifes

Untuk Aplikasi Chrome yang menggunakan Bluetooth, tambahkan entri bluetooth ke manifes dan tentukan jika sesuai dengan UUID profil, protokol, atau layanan yang ingin Anda terapkan serta apakah Anda ingin menerapkannya dengan soket dan/atau API Energi Rendah.

Misalnya untuk implementasi socket:

"bluetooth": {
  "uuids": [ "1105", "1106" ],
  "socket": true
}

Dan untuk penerapan Hemat Energi:

"bluetooth": {
  "uuids": [ "180D", "1809", "180F" ],
  "low_energy": true
}

Untuk mengakses status adaptor saja, menemukan perangkat di sekitar, dan mendapatkan informasi dasar tentang perangkat, hanya entri itu sendiri yang diperlukan:

"bluetooth": {}

Informasi adaptor

Mendapatkan status adaptor

Untuk mendapatkan status adaptor Bluetooth, gunakan metode bluetooth.getAdapterState:

chrome.bluetooth.getAdapterState(function(adapter) {
  console.log("Adapter " + adapter.address + ": " + adapter.name);
});

Notifikasi adaptor

Peristiwa bluetooth.onAdapterStateChanged dikirim setiap kali status adaptor berubah. Hal ini dapat digunakan, misalnya, untuk menentukan kapan radio adaptor dinyalakan atau dimatikan.

var powered = false;
chrome.bluetooth.getAdapterState(function(adapter) {
  powered = adapter.powered;
});

chrome.bluetooth.onAdapterStateChanged.addListener(
  function(adapter) {
    if (adapter.powered != powered) {
      powered = adapter.powered;
      if (powered) {
        console.log("Adapter radio is on");
      } else {
        console.log("Adapter radio is off");
      }
    }
  });

Informasi perangkat

Mencantumkan perangkat umum

Untuk mendapatkan daftar perangkat yang dikenal oleh adaptor Bluetooth, gunakan bluetooth.getDevices berikut:

chrome.bluetooth.getDevices(function(devices) {
  for (var i = 0; i < devices.length; i++) {
    console.log(devices[i].address);
  }
});

Semua perangkat akan ditampilkan, termasuk perangkat yang disambungkan dan perangkat yang baru ditemukan. Tidak akan memulai penemuan perangkat baru (lihat Menemukan perangkat di sekitar).

Menerima notifikasi perangkat

Daripada berulang kali memanggil bluetooth.getDevices, Anda dapat menggunakan bluetooth.onDeviceAdded, bluetooth.onDeviceChanged, dan bluetooth.onDeviceRemoved peristiwa untuk menerima notifikasi.

Peristiwa bluetooth.onDeviceAdded dikirim setiap kali perangkat ditemukan oleh adaptor atau membuat koneksi ke adaptor:

chrome.bluetooth.onDeviceAdded.addListener(function(device) {
  console.log(device.address);
});

Menambahkan pemroses untuk peristiwa ini tidak memulai penemuan perangkat (lihat Menemukan di sekitar perangkat).

Perubahan pada perangkat, termasuk perangkat yang sebelumnya ditemukan dan disambungkan, diberi tahu oleh Peristiwa bluetooth.onDeviceChanged:

chrome.bluetooth.onDeviceChanged.addListener(function(device) {
  console.log(device.address);
});

Terakhir, peristiwa bluetooth.onDeviceRemoved dikirim setiap kali perangkat yang disambungkan dihapus dari sistem, atau perangkat yang ditemukan baru-baru ini:

chrome.bluetooth.onDeviceRemoved.addListener(function(device) {
  console.log(device.address);
});

Menemukan perangkat di sekitar

Untuk mulai menemukan perangkat di sekitar, gunakan metode bluetooth.startDiscovery. Penemuan dapat memerlukan banyak resource, jadi Anda harus memanggil bluetooth.stopDiscovery jika sudah selesai.

Anda harus memanggil bluetooth.startDiscovery setiap kali aplikasi perlu menemukan perangkat di sekitar. Jangan membuat panggilan bersyarat pada properti discovering dari bluetooth.AdapterState. Tujuan akan berhasil meskipun aplikasi lain menemukan perangkat di sekitar, dan akan memastikan adaptor terus melakukan penemuan setelah aplikasi lain itu berhenti.

Informasi tentang setiap perangkat yang baru ditemukan diterima menggunakan bluetooth.onDeviceAdded peristiwa. Untuk perangkat yang ditemukan baru-baru ini atau yang sebelumnya telah disambungkan dengan atau terhubung, acara tidak akan dikirim. Sebagai gantinya, Anda harus memanggil bluetooth.getDevices untuk mendapatkan informasi saat ini, dan menggunakan peristiwa bluetooth.onDeviceChanged untuk mendapatkan notifikasi mengubah informasi tersebut sebagai hasil penemuannya.

Contoh:

var device_names = {};
var updateDeviceName = function(device) {
  device_names[device.address] = device.name;
};
var removeDeviceName = function(device) {
  delete device_names[device.address];
}

// Add listeners to receive newly found devices and updates
// to the previously known devices.
chrome.bluetooth.onDeviceAdded.addListener(updateDeviceName);
chrome.bluetooth.onDeviceChanged.addListener(updateDeviceName);
chrome.bluetooth.onDeviceRemoved.addListener(removeDeviceName);

// With the listeners in place, get the list of devices found in
// previous discovery sessions, or any currently active ones,
// along with paired devices.
chrome.bluetooth.getDevices(function(devices) {
  for (var i = 0; i < devices.length; i++) {
    updateDeviceName(devices[i]);
  }
});

// Now begin the discovery process.
chrome.bluetooth.startDiscovery(function() {
  // Stop discovery after 30 seconds.
  setTimeout(function() {
    chrome.bluetooth.stopDiscovery(function() {});
  }, 30000);
});

Jika pengguna menonaktifkan radio Bluetooth, semua sesi penemuan akan diakhiri dan tidak dilanjutkan secara otomatis ketika radio dinyalakan. Jika hal ini penting bagi aplikasi Anda, Anda harus memperhatikan bluetooth.onAdapterStateChanged. Jika properti discovering berubah menjadi false, aplikasi Anda harus memanggil bluetooth.startDiscovery lagi untuk melanjutkan. Hati-hati terhadap proses penemuan yang intensif sumber daya.

Mengidentifikasi perangkat

Sejumlah opsi disediakan untuk mengidentifikasi perangkat yang dikembalikan oleh bluetooth.getDevices dan peristiwa terkait.

Jika perangkat mendukung spesifikasi ID Perangkat Bluetooth, beberapa properti akan ditambahkan ke objek Device berisi kolom yang didefinisikan oleh spesifikasi tersebut. Contoh:

chrome.bluetooth.getDevices(function(devices) {
  for (var i = 0; i < devices.length; i++) {
    if (devices[0].vendorIdSource != undefined) {
      console.log(devices[0].address + ' = ' +
                  devices[0].vendorIdSource + ':' +
                  devices[0].vendorId.toString(16) + ':' +
                  devices[0].productId.toString(16) + ':' +
                  devices[0].deviceId.toString(16));
    }
  }
});

Spesifikasi ID Perangkat biasanya cukup untuk mengidentifikasi model tertentu, dan bahkan revisi, suatu perangkat dari vendor. Jika tidak ada, Anda harus mengandalkan informasi tentang class atau jenis perangkat, secara opsional digabungkan dengan awalan produsen di address.

Sebagian besar perangkat Bluetooth menyediakan informasi {i>Class of Device<i} sebagai {i>bit-field<i} yang ditafsirkan sesuai dengan dokumen Nomor yang Ditetapkan Baseband. Kolom bit ini tersedia di deviceClass saat ini.

chrome.bluetooth.getDevices(function(devices) {
  for (var i = 0; i < devices.length; i++) {
    if (devices[0].vendorIdSource != undefined) {
      console.log(devices[0].address + ' = ' +
                  devices[0].deviceClass.toString(16));
    }
  }
});

Mengurai kolom dapat menjadi hal yang rumit sehingga untuk jenis perangkat yang paling umum, Chrome akan menangani hal ini untuk Anda dan menetapkan kolom type. Jika hal ini tidak tersedia, atau tidak cukup untuk kebutuhan Anda, Anda harus mengurai deviceClass sendiri.

chrome.bluetooth.getDevices(function(devices) {
  for (var i = 0; i < devices.length; i++) {
    if (devices[0].vendorIdSource != undefined) {
      console.log(devices[0].address + ' = ' + devices[0].type);
    }
  }
});

Menggunakan RFCOMM dan L2CAP

Aplikasi Chrome dapat membuat koneksi ke perangkat apa pun yang mendukung layanan RFCOMM atau L2CAP. Hal ini mencakup sebagian besar perangkat Bluetooth klasik di pasaran.

Menyambungkan ke soket

Untuk membuat koneksi ke perangkat, Anda memerlukan tiga hal. Soket untuk membuat koneksi dengan, dibuat menggunakan bluetoothSocket.create; alamat perangkat yang ingin Anda sambungkan, dan UUID layanan itu sendiri.

Sebelum membuat koneksi, Anda harus memverifikasi bahwa adaptor menyadari perangkat dengan menggunakan bluetooth.getDevice atau API penemuan perangkat.

Informasi yang diperlukan untuk membuat koneksi yang mendasarinya, termasuk apakah RFCOMM atau Protokol L2CAP harus digunakan dan saluran mana atau PSM, diperoleh menggunakan penemuan SDP pada perangkat seluler.

Contoh:

var uuid = '1105';
var onConnectedCallback = function() {
  if (chrome.runtime.lastError) {
    console.log("Connection failed: " + chrome.runtime.lastError.message);
  } else {
    // Profile implementation here.
  }
};

chrome.bluetoothSocket.create(function(createInfo) {
  chrome.bluetoothSocket.connect(createInfo.socketId,
    device.address, uuid, onConnectedCallback);
});

Simpan handle ke socketId agar Anda nanti dapat mengirim data (bluetoothSocket.send) ke socketId ini .

Menerima dari dan mengirim ke soket

Penerimaan data dari dan pengiriman ke soket menggunakan objek ArrayBuffer. Untuk mempelajari ArrayBuffers, lihat ringkasan, array berjenis JavaScript, dan tutorial, Cara mengonversi ArrayBuffer ke dan dari String.

Untuk mengirim data yang Anda miliki di arrayBuffer, gunakan bluetoothSocket.send:

chrome.bluetoothSocket.send(socketId, arrayBuffer, function(bytes_sent) {
  if (chrome.runtime.lastError) {
    console.log("Send failed: " + chrome.runtime.lastError.message);
  } else {
    console.log("Sent " + bytes_sent + " bytes")
  }
})

Berbeda dengan metode untuk mengirim data, data diterima dalam peristiwa (bluetoothSocket.onReceive. Soket dibuat tanpa jeda (lihat bluetoothSocket.setPaused) jadi pemroses untuk peristiwa ini biasanya ditambahkan antara bluetoothSocket.create dan bluetoothSocket.connect.

chrome.bluetoothSocket.onRecieve.addListener(function(receiveInfo) {
  if (receiveInfo.socketId != socketId)
    return;
  // receiveInfo.data is an ArrayBuffer.
});

Menerima error dan pemutusan soket

Agar diberi tahu tentang error soket, termasuk pemutusan koneksi, tambahkan pemroses ke bluetoothSocket.onReceiveError.

chrome.bluetoothSocket.onReceiveError.addListener(function(errorInfo) {
  // Cause is in errorInfo.error.
  console.log(errorInfo.errorMessage);
});

Memutuskan sambungan dari soket

Untuk menutup koneksi dan memutuskan sambungan, gunakan bluetoothSocket.disconnect.

chrome.bluetoothSocket.disconnect(socketId);

Layanan publikasi

Selain membuat sambungan keluar ke perangkat, Aplikasi Chrome dapat memublikasikan layanan yang mungkin digunakan oleh perangkat apa pun yang mendukung RFCOMM atau L2CAP.

Mendengarkan di soket

Ada dua jenis layanan yang dipublikasikan. RFCOMM adalah skrip yang paling umum digunakan dan mencakup sebagian besar perangkat dan profil:

var uuid = '1105';
chrome.bluetoothSocket.create(function(createInfo) {
  chrome.bluetoothSocket.listenUsingRfcomm(createInfo.socketId,
    uuid, onListenCallback);
});

L2CAP adalah jenis perangkat yang lain dan mencakup jenis perangkat lain dan penggunaan khusus vendor seperti {i>firmware<i} mengupload.

var uuid = '0b87367c-f188-47cd-bc20-a5f4f70973c6';
chrome.bluetoothSocket.create(function(createInfo) {
  chrome.bluetoothSocket.listenUsingL2cap(createInfo.socketId,
    uuid, onListenCallback);
});

Dalam kedua kasus tersebut, bluetoothSocket.ListenOptions opsional dapat diteruskan untuk mengalokasikan atau PSM. Callback menunjukkan error melalui chrome.runtime.lastError dan berhasil sebaliknya. Simpan handle untuk socketId agar Anda dapat menerima koneksi nanti (bluetoothSocket.onAccept) dari soket ini.

Menerima koneksi klien

Koneksi klien diterima dan diteruskan ke aplikasi Anda melalui bluetoothSocket.onAccept.

chrome.bluetoothSocket.onAccept.addListener(function(acceptInfo) {
  if (info.socketId != serverSocketId)
    return;

  // Say hello...
  chrome.bluetoothSocket.send(acceptInfo.clientSocketId,
    data, onSendCallback);

  // Accepted sockets are initially paused,
  // set the onReceive listener first.
  chrome.bluetoothSocket.onReceive.addListener(onReceive);
  chrome.bluetoothSocket.setPaused(false);
});

Berhenti menerima koneksi klien

Untuk berhenti menerima koneksi klien dan membatalkan publikasi layanan, gunakan bluetoothSocket.disconnect.

chrome.bluetoothSocket.disconnect(serverSocketId);

Berinteraksi dengan perangkat Hemat Energi

Bluetooth Energi Rendah atau (Bluetooth Smart) adalah teknologi nirkabel yang ditujukan untuk mengurangi daya pengguna. Bluetooth Low Energy API memungkinkan aplikasi menerapkan peran sentral dalam koneksi LE ke periferal. Bagian berikut menjelaskan cara menemukan, menghubungkan, dan berinteraksi dengan periferal Bluetooth Hemat Energi.

Menemukan dan menghubungkan ke periferal

Seperti perangkat Bluetooth tradisional, periferal LE dapat ditemukan menggunakan metode yang dijelaskan di Menemukan perangkat di sekitar . Perangkat LE membuat dirinya dapat ditemukan dengan mengirimkan paket data yang disebut "Data Iklan" dan perangkat dikatakan dalam mode iklan. Data iklan mungkin berisi UUID layanan yang tersedia di perangkat. Jika ada, UUID ini akan dapat diakses menggunakan properti uuids dari objek bluetooth.Device yang sesuai.

Setelah ditemukan, perangkat LE dapat dihubungkan dengan memanggil bluetoothLowEnergy.connect sehingga aplikasi tersebut dapat berinteraksi dengan layanannya:

chrome.bluetooth.onDeviceAdded.addListener(function(device) {
  var uuid = '0000180d-0000-1000-8000-00805f9b34fb';
  if (!device.uuids || device.uuids.indexOf(uuid) < 0)
    return;

  // The device has a service with the desired UUID.
  chrome.bluetoothLowEnergy.connect(device.address, function () {
    if (chrome.runtime.lastError) {
      console.log('Failed to connect: ' + chrome.runtime.lastError.message);
      return;
    }

    // Connected! Do stuff...
    ...
  });
});

Setelah terhubung, properti connected dari objek bluetooth.Device yang sesuai akan memiliki nilai true. Memanggil bluetoothLowEnergy.connect akan menetapkan klaim oleh aplikasi pada koneksi fisik ke perangkat. Koneksi fisik ke perangkat dapat dilakukan tanpa pernah memanggil bluetoothLowEnergy.connect (misalnya karena aplikasi lain). Di beberapa dalam hal ini, meskipun aplikasi Anda masih bisa berinteraksi dengan layanan perangkat, aplikasi itu selalu panggil bluetoothLowEnergy.connect untuk mencegah aplikasi lain memutuskan sambungan tautan fisik.

Setelah aplikasi Anda tidak perlu terhubung lagi, aplikasi tersebut dapat menghapus klaimnya atas koneksi tersebut dengan memanggil bluetoothLowEnergy.disconnect:

chrome.bluetoothLowEnergy.disconnect(deviceAddress);

Perhatikan bahwa ini tidak berarti menghancurkan tautan fisik ke perangkat, karena mungkin ada aplikasi yang memiliki koneksi aktif ke perangkat. Terkadang perangkat dapat menjadi terputus karena alasan di luar kendali aplikasi (mis. jika perangkat menghilang atau secara eksplisit terputus oleh pengguna melalui utilitas sistem operasi). Aplikasi Anda harus mengamati peristiwa bluetooth.onDeviceChanged untuk mendapatkan notifikasi perubahan ke koneksi dan hubungkan kembali jika perlu.

Setelah terhubung, perangkat yang menjalankan Chrome akan berada di peran pusat, sedangkan perangkat jarak jauh disebut berada dalam peran periferal. Pada titik ini, aplikasi Anda dapat berinteraksi dengan layanan pada perangkat menggunakan metode yang dijelaskan di bagian berikut. Catatan: API saat ini tidak mendukung tindakan sebagai periferal LE; aplikasi hanya dapat menerapkan peran utamanya.

Layanan, Karakteristik, dan Deskripsi

Bluetooth Hemat Energi didasarkan pada protokol permintaan-respons sederhana yang disebut Protokol Atribut (ATT). Dengan menggunakan ATT, perangkat pusat berinteraksi dengan atribut yang disebut di perangkat periferal dengan mematuhi profil Bluetooth khusus yang disebut Profil Atribut Generik (GATT). GATT mendefinisikan konsep tingkat tinggi berikut:

  • Layanan: Layanan GATT mewakili kumpulan data dan perilaku terkait untuk menyelesaikan fungsi tertentu dari suatu perangkat. Misalnya, pemantau detak jantung biasanya akan memiliki setidaknya satu "Layanan Detak Jantung". Informasi tentang layanan GATT terdapat dalam bluetoothLowEnergy.Service.
  • Karakteristik: Karakteristik GATT adalah elemen data dasar yang digunakan untuk membangun layanan GATT, yang berisi nilai beserta properti yang menentukan cara akses nilai tersebut. Misalnya, "Layanan Detak Jantung" memiliki fitur "Pengukuran Detak Jantung" karakteristik, yang digunakan untuk memperoleh nilai detak jantung pengguna. Informasi tentang karakteristik GATT terdapat dalam bluetoothLowEnergy.Characteristic.
  • Deskripsi: Deskriptor karakteristik GATT berisi informasi lebih lanjut tentang suatu karakteristik. Informasi tentang deskripsi karakteristik GATT terdapat dalam bluetoothLowEnergy.Descriptor.

API Bluetooth Low Energy memungkinkan aplikasi menemukan informasi tentang layanan, karakteristik, dan deskriptor dengan memanggil bluetoothLowEnergy.getServices, bluetoothLowEnergy.getCharacteristics, dan bluetoothLowEnergy.getDescriptors. Aplikasi dapat memfilter layanan, karakteristik, dan deskripsi dengan membandingkan kolom uuid dengan UUID GATT yang diinginkan:

chrome.bluetoothLowEnergy.getServices(deviceAddress, function(services) {
  ...
  for (var i = 0; i < services.length; i++) {
    if (services[i].uuid == HEART_RATE_SERVICE_UUID) {
      heartRateService = services[i];
      break;
    }
  }
  ...
});

Setiap layanan, karakteristik, dan deskriptor yang dapat diakses melalui API akan diberi ID instance, yang dapat diperoleh menggunakan kolom instanceId. ID instance ini dapat digunakan untuk mengidentifikasi objek GATT dan melakukan operasi khusus pada objek tersebut:

chrome.bluetoothLowEnergy.getCharacteristics(heartRateService.instanceId,
                                             function(chracteristics) {
  ...
  for (var i = 0; i < characteristics.length; i++) {
    if (characteristics[i].uuid == HEART_RATE_MEASUREMENT_UUID) {
      measurementChar = characteristics[i];
      break;
    }
  }
  ...
  chrome.bluetoothLowEnergy.getDescriptors(measurementChar.instanceId,
                                           function(descriptors) {
    ...
  });
});

Peristiwa layanan

Setelah perangkat terhubung, Chrome akan menemukan layanannya. Saat setiap layanan ditemukan dan dihapus, aplikasi akan menerima sertifikat bluetoothLowEnergy.onServiceAdded dan Peristiwa bluetoothLowEnergy.onServiceRemoved:

  var initializeService = function(service) {
    if (!service) {
      console.log('No service selected!');
      // Reset UI, etc.
      ...
      return;
    }

    myService = service;

    // Get all the characteristics and descriptors and bootstrap the app.
    ...
  };

  chrome.bluetoothLowEnergy.onServiceAdded.addListener(function(service) {
    if (service.uuid == MY_SERVICE_UUID)
      initializeService(service);
  });

  chrome.bluetoothLowEnergy.onServiceRemoved.addListener(function(service) {
    if (service.instanceId == myService.instanceId)
      initializeService(null);
  });

Chrome akan menemukan semua karakteristik dan deskripsi layanan secara asinkron, lalu mengirimkan bluetoothLowEnergy.onServiceAdded setelah penemuan selesai. Jika koneksi ke perangkat periferal akan dihentikan, Chrome akan menghapus semua layanan terkait dan mengirimkan bluetoothLowEnergy.onServiceRemoved.

Beberapa periferal dapat mengubah layanannya, misalnya karakteristik suatu layanan dapat berubah atau layanan mungkin ditambahkan dan dihapus sepenuhnya. Chrome memberi tahu aplikasi tentang perubahan tersebut menggunakan bluetoothLowEnergy.onServiceChanged, bluetoothLowEnergy.onServiceAdded, dan Peristiwa bluetoothLowEnergy.onServiceRemoved.

  chrome.bluetoothLowEnergy.onServiceChanged.addListener(function(service) {
    if (service.instanceId != myService.instanceId)
      return;

    updateMyService(service);
  });

Membaca dan menulis nilai karakteristik

Karakteristik GATT mengkodekan satu aspek layanannya. Aplikasi pusat membaca, menindaklanjuti, dan mengubah status layanan periferal dengan beroperasi berdasarkan nilai karakteristik. Karakteristik adalah urutan byte dan artinya didefinisikan oleh spesifikasi tingkat tinggi yang mendefinisikan karakteristik tertentu. Misalnya, nilai karakteristik Pengukuran Detak Jantung mengenkode detak jantung pengguna dan jumlah total kalori yang telah dibakar, sedangkan Sensor Tubuh Karakteristik lokasi mengenkode sensor detak jantung di dalam tubuh.

Chrome menyediakan metode bluetoothLowEnergy.readCharacteristicValue untuk membaca nilai karakteristik:

chrome.bluetoothLowEnergy.readCharacteristicValue(chrc.instanceId,
                                                  function(result) {
  if (chrome.runtime.lastError) {
    console.log('Failed to read value: ' + chrome.runtime.lastError.message);
    return;
  }

  var bytes = new Uint8Array(result.value);

  // Do stuff with the bytes.
  ...
});

Beberapa karakteristik dapat ditulis, terutama yang berperilaku sebagai "{i>Control Points<i}", di mana menulis nilai tersebut memiliki efek samping. Misalnya, karakteristik Titik Kontrol Detak Jantung digunakan untuk memberi tahu sensor detak jantung untuk mereset jumlah total kalori yang terbakar dan hanya mendukung penulisan. Kepada mencapai hal ini, Chrome menyediakan metode bluetoothLowEnergy.writeCharacteristicValue:

var myBytes = new Uint8Array([ ... ]);
chrome.bluetoothLowEnergy.writeCharacteristicValue(chrc.instanceId,
                                                   myBytes.buffer,
                                                   function() {
  if (chrome.runtime.lastError) {
    console.log('Failed to write value: ' +
                chrome.runtime.lastError.message);
    return;
  }

  // Value is written now.
});

Deskripsi karakteristik berperilaku dengan cara yang sama dan dapat dibaca dan/atau dapat ditulis. Chrome menyediakan nilai bluetoothLowEnergy.readDescriptorValue dan bluetoothLowEnergy.writeDescriptorValue metode untuk membaca dan menulis nilai deskriptor.

Untuk memeriksa apakah karakteristik mendukung pembacaan atau penulisan, aplikasi dapat memeriksa properties kolom objek bluetoothLowEnergy.Characteristic. Meskipun kolom ini tidak berisi informasi tentang persyaratan keamanan untuk mengakses suatu nilai, hal itu menjelaskan nilai mana yang didukung oleh karakteristik secara umum.

Menangani notifikasi nilai

Beberapa karakteristik membuat nilainya diketahui menggunakan notifikasi atau indikasi. Misalnya, Karakteristik Pengukuran Detak Jantung tidak dapat dibaca atau ditulis tetapi mengirim pembaruan pada nilai saat ini dengan interval yang teratur. Aplikasi dapat mendengarkan notifikasi ini menggunakan bluetoothLowEnergy.onCharacteristicValueChanged.

  chrome.bluetoothLowEnergy.onCharacteristicValueChanged.addListener(
      function(chrc) {
    if (chrc.instanceId != myCharId)
      return;

    var bytes = new Uint8Array(chrc.value);

    // Do stuff with the bytes.
    ...
  });

Meskipun karakteristik mendukung notifikasi/indikasi, fitur tersebut tidak diaktifkan secara default. Channel aplikasi harus memanggil metode bluetoothLowEnergy.startCharacteristicNotifications dan Metode bluetoothLowEnergy.stopCharacteristicNotifications untuk memulai atau berhenti menerima Peristiwa bluetoothLowEnergy.onCharacteristicValueChanged.

  // Start receiving characteristic value notifications.
  var notifying = false;
  chrome.bluetoothLowEnergy.startCharacteristicNotifications(chrc.instanceId,
                                                             function() {
    if (chrome.runtime.lastError) {
      console.log('Failed to enable notifications: ' +
                  chrome.runtime.lastError.message);
      return;
    }

    notifying = true;
  });

  ...

  // No longer interested in notifications from this characteristic.
  if (notifying) {
    chrome.bluetoothLowEnergy.stopCharacteristicNotifications(
        chrc.instanceId);
  }

Setelah notifikasi dimulai, aplikasi akan menerima bluetoothLowEnergy.onCharacteristicValueChanged setiap kali notifikasi atau indikasi yang diterima dari karakteristik. Jika karakteristik mendukung operasi baca, maka peristiwa ini juga akan dikirim setelah panggilan ke bluetoothLowEnergy.readCharacteristicValue berhasil. Ini memungkinkan aplikasi untuk menyatukan alur kontrol pembaruan nilai yang dipicu melalui permintaan baca dan notifikasi:

  chrome.bluetoothLowEnergy.onCharacteristicValueChanged.addListener(
      function(chrc) {
    // Process the value.
    ...
  });

  chrome.bluetoothLowEnergy.startCharacteristicNotifications(chrc.instanceId,
                                                             function() {
    // Notifications started. Read the initial value.
    chrome.bluetoothLowEnergy.readCharacteristicValue(chrc.instanceId,
                                                      function(result) {
      ...
      // No need to do anything here since onCharacteristicValueChanged
      // will handle it.
    });
  });

Jika karakteristik mendukung notifikasi, kolom properties-nya akan berisi baik "notify" atau "indicate".

CATATAN: Jika karakteristik mendukung notifikasi/indikasi, karakteristik tersebut akan memiliki opsi "Klien Konfigurasi Karakteristik" untuk mengaktifkan/menonaktifkan notifikasi. Chrome tidak mengizinkan aplikasi untuk menulis ke deskriptor ini. Sebagai gantinya, aplikasi harus menggunakan bluetoothLowEnergy.startCharacteristicNotifications dan Metode bluetoothLowEnergy.stopCharacteristicNotifications untuk mengontrol perilaku notifikasi.