Bluetooth

Questo documento descrive come utilizzare il Bluetooth, la presa Bluetooth e il Bluetooth Low API Energy per comunicare con dispositivi Bluetooth e Bluetooth Low Energy.

Per informazioni di base sul Bluetooth, leggi le specifiche ufficiali del Bluetooth.

Requisiti dei file manifest

Per le app di Chrome che utilizzano il Bluetooth, aggiungi la voce bluetooth al file manifest e specifica, se appropriato, gli UUID dei profili, dei protocolli o dei servizi che vuoi implementare e se si desidera implementarle con le API socket e/o Low Energy.

Ad esempio, per un'implementazione socket:

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

Per un'implementazione a bassa energia:

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

Per accedere solo allo stato dell'adattatore, rilevare i dispositivi nelle vicinanze e ottenere informazioni di base sui dispositivi, è richiesta solo la voce stessa:

"bluetooth": {}

Informazioni sull'adattatore

Recupero stato adattatore in corso...

Per conoscere lo stato dell'adattatore Bluetooth, utilizza il metodo bluetooth.getAdapterState:

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

Notifiche dell'adattatore

L'evento bluetooth.onAdapterStateChanged viene inviato ogni volta che lo stato dell'adattatore cambia. Questo può ad esempio per determinare quando la radio dell'adattatore è accesa o spenta.

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

Informazioni sul dispositivo

Elenco dei dispositivi noti

Per ottenere un elenco dei dispositivi noti all'adattatore Bluetooth, utilizza il comando bluetooth.getDevices. :

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

Vengono restituiti tutti i dispositivi, inclusi quelli accoppiati e quelli rilevati di recente. Non iniziare il rilevamento di nuovi dispositivi (consulta la sezione Rilevamento di dispositivi nelle vicinanze).

Ricezione di notifiche sul dispositivo

Anziché chiamare ripetutamente bluetooth.getDevices, puoi utilizzare bluetooth.onDeviceAdded, bluetooth.onDeviceChanged e bluetooth.onDeviceRemoved eventi per ricevere notifiche.

L'evento bluetooth.onDeviceAdded viene inviato ogni volta che un dispositivo viene rilevato dall'adattatore oppure stabilisce una connessione all'adattatore:

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

L'aggiunta di un listener per questo evento non avvia il rilevamento di dispositivi (vedi Rilevamento di dispositivi nelle vicinanze). dispositivi mobili).

Le modifiche apportate ai dispositivi, inclusi i dispositivi rilevati in precedenza in fase di accoppiamento, vengono notificate dal Evento bluetooth.onDeviceChanged:

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

Infine, l'evento bluetooth.onDeviceRemoved viene inviato ogni volta che un dispositivo accoppiato viene rimosso da sistema o un dispositivo rilevato non è stato rilevato di recente:

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

Rilevamento di dispositivi nelle vicinanze

Per avviare il rilevamento dei dispositivi nelle vicinanze, utilizza il metodo bluetooth.startDiscovery. La scoperta può richiede un consumo di risorse elevato, quindi al termine dovresti chiamare bluetooth.stopDiscovery.

Devi chiamare bluetooth.startDiscovery ogni volta che la tua app deve rilevare dispositivi nelle vicinanze. Non rendere condizionale la chiamata alla proprietà discovering di bluetooth.AdapterState. La la chiamata avrà esito positivo anche se un'altra app rileva dispositivi nelle vicinanze e garantirà che l'adattatore continua a eseguire il rilevamento dopo l'interruzione dell'altra app.

Le informazioni su ogni dispositivo appena rilevato vengono ricevute tramite bluetooth.onDeviceAdded . Per i dispositivi già rilevati di recente o precedentemente accoppiati con o connesso, l'evento non verrà inviato. Invece, devi chiamare bluetooth.getDevices per ottenere le informazioni attuali e utilizzare l'evento bluetooth.onDeviceChanged per ricevere una notifica modifiche a queste informazioni a seguito del rilevamento.

Esempio:

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

Se l'utente disattiva la radio Bluetooth, tutte le sessioni di rilevamento verranno terminate e non riprenderanno automaticamente quando la radio è accesa. Se questo è importante per la tua app, dovresti guardare il bluetooth.onAdapterStateChanged. Se la proprietà discovering diventa false: l'app dovrà chiamare di nuovo bluetooth.startDiscovery per riprendere. Presta attenzione alle per un'individuazione che richiede un elevato utilizzo di risorse.

Identificare i dispositivi

Sono disponibili diverse opzioni per identificare i dispositivi restituiti bluetooth.getDevices e gli eventi correlati.

Se il dispositivo supporta la specifica ID dispositivo Bluetooth, vengono aggiunte diverse proprietà al l'oggetto Device contenente i campi definiti da tale specifica. Esempio:

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

