Bluetooth

Tài liệu này mô tả cách sử dụng các API Bluetooth, Bluetooth SocketBluetooth Low Energy để giao tiếp với thiết bị Bluetooth và thiết bị Bluetooth năng lượng thấp.

Để biết thông tin cơ bản về Bluetooth, hãy xem phần Thông số kỹ thuật Bluetooth chính thức.

Yêu cầu về tệp kê khai

Đối với các Ứng dụng Chrome sử dụng Bluetooth, hãy thêm mục bluetooth vào tệp kê khai và chỉ định mã nhận dạng duy nhất (UUID) của hồ sơ, giao thức hoặc dịch vụ bạn muốn triển khai (nếu phù hợp) cùng với việc bạn có muốn triển khai những API này bằng socket và/hoặc Low Energy API hay không.

Ví dụ về cách triển khai ổ cắm:

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

Và để triển khai năng lượng thấp:

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

Để chỉ truy cập vào trạng thái bộ chuyển đổi, khám phá các thiết bị ở gần và nhận thông tin cơ bản về các thiết bị, bạn chỉ cần nhập chính mục đó:

"bluetooth": {}

Thông tin về bộ chuyển đổi

Thu thập trạng thái của bộ chuyển đổi

Để có được trạng thái của bộ chuyển đổi Bluetooth, hãy sử dụng phương thức bluetooth.getAdapterState:

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

Thông báo về bộ chuyển đổi

Sự kiện bluetooth.onAdapterStateChanged sẽ được gửi bất cứ khi nào trạng thái của bộ chuyển đổi thay đổi. Ví dụ: bạn có thể sử dụng tính năng này để xác định thời điểm bật hoặc tắt đài của bộ chuyển đổi.

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

Thông tin thiết bị

Liệt kê thiết bị đã biết

Để lấy danh sách các thiết bị đã nhận biết bộ chuyển đổi Bluetooth, hãy sử dụng phương thức bluetooth.getDevices:

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

Tất cả thiết bị đều được trả lại, bao gồm cả thiết bị đã ghép nối và thiết bị mới khám phá gần đây. Quá trình này sẽ không bắt đầu khám phá các thiết bị mới (xem bài viết Khám phá thiết bị ở gần).

Nhận thông báo của thiết bị

Thay vì gọi bluetooth.getDevices liên tục, bạn có thể sử dụng các sự kiện bluetooth.onDeviceAdded, bluetooth.onDeviceChangedbluetooth.onDeviceRemoved để nhận thông báo.

Sự kiện bluetooth.onDeviceAdded được gửi bất cứ khi nào bộ chuyển đổi phát hiện một thiết bị hoặc kết nối với bộ chuyển đổi:

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

Việc thêm trình nghe cho sự kiện này không bắt đầu khám phá các thiết bị (xem bài viết Khám phá các thiết bị lân cận).

Các thay đổi đối với thiết bị, bao gồm cả các thiết bị đã phát hiện trước đó đang ghép nối, sẽ được thông báo bằng sự kiện bluetooth.onDeviceChanged:

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

Cuối cùng, sự kiện bluetooth.onDeviceRemoved sẽ được gửi bất cứ khi nào một thiết bị đã ghép nối bị xoá khỏi hệ thống hoặc một thiết bị đã phát hiện không được phát hiện gần đây:

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

Đang khám phá thiết bị ở gần

Để bắt đầu khám phá các thiết bị ở gần, hãy sử dụng phương thức bluetooth.startDiscovery. Khám phá có thể tốn nhiều tài nguyên, vì vậy, bạn nên gọi bluetooth.stopDiscovery khi hoàn tất.

Bạn nên gọi bluetooth.startDiscovery bất cứ khi nào ứng dụng cần khám phá các thiết bị ở gần. Đừng thực hiện lệnh gọi có điều kiện trên thuộc tính discovering của bluetooth.AdapterState. Lệnh gọi sẽ thành công ngay cả khi một ứng dụng khác đang khám phá các thiết bị ở gần, và sẽ đảm bảo bộ chuyển đổi tiếp tục khám phá sau khi ứng dụng khác đó đã dừng.

Hệ thống sẽ nhận thông tin về từng thiết bị mới phát hiện bằng sự kiện bluetooth.onDeviceAdded. Đối với các thiết bị mới được phát hiện gần đây hoặc trước đó đã được ghép nối hay kết nối với các thiết bị, sự kiện sẽ không được gửi. Thay vào đó, bạn nên gọi bluetooth.getDevices để nhận thông tin hiện tại và sử dụng sự kiện bluetooth.onDeviceChanged để được thông báo về những thay đổi đối với thông tin đó sau khi phát hiện.

