Bluetooth

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

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

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

Đối với Ứng dụng Chrome sử dụng Bluetooth, hãy thêm mục Bluetooth vào tệp kê khai và chỉ định, nếu thích hợp, các mã nhận dạng duy nhất (UUID) của cấu hình, giao thức hoặc dịch vụ mà bạn muốn triển khai cùng với các mã bạn muốn triển khai các API này bằng API socket và/hoặc API năng lượng thấp.

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

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

Và đối với cách 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 của bộ chuyển đổi, hãy khám phá các thiết bị ở gần và lấy thông tin cơ bản về thiết bị, chỉ có mục nhập là bắt buộc:

"bluetooth": {}

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

Đang lấy trạng thái của bộ chuyển đổi

Để biết 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. Điều này có thể được sử dụng, chẳng hạn như để xác định khi nào đài phát của bộ chuyển đổi được bật hoặc tắt.

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ê các thiết bị đã biết

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

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ả về, bao gồm cả thiết bị đã ghép nối và thiết bị được phát hiện gần đây. Việc này không phải bắt đầu khám phá các thiết bị mới (xem phần Khám phá các thiết bị ở gần).

Nhận thông báo trên thiết bị

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

Sự kiện bluetooth.onDeviceAdded sẽ được gửi mỗi khi bộ chuyển đổi phát hiện thấy 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 sẽ không bắt đầu phát hiện thiết bị (xem phần Khám phá lân cận thiết bị).

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

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

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

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

Đang phát hiện các 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. Chiến dịch Khám phá có thể sẽ 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ủa bạn cần khám phá các thiết bị ở gần. Không đặt lệnh gọi này có điều kiện đối với thuộc tính discovering của bluetooth.AdapterState. Chiến lược phát hành đĩa đơn sẽ thành công ngay cả khi một ứng dụng khác đang phát hiện các thiết bị ở gần, đồng thời sẽ đảm bảo bộ chuyển đổi tiếp tục thực hiện khám phá sau khi ứng dụng khác đã dừng.

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

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, tất cả các phiên khám phá sẽ kết thúc và không tiếp tục tự động khi radio được bật. Nếu điều này quan trọng với ứng dụng của bạn, bạn nên xem sự kiện bluetooth.onAdapterStateChanged. Nếu thuộc tính discovering thay đổi thành false thì ứng dụng của bạn sẽ cần gọi lại bluetooth.startDiscovery để tiếp tục. Hãy thận trọng với của hoạt động khám phá cần nhiều tài nguyên.

Xác định thiết bị

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

Nếu thiết bị hỗ trợ thông số kỹ thuật của Mã thiết bị qua 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 đủ để xác định một kiểu máy cụ thể và thậm chí là bản sửa đổi, của một thiết bị từ một nhà cung cấp. Nếu không, bạn phải dựa vào thông tin về lớp hoặc loại thiết bị, được kết hợp không bắt buộc với tiền tố nhà sản xuất trong address.

Hầu hết 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 Số được chỉ định băng tần cơ sở. Trường bit này có trong deviceClass thuộc tính này.

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

Phân tích cú pháp trường này 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ý vấn đề này cho bạn và đặt trường type. Nếu tính năng này không hoạt động hoặc không đáp ứng đủ nhu cầu của bạn, bạn phải 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ể tạo kết nối với bất kỳ thiết bị nào hỗ trợ dịch vụ RFCOMM hoặc L2CAP. bao gồm phần lớn thiết bị Bluetooth cổ điển trên thị trường.

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

Để tạo kết nối với một thiết bị, bạn cần có 3 yếu tố. Ổ cắm giúp kết nối bằng bluetoothSocket.create; địa chỉ của thiết bị mà 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 thực hiện 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 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ả thông tin RFCOMM hoặc Giao thức L2CAP nên được sử dụng và kênh hoặc PSM nào thu được bằng cách sử dụng kỹ thuật 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 ô điều khiển cho socketId để sau này bạn có thể gửi dữ liệu (bluetoothSocket.send) đến ổ cắm.

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

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

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