La specifica dell'ID dispositivo è in genere sufficiente per identificare un determinato modello e persino una revisione, di un dispositivo di un fornitore. Dove non è presente, è invece necessario basarsi sulle informazioni relative alla classe o tipo di dispositivo, facoltativamente combinato con il prefisso del produttore nell'address.

La maggior parte dei dispositivi Bluetooth fornisce le informazioni sulla classe del dispositivo sotto forma di campo di bit interpretato in base a il documento Baseband Assigned Numbers. Questo campo di bit è disponibile in deviceClass proprietà.

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

L'analisi del campo può essere complessa quindi, per i tipi di dispositivi più comuni, Chrome gestisce questa operazione per te e consente di impostare il campo type. Se non è disponibile o non è sufficiente per le tue esigenze, dovrai: analizzare deviceClass autonomamente.

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

Utilizzo di RFCOMM e L2CAP

Le App di Chrome possono stabilire connessioni a qualsiasi dispositivo che supporta i servizi RFCOMM o L2CAP. Sono inclusi la maggior parte dei dispositivi Bluetooth classici sul mercato.

Collegamento a una presa

Per stabilire una connessione a un dispositivo, hai bisogno di tre elementi. Una presa per effettuare il collegamento creato utilizzando bluetoothSocket.create. l'indirizzo del dispositivo a cui vuoi connetterti, e l'UUID del servizio stesso.

Prima di effettuare il collegamento, devi verificare che l'adattatore sia a conoscenza del dispositivo utilizzando bluetooth.getDevice o le API di rilevamento dei dispositivi.

Le informazioni necessarie per stabilire la connessione di base, ad esempio se RFCOMM o È necessario utilizzare il protocollo L2CAP e quale canale o PSM si ottiene utilizzando il rilevamento SDP sulla dispositivo.

Esempio:

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

Conserva un handle a socketId in modo da poter inviare i dati (bluetoothSocket.send) a questo presa.

Ricezione e invio su un socket

La ricezione di dati da e l'invio a un socket utilizza gli oggetti ArrayBuffer. Per saperne di più su ArrayBuffers, guarda la panoramica, Array digitati JavaScript, e il tutorial, Come convertire ArrayBuffer da e verso una stringa.

Per inviare i dati presenti in arrayBuffer utilizza 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")
  }
})

A differenza del metodo con cui inviare i dati, i dati vengono ricevuti in un evento (bluetoothSocket.onReceive. I socket vengono creati riattivati (vedi bluetoothSocket.setPaused) pertanto il listener per questo evento viene generalmente aggiunto tra bluetoothSocket.create e bluetoothSocket.connect.

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

Ricezione di errori di socket e disconnessione

Per ricevere notifiche relative a errori socket, inclusa la disconnessione, aggiungi un listener al Evento bluetoothSocket.onReceiveError.

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

Disconnettersi da una presa

Per interrompere la connessione e scollegare la presa, utilizza bluetoothSocket.disconnect.

chrome.bluetoothSocket.disconnect(socketId);

Servizi di pubblicazione

Oltre a effettuare connessioni in uscita ai dispositivi, le App di Chrome possono pubblicare servizi che utilizzato da qualsiasi dispositivo che supporta RFCOMM o L2CAP.

Ascoltare su una presa

Sono supportati due tipi di servizi pubblicati. RFCOMM è il più comunemente usato e copre la maggior parte dei dispositivi e dei profili:

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

L2CAP è l'altro e copre altri tipi di dispositivi e utilizzi specifici del fornitore, come il firmware caricamento in corso.

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

In entrambi i casi, potrebbe essere passato un valore bluetoothSocket.ListenOptions facoltativo per allocare un canale o PSM. Il callback indica un errore tramite chrome.runtime.lastError e l'esito è positivo negli altri casi. Mantenere un handle nel socketId per poter accettare le connessioni in un secondo momento (bluetoothSocket.onAccept) da questo socket.

Accettazione delle connessioni client in corso

Le connessioni client vengono accettate e trasmesse all'applicazione tramite 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);
});

Interrompi l'accettazione di connessioni client

Per interrompere l'accettazione di connessioni client e annullare la pubblicazione del servizio, utilizza bluetoothSocket.disconnect.

chrome.bluetoothSocket.disconnect(serverSocketId);

Interazione con dispositivi a bassa energia

Bluetooth Low Energy o (Bluetooth Smart) è una tecnologia wireless che riduce l'energia il consumo eccessivo. L'API Bluetooth Low Energy consente alle applicazioni di implementare il ruolo centrale nel una connessione LE a una periferica. Le seguenti sezioni descrivono come scoprire, connetterti e interagire con le periferiche Bluetooth Low Energy.

