Bluetooth

Dokumen ini menjelaskan cara menggunakan API Bluetooth, Soket Bluetooth, dan Bluetooth Low Energy 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, UUID profil, protokol, atau layanan yang ingin Anda implementasikan, serta apakah Anda ingin menerapkannya dengan soket dan/atau API Low Energy.

Misalnya untuk implementasi soket:

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

Dan untuk implementasi 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. Parameter ini dapat digunakan, misalnya, untuk menentukan kapan radio adaptor dinyalakan atau dinonaktifkan.

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 yang diketahui

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

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

Semua perangkat dikembalikan, termasuk perangkat yang disambungkan dan perangkat yang baru-baru ini ditemukan. Tindakan ini tidak akan memulai penemuan perangkat baru (lihat Menemukan perangkat di sekitar).

Menerima notifikasi perangkat

Daripada berulang kali memanggil bluetooth.getDevices, Anda dapat menggunakan peristiwa bluetooth.onDeviceAdded, bluetooth.onDeviceChanged, dan bluetooth.onDeviceRemoved 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 akan memulai penemuan perangkat (lihat Menemukan perangkat di sekitar).

Perubahan pada perangkat, termasuk perangkat yang sebelumnya ditemukan dan akan disambungkan, akan 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 belum dilihat baru-baru ini:

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

Menemukan perangkat di sekitar

Untuk memulai penemuan perangkat di sekitar, gunakan metode bluetooth.startDiscovery. Penemuan dapat memerlukan banyak resource sehingga Anda harus memanggil bluetooth.stopDiscovery setelah selesai.

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

Informasi tentang setiap perangkat yang baru ditemukan akan diterima menggunakan peristiwa bluetooth.onDeviceAdded. Untuk perangkat yang baru-baru ini ditemukan, atau yang sebelumnya disambungkan dengan atau terhubung, peristiwa tidak akan dikirim. Sebagai gantinya, Anda harus memanggil bluetooth.getDevices untuk mendapatkan informasi terbaru, dan menggunakan peristiwa bluetooth.onDeviceChanged agar diberi tahu perubahan pada informasi tersebut sebagai hasil dari penemuan.

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 berakhir dan tidak dilanjutkan secara otomatis saat radio diaktifkan. Jika ini penting bagi aplikasi, Anda harus menonton peristiwa bluetooth.onAdapterStateChanged. Jika properti discovering berubah menjadi false, aplikasi Anda harus memanggil bluetooth.startDiscovery lagi untuk melanjutkan. Berhati-hatilah terhadap sifat penemuan yang intensif sumber daya.

Mengidentifikasi perangkat

Sejumlah opsi tersedia untuk mengidentifikasi perangkat yang ditampilkan oleh bluetooth.getDevices dan peristiwa terkait.

Jika perangkat mendukung spesifikasi ID Perangkat Bluetooth, beberapa properti akan ditambahkan ke objek Perangkat yang berisi kolom yang ditentukan 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, perangkat dari vendor. Jika tidak ada, Anda harus mengandalkan informasi tentang class atau jenis perangkat, yang secara opsional dikombinasikan dengan awalan produsen di address.

Sebagian besar perangkat Bluetooth menyediakan informasi Class of Device sebagai kolom bit yang ditafsirkan sesuai dengan dokumen Baseband Assigned Numbers. Kolom bit ini tersedia di properti deviceClass.

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));
    }
  }
});

Penguraian kolom dapat menjadi proses yang rumit, sehingga Chrome akan menangani hal ini untuk jenis perangkat yang paling umum dan menetapkan kolom type. Jika parameter ini tidak tersedia, atau tidak cukup untuk kebutuhan, 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. Ini termasuk sebagian besar perangkat Bluetooth klasik di pasar.

Menghubungkan ke soket

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

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

Informasi yang diperlukan untuk membuat koneksi dasar, termasuk apakah protokol RFCOMM atau L2CAP harus digunakan dan saluran atau PSM mana, yang diperoleh menggunakan penemuan SDP di perangkat.

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 sehingga Anda dapat mengirim data (bluetoothSocket.send) ke soket ini pada lain waktu.