Ví dụ:

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

Nếu người dùng tắt đài Bluetooth, thì mọi phiên khám phá sẽ kết thúc và không tự động tiếp tục khi đài được bật. Nếu điều này quan trọng đối với ứng dụng của bạn, bạn nên theo dõi sự kiện bluetooth.onAdapterStateChanged. Nếu thuộc tính discovering thay đổi thành false, thì ứng dụng sẽ cần gọi lại bluetooth.startDiscovery để tiếp tục. Hãy thận trọng với bản chất nhiều tài nguyên của hoạt động khám phá.

Xác định thiết bị

Một số tuỳ chọn khác nhau được cung cấp để xác định các thiết bị do bluetooth.getDevices và các sự kiện liên quan trả về.

Nếu thiết bị hỗ trợ Thông số kỹ thuật của mã thiết bị Bluetooth, một số thuộc tính sẽ được thêm vào đối tượng Thiết bị chứa các trường được xác định theo thông số kỹ thuật đó. Ví dụ:

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

Thông số kỹ thuật của mã thiết bị thường là đủ để xác định một mẫu cụ thể và thậm chí là bản sửa đổi của thiết bị của một nhà cung cấp. Nếu không có, bạn phải dựa vào thông tin về loại hoặc loại thiết bị (không bắt buộc) kết hợp với tiền tố nhà sản xuất trong address.

Hầu hết các thiết bị Bluetooth đều cung cấp thông tin Loại thiết bị dưới dạng trường bit được diễn giải theo tài liệu về Số được chỉ định băng tần cơ sở. Trường bit này có trong thuộc tính 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));
    }
  }
});

Việc phân tích cú pháp trường có thể phức tạp, vì vậy, đối với các loại thiết bị phổ biến nhất, Chrome sẽ xử lý việc này cho bạn và đặt trường type. Trong trường hợp tính năng này không có sẵn hoặc không đủ cho nhu cầu của bạn, bạn sẽ cần tự phân tích cú pháp 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].type);
    }
  }
});

Sử dụng RFCOMM và L2CAP

Ứng dụng Chrome có thể kết nối với bất kỳ thiết bị nào hỗ trợ dịch vụ RFCOMM hoặc L2CAP. Trong đó có phần lớn các thiết bị Bluetooth cũ trên thị trường.

Kết nối với ổ cắm

Để kết nối với một thiết bị, bạn cần ba điều kiện. Một ổ cắm để kết nối, được tạo bằng bluetoothSocket.create; địa chỉ của thiết bị bạn muốn kết nối và mã nhận dạng duy nhất (UUID) của chính dịch vụ.

Trước khi kết nối, bạn nên xác minh rằng bộ chuyển đổi nhận biết được thiết bị bằng cách sử dụng bluetooth.getDevice hoặc các API khám phá thiết bị.

Thông tin cần thiết để thiết lập kết nối cơ bản, bao gồm cả việc có nên sử dụng giao thức RFCOMM hay L2CAP và kênh hoặc PSM nào, được lấy bằng tính năng khám phá SDP trên thiết bị.

Ví dụ:

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

Giữ một handle đối với socketId để sau này bạn có thể gửi dữ liệu (bluetoothSocket.send) tới ổ cắm này.

Nhận từ và gửi đến ổ cắm

Việc nhận dữ liệu từ và gửi đến một ổ cắm sử dụng các đối tượng ArrayBuffer. Để tìm hiểu về ArrayBuffers, hãy xem phần tổng quan, mảng đã nhập JavaScript và hướng dẫn, Cách chuyển đổi ArrayBuffers thành và từ String.

Để gửi dữ liệu bạn có trong arrayBuffer, hãy dùng 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")
  }
})