Khá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 đang tạm dừng (xem bluetoothSocket.setPaused) vì vậy, 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

Để nhận thông báo về các lỗi ổ cắm, bao gồm cả ngắt kết nối, hãy thêm một trình nghe vào 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, hãy sử dụng bluetoothSocket.disconnect.

chrome.bluetoothSocket.disconnect(socketId);

Dịch vụ xuất bản

Ngoài việc tạo kết nối ngoài tới thiết bị, Ứng dụng Chrome có thể phát hành các dịch vụ có thể được sử dụng bởi bất kỳ thiết bị nào hỗ trợ RFCOMM hoặc L2CAP.

Nghe trên ổ cắm

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

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

L2CAP là phiên bản còn lại và bao gồm các loại thiết bị khác cũng như cách sử dụng riêng của từng nhà cung cấp, chẳng hạn như chương trình cơ sở đang tải 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, hệ thống có thể truyền bluetoothSocket.ListenOptions tuỳ chọn để phân bổ một mã hoặc PSM. Lệnh gọi lại cho biết lỗi thông qua chrome.runtime.lastError và thành công nếu không. Giữ một xử lý cho 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 với khách hàng

Kết nối với khách hàng được chấp nhận và chuyển đến đơn đăng ký của bạn thông qua 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 với ứng dụng khách

Để ngừng chấp nhận kết nối từ ứng dụng 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 các thiết bị sử dụng năng lượng thấp

Bluetooth năng lượng thấp hay (Bluetooth Smart) là một công nghệ không dây nhằm giảm pin người dù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 một 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 thiết bị ngoại vi Bluetooth năng lượng thấp.

Khám phá 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, người dùng có thể phát hiện thiết bị ngoại vi LE bằng các phương pháp được mô tả trong phần Khám phá các thiết bị ở gần . Thiết bị năng lượng thấp tự động phát hiện được bằng cách gửi các gói dữ liệu có tên là "Dữ liệu quảng cáo" và thiết bị đó đ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ó trên thiết bị. Nếu có, những mã nhận dạng duy nhất (UUID) này sẽ là có thể truy cập bằ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 để mà ứng dụng có thể tương tác với các dịch vụ của mình:

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 tuyên bố của trên kết nối vật lý với thiết bị. Có thể đã kết nối vật lý với thiết bị mà không bao giờ gọi bluetoothLowEnergy.connect (ví dụ: do một ứng dụng khác). Trong 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 luôn gọi bluetoothLowEnergy.connect để ngăn một ứng dụng khác ngắt kết nối đường liên kết vật lý.

Sau khi không cần kết nối nữa, ứng dụng của bạn có thể xoá yêu cầu kết nối bằng cách gọi bluetoothLowEnergy.disconnect (chia sẻ tín hiệu):

chrome.bluetoothLowEnergy.disconnect(deviceAddress);

Xin lưu ý rằng thao tác này không nhất thiết phải huỷ bỏ liên kết thực đến thiết bị, vì có thể có có kết nối đang hoạt động với thiết bị. Đôi khi, thiết bị có thể trở thành 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ụ: nếu 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 quan sát sự kiện bluetooth.onDeviceChanged để nhận được thông báo về các thay đổi vào đầu nối rồi 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ó 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 được mô tả trong phần sau. Lưu ý: Phần Các API hiện không hỗ trợ hoạt động như 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à nội dung 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 tương tác với các thuộc tính được gọi trên thiết bị ngoại vi bằng cách tuân theo một cấu hình Bluetooth đặc biệt được gọi là Cấu hình 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 để hoàn thành 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ụ tần số tim". Thông tin về dịch vụ GATT có trong bluetoothLowEnergy.Service.
  • Đặc điểm: Đặc tính GATT là một phần tử 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ụ tần số tim" có chỉ số "Đo lường tần số tim" đặc tính được dùng để có được giá trị nhịp tim của người dùng. Thông tin về đặc điểm GATT có trong một bluetoothLowEnergy.Characteristic.
  • Từ mô tả: Mô tả đặc điểm GATT chứa thông tin thêm về một đặc điểm. Thông tin về bộ mô tả đặc điểm GATT có trong một bluetoothLowEnergy.Descriptor.