Menerima dari dan mengirim ke soket

Menerima data dari dan mengirim ke soket menggunakan objek ArrayBuffer. Untuk mempelajari ArrayBuffer, 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 yang mengirim data, data diterima dalam peristiwa (bluetoothSocket.onReceive. Soket dibuat tanpa jeda (lihat bluetoothSocket.setPaused) sehingga 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 kesalahan dan pemutusan soket

Agar mendapatkan notifikasi terkait error soket, termasuk pemutusan koneksi, tambahkan pemroses ke peristiwa 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 soket, gunakan bluetoothSocket.disconnect.

chrome.bluetoothSocket.disconnect(socketId);

Layanan penerbitan

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

Mendengarkan di soket

Dua jenis layanan yang dipublikasikan didukung. RFCOMM adalah 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 keduanya dan mencakup jenis perangkat lain serta penggunaan khusus vendor seperti upload firmware.

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 saluran atau PSM tertentu. Callback menunjukkan error melalui chrome.runtime.lastError dan jika tidak berhasil. Simpan handle ke socketId sehingga Anda nanti dapat menerima koneksi (bluetoothSocket.onAccept) dari soket ini.

Menerima koneksi klien

Koneksi klien diterima dan diteruskan ke aplikasi Anda melalui peristiwa 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 Hemat Energi atau (Bluetooth Smart) adalah teknologi nirkabel yang ditujukan untuk mengurangi konsumsi daya. 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 dalam Menemukan perangkat di sekitar . Perangkat LE dapat ditemukan dengan mengirim paket data yang disebut "Data Iklan" dan perangkat tersebut disebut berada dalam mode iklan. Data iklan dapat berisi UUID layanan yang tersedia di perangkat. Jika ada, UUID ini akan dapat diakses menggunakan properti uuids dari objek bluetooth.Device yang terkait.

Setelah ditemukan, perangkat LE dapat dihubungkan dengan memanggil bluetoothLowEnergy.connect sehingga aplikasi 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 objek bluetooth.Device yang sesuai akan memiliki nilai true. Memanggil bluetoothLowEnergy.connect akan membuat klaim oleh aplikasi pada koneksi fisik ke perangkat. Koneksi fisik ke perangkat bisa ada tanpa perlu memanggil bluetoothLowEnergy.connect (misalnya karena aplikasi lain). Dalam hal ini, meskipun aplikasi Anda masih dapat berinteraksi dengan layanan perangkat, aplikasi harus selalu memanggil bluetoothLowEnergy.connect untuk mencegah aplikasi lain memutuskan koneksi fisik link.

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

chrome.bluetoothLowEnergy.disconnect(deviceAddress);

Perlu diperhatikan bahwa tindakan ini tidak serta-merta menghancurkan link fisik ke perangkat, karena mungkin ada aplikasi lain yang memiliki koneksi aktif ke perangkat. Terkadang perangkat dapat terputus karena alasan yang berada di luar kendali aplikasi (mis. jika perangkat menghilang atau terputus secara eksplisit oleh pengguna melalui utilitas sistem operasi). Aplikasi Anda harus mengamati peristiwa bluetooth.onDeviceChanged untuk mendapatkan notifikasi tentang perubahan pada koneksi dan menghubungkan kembali jika perlu.

Setelah terhubung, perangkat yang menjalankan Chrome akan berada dalam peran pusat, sedangkan perangkat jarak jauh disebut dalam peran periferal. Pada tahap 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 sentral.

Layanan, Karakteristik, dan Deskripsi

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

  • Layanan: Layanan GATT mewakili kumpulan data dan perilaku terkait untuk menyelesaikan fungsi perangkat tertentu. Misalnya, pemantau detak jantung biasanya akan memiliki setidaknya satu "Layanan Detak Jantung". Informasi tentang layanan GATT dimuat dalam objek bluetoothLowEnergy.Service.
  • Karakteristik: Karakteristik GATT adalah elemen data dasar yang digunakan untuk membuat layanan GATT, yang berisi nilai bersama dengan properti yang menentukan cara mengakses nilai tersebut. Misalnya, "Layanan Detak Jantung" memiliki karakteristik "Pengukuran Detak Jantung", yang digunakan untuk mendapatkan nilai detak jantung pengguna. Informasi tentang karakteristik GATT terdapat dalam objek bluetoothLowEnergy.Characteristic.
  • Deskripsi: Deskripsi karakteristik GATT berisi informasi lebih lanjut tentang karakteristik. Informasi tentang deskripsi karakteristik GATT dimuat dalam objek bluetoothLowEnergy.Descriptor.

API Bluetooth Low Energy memungkinkan aplikasi menemukan informasi tentang layanan, karakteristik, dan deskripsi perangkat 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 deskripsi yang dapat diakses melalui API diberi ID instance unik, yang dapat diperoleh menggunakan kolom instanceId. ID instance ini dapat digunakan untuk mengidentifikasi objek GATT dan melakukan operasi tertentu 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 peristiwa bluetoothLowEnergy.onServiceAdded dan 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 menemukan semua karakteristik dan deskripsi layanan secara asinkron dan mengirimkan peristiwa bluetoothLowEnergy.onServiceAdded setelah penemuan selesai. Jika koneksi ke periferal dihentikan, Chrome akan menghapus semua layanan terkait dan mengirimkan peristiwa bluetoothLowEnergy.onServiceRemoved.

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

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

    updateMyService(service);
  });