Trái ngược với phương thức gửi dữ liệu, dữ liệu được nhận trong một sự kiện (bluetoothSocket.onReceive. Các ổ cắm được tạo ngay từ đầu (xem bluetoothSocket.setPaused) nên trình nghe cho sự kiện này thường được thêm vào giữa bluetoothSocket.createbluetoothSocket.connect.

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

Nhận lỗi ổ cắm và ngắt kết nối

Để được thông báo về lỗi ổ cắm, bao gồm cả lỗi ngắt kết nối, hãy thêm trình nghe vào sự kiện bluetoothSocket.onReceiveError.

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

Ngắt kết nối khỏi ổ cắm

Để ngắt kết nối và ngắt kết nối ổ cắm, hãy sử dụng bluetoothSocket.disconnect.

chrome.bluetoothSocket.disconnect(socketId);

Dịch vụ xuất bản

Ngoài việc tạo các kết nối đầu ra tới thiết bị, Ứng dụng Chrome còn có thể phát hành các dịch vụ có thể được mọi thiết bị hỗ trợ RFCOMM hoặc L2CAP.

Nghe trên ổ cắm

Hỗ trợ hai loại dịch vụ đã xuất bản. RFCOMM được dùng phổ biến nhất và bao gồm hầu hết các thiết bị và hồ sơ:

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

L2CAP là L2CAP khác, bao gồm các loại thiết bị khác và mục đích sử dụng cụ thể của nhà cung cấp, chẳng hạn như tải chương trình cơ sở lên.

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

Trong cả hai trường hợp, bạn có thể truyền bluetoothSocket.ListenOptions tuỳ chọn để phân bổ một kênh hoặc PSM cụ thể. Lệnh gọi lại cho biết lỗi thông qua chrome.runtime.lastError và nếu không thành công. Giữ một handle đối với socketId để sau này bạn có thể chấp nhận các kết nối (bluetoothSocket.onAccept) từ ổ cắm này.

Chấp nhận kết nối ứng dụng

Kết nối ứng dụng được chấp nhận và chuyển đến ứng dụng của bạn thông qua sự kiện 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);
});

Ngừng chấp nhận kết nối từ máy khách

Để dừng chấp nhận kết nối máy khách và huỷ xuất bản dịch vụ, hãy sử dụng bluetoothSocket.disconnect.

chrome.bluetoothSocket.disconnect(serverSocketId);

Tương tác với thiết bị tiết kiệm năng lượng

Bluetooth năng lượng thấp (Bluetooth thông minh) là một công nghệ không dây hướng đến việc giảm mức tiêu thụ điện năng. API Bluetooth năng lượng thấp cho phép các ứng dụng triển khai vai trò trung tâm trong kết nối LE với thiết bị ngoại vi. Các phần sau đây mô tả cách khám phá, kết nối và tương tác với các thiết bị ngoại vi Bluetooth năng lượng thấp.

Tìm và kết nối với các thiết bị ngoại vi

Giống như các thiết bị Bluetooth truyền thống, bạn có thể phát hiện thiết bị ngoại vi LE bằng các phương thức được mô tả trong phần Khám phá thiết bị ở gần . Một thiết bị LE có thể tự phát hiện được bằng cách gửi các gói dữ liệu có tên là "Quảng cáo" và thiết bị này được cho là đang ở chế độ quảng cáo. Dữ liệu quảng cáo có thể chứa mã nhận dạng duy nhất (UUID) của các dịch vụ có sẵn trên thiết bị. Nếu có, các UUID này sẽ có thể truy cập được bằng cách sử dụng thuộc tính uuids của đối tượng bluetooth.Device tương ứng.

Sau khi phát hiện, bạn có thể kết nối với một thiết bị LE bằng cách gọi bluetoothLowEnergy.connect để ứng dụng có thể tương tác với các dịch vụ của nó:

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

Sau khi kết nối, thuộc tính connected của đối tượng bluetooth.Device tương ứng sẽ có giá trị true. Việc gọi bluetoothLowEnergy.connect sẽ thiết lập một thông báo xác nhận quyền sở hữu của ứng dụng đối với kết nối thực với thiết bị. Có thể tồn tại kết nối vật lý với thiết bị mà không cần gọi bluetoothLowEnergy.connect (ví dụ: do một ứng dụng khác). Trong trường hợp này, mặc dù ứng dụng vẫn có thể tương tác với các dịch vụ của thiết bị, nhưng ứng dụng phải luôn gọi bluetoothLowEnergy.connect để ngăn các ứng dụng khác ngắt kết nối đường liên kết thực tế.

Khi không cần kết nối nữa, ứng dụng của bạn có thể xoá thông báo xác nhận quyền sở hữu đối với kết nối bằng cách gọi bluetoothLowEnergy.disconnect:

chrome.bluetoothLowEnergy.disconnect(deviceAddress);

Xin lưu ý rằng thao tác này không nhất thiết huỷ bỏ mối liên kết vật lý đến thiết bị, vì có thể có các ứng dụng khác đang kết nối với thiết bị. Đôi khi, thiết bị có thể bị ngắt kết nối vì những lý do nằm ngoài tầm kiểm soát của ứng dụng (ví dụ: khi thiết bị biến mất hoặc bị người dùng ngắt kết nối một cách rõ ràng thông qua các tiện ích của hệ điều hành). Ứng dụng của bạn cần theo dõi sự kiện bluetooth.onDeviceChanged để nhận thông báo về các thay đổi đối với kết nối và kết nối lại nếu cần.