API Bluetooth năng lượng thấp cho phép các ứng dụng tìm thông tin về các dịch vụ, đặc điểm và nội dung mô tả bằng cách gọi bluetoothLowEnergy.getServices, bluetoothLowEnergy.getCharacteristicsbluetoothLowEnergy.getDescriptors. Ứng dụng có thể lọc các dịch vụ, đặc điểm và mã mô tả bằng cách so sánh trường uuid của chúng với UUID 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ả có thể truy cập được thông qua API được gán một giá trị duy nhất mã nhận dạng thực thể mà bạn có thể lấy bằng trường instanceId. Mã phiên bản này có thể là dùng để xác định một đối tượng GATT và thực hiện các thao tác cụ thể đối với đố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 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à bị xóa, ứng dụng sẽ nhận được bluetoothLowEnergy.onServiceAdded và Sự kiện 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 khám phá tất cả các đặc điểm và mô tả của một dịch vụ một cách không đồng bộ và gửi Sự kiện bluetoothLowEnergy.onServiceAdded sau khi quá trình khám phá hoàn tất. Nếu kết nối với thiết bị ngoại vi chấm dứt, Chrome sẽ xoá tất cả dịch vụ có 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ụ, chẳng hạn như các đặc điểm của một dịch vụ có thể thay đổi hoặc có thể được thêm vào và bị xoá hoàn toàn. Chrome thông báo cho ứng dụng về những thay đổi này bằng cách sử dụng bluetoothLowEnergy.onServiceChanged, bluetoothLowEnergy.onServiceAdded và Sự kiện bluetoothLowEnergy.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

Một đặc tính GATT mã hoá một khía cạnh của dịch vụ nó. Một ứ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 vận hành trên giá trị của đặc tính. Đặc điểm giá trị là một chuỗi byte và ý nghĩa của nó được xác định bằng thông số kỹ thuật cấp cao dùng để xác định một đặc điểm nhất định. Ví dụ: giá trị của đặc tính Heart Rate Measurement (Đo lường tần số 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ảm biến cơ thể Đặc điểm vị trí mã hoá vị trí mà người dùng nên đeo cảm biến tần số 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 như "Điểm kiểm soát", trong đó việc viết thì giá trị đó cũng có tác dụng phụ. Ví dụ: đặc điểm Điểm kiểm soát tần số tim được dùng để yêu cầu cảm biến tần số tim đặt lại tổng lượng calo đã đốt cháy và chỉ hỗ trợ hoạt động ghi. Người nhận đạt được điều này, Chrome sẽ 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.
});

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

Để kiểm tra xem một đặc điểm có hỗ trợ đọc hoặc ghi hay không, ứng dụng có thể kiểm tra properties trường 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ị, trường này sẽ mô tả giá trị nào hoạt động mà đặc điểm hỗ trợ nói chung.

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

Một số đặc điểm thể hiện giá trị của chúng thông qua thông báo hoặc chỉ báo. Ví dụ: Đặc điểm Đo lường tần số tim không đọc được và không 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ể nghe những thông báo này bằng cách sử dụ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 đó không được bật theo mặc định. Một nên gọi 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 thông báo được bắt đầu, ứng dụng sẽ nhận được bluetoothLowEnergy.onCharacteristicValueChanged mỗi khi có thông báo hoặc chỉ báo nhận được từ đặc điểm. Nếu đặc điểm này hỗ trợ lượt đọc, thì sự kiện này cũng sẽ được được gửi sau khi gọi bluetoothLowEnergy.readCharacteristicValue thành công. Chế độ này cho phép các ứng dụng để hợp nhất quy trình kiểm soát của việc 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ó dòng chữ "Ứng dụng Cấu hình đặc trưng" để bật/tắt thông báo. Chrome không cho phép để ghi vào phần mô tả này. Thay vào đó, ứng dụng nên sử dụng bluetoothLowEnergy.startCharacteristicNotifications và Các phương thức bluetoothLowEnergy.stopCharacteristicNotifications để kiểm soát hành vi thông báo.