Membaca dan menulis nilai karakteristik

Karakteristik GATT mengenkode satu aspek layanannya. Aplikasi pusat membaca, menindaklanjuti, dan mengubah status layanan periferal dengan beroperasi pada nilai karakteristik. Nilai karakteristik adalah urutan byte dan artinya ditentukan oleh spesifikasi tingkat tinggi yang mendefinisikan karakteristik tertentu. Misalnya, nilai karakteristik Pengukuran Detak Jantung mengenkode detak jantung pengguna dan jumlah total kalori yang dibakar, sedangkan karakteristik Lokasi Sensor Tubuh mengenkode tempat sensor detak jantung harus dipakai 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 "Control Points", ketika penulisan nilai memiliki efek samping. Misalnya, karakteristik Titik Kontrol Detak Jantung digunakan untuk memberi tahu sensor detak jantung agar mereset jumlah total kalori yang terbakar dan hanya mendukung penulisan. Untuk melakukannya, 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 ditulis. Chrome menyediakan metode bluetoothLowEnergy.readDescriptorValue dan bluetoothLowEnergy.writeDescriptorValue untuk membaca dan menulis nilai deskriptor.

Untuk memeriksa apakah karakteristik mendukung baca atau tulis, aplikasi dapat memeriksa kolom properties objek bluetoothLowEnergy.Characteristic. Meskipun tidak berisi informasi tentang persyaratan keamanan untuk mengakses nilai, kolom ini menjelaskan operasi nilai mana yang didukung karakteristik secara umum.

Menangani notifikasi nilai

Beberapa karakteristik membuat nilainya diketahui melalui notifikasi atau indikasi. Misalnya, karakteristik Pengukuran Detak Jantung tidak dapat dibaca atau ditulis, tetapi mengirimkan pembaruan pada nilainya saat ini secara berkala. Aplikasi dapat memproses notifikasi ini menggunakan peristiwa 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, karakteristik tersebut tidak diaktifkan secara default. Aplikasi harus memanggil metode bluetoothLowEnergy.startCharacteristicNotifications dan 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 diterima dari karakteristik. Jika karakteristik mendukung pembacaan, peristiwa ini juga akan dikirim setelah panggilan berhasil ke bluetoothLowEnergy.readCharacteristicValue. Hal ini memungkinkan aplikasi 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 properti "notify" atau "indicate".

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