Rilevamento e connessione alle periferiche

Come con i dispositivi Bluetooth tradizionali, le periferiche LE possono essere scoperte utilizzando i metodi descritti in Rilevamento di dispositivi nelle vicinanze . Un dispositivo LE si rende rilevabile inviando pacchetti di dati chiamata "Dati pubblicitari" e il dispositivo si trova in modalità pubblicità. I dati pubblicitari potrebbero contenere UUID di servizi disponibili sul dispositivo. Se presenti, questi UUID verranno accessibile tramite la proprietà uuids dell'oggetto bluetooth.Device corrispondente.

Una volta rilevato, un dispositivo LE può essere connesso chiamando bluetoothLowEnergy.connect in modo che che l'applicazione possa interagire con i suoi servizi:

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

Dopo la connessione, la proprietà connected dell'oggetto bluetooth.Device corrispondente verrà hanno il valore true. La chiamata a bluetoothLowEnergy.connect stabilisce una richiesta da parte del dell'applicazione sulla connessione fisica al dispositivo. Può esistere una connessione fisica al dispositivo senza mai chiamare bluetoothLowEnergy.connect (ad esempio a causa di un'altra applicazione). Nella in questo caso, anche se la tua applicazione può ancora interagire con i servizi del dispositivo, chiama sempre bluetoothLowEnergy.connect per impedire a un'altra applicazione di disconnettere il collegamento fisico.

Quando la tua applicazione non deve più essere connessa, può rimuovere la richiesta relativa alla connessione chiamata bluetoothLowEnergy.disconnect:

chrome.bluetoothLowEnergy.disconnect(deviceAddress);

Tieni presente che ciò non determinerà necessariamente l'eliminazione del collegamento fisico al dispositivo, poiché potrebbero esserci altri applicazioni con connessioni attive al dispositivo. A volte il dispositivo potrebbe disconnessi per motivi che esulano dal controllo dell'applicazione (ad esempio, se il dispositivo scompare o viene esplicitamente disconnessa dall'utente tramite utilità del sistema operativo). La tua applicazione dovrebbe osservare l'evento bluetooth.onDeviceChanged per ricevere notifiche delle modifiche alla connessione e, se necessario, ricollegarti.

Una volta connesso, il dispositivo su cui è in esecuzione Chrome avrà il cosiddetto ruolo centrale, mentre dispositivo remoto abbia il ruolo di periferica. A questo punto, l'applicazione può interagire con i servizi sul dispositivo utilizzando i metodi descritti nella sezione che segue. Nota: il Attualmente le API non supportano l'uso di periferica LE. le app possono implementare solo il ruolo centrale.

Servizi, caratteristiche e descrittori

Bluetooth Low Energy si basa su un semplice protocollo di richiesta-risposta chiamato Attribute Protocol (ATT). Grazie all'ATT, un dispositivo centrale interagisce con i cosiddetti attributi su un dispositivo periferico mediante la conformità a uno speciale profilo Bluetooth denominato Generic Attribute Profile (GATT). GATT definisce i seguenti concetti di alto livello:

  • Servizio: un servizio GATT rappresenta una raccolta di dati e dei comportamenti associati per eseguire un funzione specifica di un dispositivo. Ad esempio, un cardiofrequenzimetro di solito ha almeno un "Servizio di frequenza cardiaca". Le informazioni su un servizio GATT sono contenute in un bluetoothLowEnergy.Service.
  • Caratteristica: una caratteristica GATT è un elemento di dati di base utilizzato per creare un servizio GATT. contenente un valore insieme alle proprietà che ne definiscono la modalità di accesso. Ad esempio: il "Servizio di rilevazione del battito cardiaco" è presente la colonna "Misurazione del battito cardiaco" , che viene utilizzata per ottenere il valore del battito cardiaco dell'utente. Le informazioni su una caratteristica GATT sono contenute in un bluetoothLowEnergy.Characteristic.
  • Descrittore: un descrittore della caratteristica GATT contiene ulteriori informazioni su una caratteristica. Le informazioni su un descrittore della caratteristica GATT sono contenute in un bluetoothLowEnergy.Descriptor.

L'API Bluetooth Low Energy consente alle applicazioni di trovare informazioni sull' servizi, caratteristiche e descrittori chiamando bluetoothLowEnergy.getServices, bluetoothLowEnergy.getCharacteristics e bluetoothLowEnergy.getDescriptors. Le app possono filtrano servizi, caratteristiche e descrittori confrontando il campo uuid con UUID GATT desiderato:

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

A ogni servizio, caratteristica e descrittore accessibile tramite l'API viene assegnato un identificatore di istanza, che puoi ottenere utilizzando il campo instanceId. Questo ID istanza può essere utilizzato per identificare un oggetto GATT ed eseguire operazioni specifiche sull'oggetto:

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

Eventi di servizio

Una volta connesso un dispositivo, Chrome rileva i suoi servizi. Quando ogni servizio viene rilevato rimosso, l'applicazione riceverà il comando bluetoothLowEnergy.onServiceAdded e Eventi 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 rileva tutte le caratteristiche e i descrittori di un servizio in modo asincrono e invia il Evento bluetoothLowEnergy.onServiceAdded al termine del rilevamento. Se la connessione a un termina la periferica, Chrome rimuove tutti i servizi correlati e invia Evento bluetoothLowEnergy.onServiceRemoved.

Alcune periferiche possono modificare i servizi, ad esempio le caratteristiche di un servizio possono cambiare potrebbero essere aggiunti e rimossi del tutto. Chrome invia una notifica alle app di questi cambiamenti utilizzando bluetoothLowEnergy.onServiceChanged, bluetoothLowEnergy.onServiceAdded e Eventi bluetoothLowEnergy.onServiceRemoved.

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

    updateMyService(service);
  });