Sau khi được kết nối, thiết bị đang chạy Chrome sẽ có vai trò trung tâm, còn thiết bị từ xa được cho là có vai trò thiết bị ngoại vi. Tại thời điểm này, ứng dụng của bạn có thể tương tác với các dịch vụ trên thiết bị bằng các phương thức mô tả trong phần sau. Lưu ý: Các API hiện không hỗ trợ hoạt động như một thiết bị ngoại vi LE; các ứng dụng chỉ có thể triển khai vai trò trung tâm.

Dịch vụ, đặc điểm và mô tả

Bluetooth năng lượng thấp dựa trên một giao thức phản hồi yêu cầu đơn giản có tên là Giao thức thuộc tính (ATT). Khi sử dụng ATT, một thiết bị trung tâm sẽ tương tác với các thuộc tính được gọi là trên thiết bị ngoại vi bằng cách tuân thủ một hồ sơ Bluetooth đặc biệt có tên là Hồ sơ thuộc tính chung (GATT). GATT xác định các khái niệm cấp cao sau đây:

  • Dịch vụ: Dịch vụ GATT đại diện cho một tập hợp dữ liệu và các hành vi liên quan để thực hiện một chức năng cụ thể của thiết bị. Ví dụ: máy đo nhịp tim thường sẽ có ít nhất một "Dịch vụ nhịp tim". Thông tin về dịch vụ GATT có trong đối tượng bluetoothLowEnergy.Service.
  • Đặc điểm: Đặc điểm của GATT là một thành phần dữ liệu cơ bản dùng để xây dựng dịch vụ GATT, chứa một giá trị cùng với các thuộc tính xác định cách truy cập vào giá trị đó. Ví dụ: "Dịch vụ nhịp tim" có đặc điểm "Đo nhịp tim" dùng để lấy giá trị nhịp tim của người dùng. Thông tin về một đặc điểm GATT có trong đối tượng bluetoothLowEnergy.Characteristic.
  • Phần mô tả: Phần mô tả đặc điểm của GATT chứa thêm thông tin về một đặc điểm. Thông tin về phần mô tả đặc điểm GATT có trong đối tượng bluetoothLowEnergy.Descriptor.

API Bluetooth Low Energy cho phép các ứng dụng tìm thông tin về dịch vụ, đặc điểm và thông tin mô tả của thiết bị bằng cách gọi bluetoothLowEnergy.getServices, bluetoothLowEnergy.getCharacteristicsbluetoothLowEnergy.getDescriptors. Các ứng dụng có thể lọc theo các dịch vụ, đặc điểm và thông tin mô tả bằng cách so sánh trường uuid với UUID của GATT mong muốn:

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

Mỗi dịch vụ, đặc điểm và mã mô tả mà bạn truy cập được qua API sẽ được gán một giá trị nhận dạng thực thể duy nhất. Giá trị nhận dạng này có thể được lấy bằng trường instanceId. Bạn có thể dùng mã thực thể này để xác định một đối tượng GATT và thực hiện các thao tác cụ thể trên đối tượng đó:

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

Sự kiện dịch vụ

Sau khi một thiết bị được kết nối, Chrome sẽ khám phá các dịch vụ của thiết bị đó. Khi mỗi dịch vụ được phát hiện và xoá, ứng dụng sẽ nhận được các sự kiện bluetoothLowEnergy.onServiceAddedbluetoothLowEnergy.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 khám phá tất cả các đặc điểm và nội dung mô tả của một dịch vụ một cách không đồng bộ, rồi gửi sự kiện bluetoothLowEnergy.onServiceAdded sau khi quá trình khám phá hoàn tất. Nếu chấm dứt kết nối với một thiết bị ngoại vi, Chrome sẽ xoá mọi dịch vụ liên quan và gửi sự kiện bluetoothLowEnergy.onServiceRemoved.

Một số thiết bị ngoại vi có thể sửa đổi dịch vụ của mình, chẳng hạn như đặc điểm của một dịch vụ có thể thay đổi hoặc các dịch vụ có thể được thêm và xoá hoàn toàn. Chrome thông báo cho ứng dụng về những thay đổi này bằng các sự kiện bluetoothLowEnergy.onServiceChanged, bluetoothLowEnergy.onServiceAddedbluetoothLowEnergy.onServiceRemoved.

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

    updateMyService(service);
  });