Lettura e scrittura del valore di una caratteristica

Una caratteristica GATT codifica un aspetto del suo servizio. Un'app centrale legge, agisce e modifica lo stato del servizio di una periferica operando sul valore di una caratteristica. La caratteristica è una sequenza di byte il cui significato è definito dalla specifica di alto livello che definisce una determinata caratteristica. Ad esempio, il valore della caratteristica di Misurazione del battito cardiaco codifica il battito cardiaco dell'utente e la quantità totale di calorie bruciate, mentre il sensore per il corpo Posizione codifica la posizione del corpo in cui deve essere indossato il sensore del battito cardiaco.

Chrome fornisce il metodo bluetoothLowEnergy.readCharacteristicValue per leggere il valore di un caratteristica:

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

Alcune caratteristiche sono scrivibili, in particolare quelle che si comportano come "punti di controllo", in cui la scrittura il valore ha degli effetti collaterali. Ad esempio, la caratteristica Punto di controllo del battito cardiaco viene utilizzata per: Di' a un sensore del battito cardiaco di reimpostare il conteggio delle calorie totali bruciate e supporta solo le operazioni di scrittura. A raggiungere questo obiettivo, Chrome fornisce il metodo 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.
});

I descrittori delle caratteristiche si comportano allo stesso modo e possono essere leggibili e/o scrivibili. Chrome fornisce bluetoothLowEnergy.readDescriptorValue e bluetoothLowEnergy.writeDescriptorValue per leggere e scrivere il valore di un descrittore.

Per verificare se una caratteristica supporta letture o scritture, un'applicazione può controllare properties campo di un oggetto bluetoothLowEnergy.Characteristic. Questo campo non contiene informazioni sui requisiti di sicurezza per accedere a un valore, descrive quale valore operativa supportata in generale dalla caratteristica.

Gestione delle notifiche sui valori

Alcune caratteristiche ne fanno conoscere il valore tramite notifiche o indicazioni. Ad esempio, La caratteristica di misurazione del battito cardiaco non è leggibile né scrivibile, ma invia aggiornamenti sulla relativa valore corrente a intervalli regolari. Le applicazioni possono ascoltare queste notifiche utilizzando bluetoothLowEnergy.onCharacteristicValueChanged.

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

    var bytes = new Uint8Array(chrc.value);

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

Anche se una caratteristica supporta notifiche/indicazioni, queste non sono attive per impostazione predefinita. Un l'applicazione deve chiamare bluetoothLowEnergy.startCharacteristicNotifications e bluetoothLowEnergy.stopCharacteristicNotifications per avviare o interrompere la ricezione del Evento 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);
  }

Una volta avviate le notifiche, l'applicazione riceverà bluetoothLowEnergy.onCharacteristicValueChanged ogni volta che viene visualizzata una notifica o un'indicazione ricevuto dalla caratteristica. Se la caratteristica supporta le letture, anche questo evento verrà inviate dopo una chiamata a bluetoothLowEnergy.readCharacteristicValue. In questo modo le app per unificare il flusso di controllo di un aggiornamento del valore attivato tramite una richiesta di lettura e notifiche:

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

Se una caratteristica supporta le notifiche, il campo properties conterrà "notify" o "indicate".

NOTA: se una caratteristica supporta notifiche/indicazioni, avrà il campo Configurazione caratteristica" descrittore per attivare/disattivare le notifiche. Chrome non consente app per scrivere in questo descrittore. Le app devono invece usare bluetoothLowEnergy.startCharacteristicNotifications e bluetoothLowEnergy.stopCharacteristicNotifications per controllare il comportamento delle notifiche.