Đọc và viết giá trị của một đặc điểm

Đặc điểm GATT mã hoá một khía cạnh của dịch vụ. Ứng dụng trung tâm đọc, hành động và sửa đổi trạng thái dịch vụ của thiết bị ngoại vi bằng cách hoạt động trên giá trị của một đặc điểm. Giá trị đặc điểm là một chuỗi byte và ý nghĩa của giá trị này được xác định bằng thông số kỹ thuật cấp cao giúp xác định một đặc điểm nhất định. Ví dụ: giá trị của đặc điểm Đo lường nhịp tim mã hoá nhịp tim của người dùng và tổng lượng calo họ đã đốt cháy, trong khi đặc điểm Vị trí cảm biến cơ thể mã hoá vị trí nên đeo cảm biến nhịp tim trên cơ thể.

Chrome cung cấp phương thức bluetoothLowEnergy.readCharacteristicValue để đọc giá trị của một đặc điểm:

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

Một số đặc điểm có thể ghi, đặc biệt là những đặc điểm hoạt động dưới dạng "Điểm điều khiển", trong đó việc ghi giá trị có tác dụng phụ. Ví dụ: đặc tính Heart Rate Control Point (Điểm kiểm soát nhịp tim) được dùng để yêu cầu cảm biến nhịp tim đặt lại lượng calo đã đốt cháy và chỉ hỗ trợ ghi dữ liệu. Để làm được điều này, Chrome cung cấp phương thức 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.
});

Phần mô tả đặc điểm hoạt động theo cách tương tự và có thể đọc và/hoặc ghi được. Chrome cung cấp phương thức bluetoothLowEnergy.readDescriptorValuebluetoothLowEnergy.writeDescriptorValue để đọc và ghi giá trị của chỉ số mô tả.

Để kiểm tra xem một đặc điểm có hỗ trợ hoạt động đọc hoặc ghi hay không, ứng dụng có thể kiểm tra trường properties của đối tượng bluetoothLowEnergy.Characteristic. Mặc dù trường này không chứa thông tin về các yêu cầu bảo mật để truy cập vào một giá trị, nhưng trường này mô tả thao tác giá trị mà đặc điểm đó hỗ trợ chung.

Xử lý thông báo về giá trị

Một số đặc điểm giúp xác định giá trị của chúng bằng cách sử dụng thông báo hoặc chỉ báo. Ví dụ: đặc điểm Đo lường nhịp tim không thể đọc hoặc ghi được, nhưng sẽ gửi thông tin cập nhật về giá trị hiện tại theo định kỳ. Các ứng dụng có thể theo dõi những thông báo này bằng sự kiện bluetoothLowEnergy.onCharacteristicValueChanged.

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

    var bytes = new Uint8Array(chrc.value);

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

Ngay cả khi một đặc điểm hỗ trợ thông báo/chỉ báo, các đặc điểm này vẫn không được bật theo mặc định. Ứng dụng nên gọi phương thức bluetoothLowEnergy.startCharacteristicNotificationsbluetoothLowEnergy.stopCharacteristicNotifications để bắt đầu hoặc ngừng nhận sự kiện 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);
  }

Sau khi bắt đầu thông báo, ứng dụng sẽ nhận được bluetoothLowEnergy.onCharacteristicValueChanged mỗi khi nhận được thông báo hoặc chỉ báo từ đặc điểm đó. Nếu đặc điểm này hỗ trợ hoạt động đọc, thì sự kiện này cũng sẽ được gửi sau lệnh gọi thành công đến bluetoothLowEnergy.readCharacteristicValue. Điều này cho phép các ứng dụng hợp nhất luồng kiểm soát của một bản cập nhật giá trị được kích hoạt thông qua yêu cầu đọc và thông báo:

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

Nếu một đặc điểm hỗ trợ thông báo, thì trường properties của đặc điểm đó sẽ chứa thuộc tính "notify" hoặc "indicate".

LƯU Ý: Nếu một đặc điểm hỗ trợ thông báo/chỉ báo, thì đặc điểm đó sẽ có phần mô tả "Cấu hình đặc điểm ứng dụng" để bật/tắt thông báo. Chrome không cho phép ứng dụng ghi vào phần mô tả này. Thay vào đó, ứng dụng nên dùng phương thức bluetoothLowEnergy.startCharacteristicNotificationsbluetoothLowEnergy.stopCharacteristicNotifications để kiểm soát hành vi của thông báo.