البلوتوث

يصف هذا المستند كيفية استخدام البلوتوث ومقبس البلوتوث والبلوتوث منخفض. واجهات برمجة التطبيقات Energy API للاتصال بالأجهزة التي تتضمّن بلوتوث والبلوتوث منخفض الطاقة.

للحصول على معلومات أساسية حول البلوتوث، يمكنك الاطّلاع على مواصفات البلوتوث الرسمية.

متطلبات ملف البيان

بالنسبة إلى تطبيقات Chrome التي تستخدم البلوتوث، أضِف إدخال البلوتوث إلى ملف البيان وحدِّد ما إذا كان والمعرّفات العالمية الفريدة للملفات الشخصية أو البروتوكولات أو الخدمات التي ترغب في تنفيذها إلى جانب ما إذا فأنت ترغب في تنفيذها باستخدام المقبس و/أو واجهات برمجة التطبيقات منخفضة الطاقة.

على سبيل المثال، بالنسبة إلى تنفيذ المقبس:

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

وللحصول على استخدام منخفض الطاقة:

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

للوصول إلى حالة المحوّل فقط، واكتشاف الأجهزة المجاورة، والحصول على المعلومات الأساسية حول الأجهزة، الإدخال نفسه مطلوب فقط:

"bluetooth": {}

معلومات المحوّل

جارٍ الحصول على حالة المحوّل

لمعرفة حالة محوّل البلوتوث، استخدِم الإجراء bluetooth.getAdapterState:

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

إشعارات المحوّل

يتم إرسال الحدث bluetooth.onAdapterStateChanged كلما تغيرت حالة المحوّل. يمكن أن لاستخدامها، على سبيل المثال، لتحديد وقت تشغيل أو إيقاف تشغيل المحوّل اللاسلكي.

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

معلومات الجهاز

عرض الأجهزة المعروفة

للحصول على قائمة بالأجهزة المعروفة بمحوّل البلوتوث، استخدِم bluetooth.getDevices. :

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

يتم إرجاع جميع الأجهزة، بما في ذلك الأجهزة المقترنة والأجهزة التي تم اكتشافها مؤخرًا. لن يكون بدء اكتشاف أجهزة جديدة (راجِع اكتشاف الأجهزة المجاورة).

تلقّي إشعارات الجهاز

بدلاً من الاتصال بـ bluetooth.getDevices بشكل متكرّر، يمكنك استخدام bluetooth.onDeviceAdded وbluetooth.onDeviceChanged وbluetooth.onDeviceRemoved الأحداث لتلقي الإشعارات.

يتم إرسال الحدث bluetooth.onDeviceAdded كلما اكتشف المحوّل جهازًا. إجراء اتصال بالمحوّل:

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

لا تؤدي إضافة مستمع لهذا الحدث إلى اكتشاف الأجهزة (راجِع اكتشاف الأجهزة المجاورة). الأجهزة).

يتم إرسال إشعار إلى التغييرات التي تطرأ على الأجهزة، بما في ذلك الأجهزة التي تم اكتشافها سابقًا والتي يتم إقرانها، من خلال حدث bluetooth.onDeviceChanged:

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

وأخيرًا، يتم إرسال الحدث bluetooth.onDeviceRemoved كلما تمّت إزالة جهاز مقترن من النظام أو جهاز تم اكتشافه لم يتم رصده مؤخرًا:

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

جارٍ اكتشاف الأجهزة المجاورة

لبدء رصد الأجهزة المجاورة، استخدِم طريقة bluetooth.startDiscovery. يمكن لميزة "اقتراحات" تستهلك مواردك بشكل كبير، لذا يجب عليك طلب bluetooth.stopDiscovery عند الانتهاء.

يجب الاتصال بـ bluetooth.startDiscovery عندما يحتاج تطبيقك إلى اكتشاف الأجهزة المجاورة. لا تجعل المكالمة مشروطة على السمة discovering في bluetooth.AdapterState. تشير رسالة الأشكال البيانية ستنجح المكالمة حتى إذا كان هناك تطبيق آخر يستكشف الأجهزة المجاورة، ويضمن المحوّل إجراء الاكتشاف بعد توقف التطبيق الآخر.

ويتم تلقّي معلومات حول كل جهاز تم اكتشافه حديثًا باستخدام bluetooth.onDeviceAdded. فعالية. للأجهزة التي تم اكتشافها مؤخرًا أو التي تم إقرانها في السابق أو متصل بها، فلن يتم إرسال الحدث. بدلاً من ذلك، يجب الاتصال بـ bluetooth.getDevices على الحصول على المعلومات الحالية واستخدام الحدث bluetooth.onDeviceChanged لتلقّي الإشعارات التغييرات التي تطرأ على هذه المعلومات نتيجة اكتشافها.

مثال:

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

إذا أوقف المستخدم الراديو الذي يتضمّن بلوتوث، سيتم إنهاء جميع جلسات الاكتشاف ولن يتم استئنافها. تلقائيًا عند تشغيل الراديو. إذا كان هذا مهمًا لتطبيقك، يجب ملاحظة حدث bluetooth.onAdapterStateChanged. إذا تغيّرت السمة discovering إلى false، يجب عندها: سيحتاج تطبيقك إلى الاتصال بـ bluetooth.startDiscovery مرّة أخرى لاستئنافه. انتبه من ذات الموارد الكثيفة للاكتشاف.

التعرّف على الأجهزة

يتم تقديم عدد من الخيارات المختلفة لتحديد الأجهزة التي تم إرجاعها بواسطة bluetooth.getDevices والأحداث ذات الصلة

إذا كان الجهاز متوافقًا مع مواصفات رقم تعريف الجهاز التي تتضمّن بلوتوث، ستتم إضافة عدة خصائص إلى كائن الجهاز الذي يحتوي على الحقول المحددة بهذه المواصفات. مثال:

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

عادةً ما تكون مواصفات رقم تعريف الجهاز كافية لتحديد طراز معين وحتى المراجعة، للجهاز من أحد الموردين. وفي حال عدم توفّره، عليك الاعتماد على المعلومات المتعلقة فئة الجهاز أو نوعه، ويمكن دمجها إذا أردت مع بادئة الشركة المصنّعة في address.

توفر معظم أجهزة البلوتوث معلومات فئة الجهاز كحقل بت يتم تفسيره وفقًا مستند الأرقام المخصّصة للنطاق الأساسي. يتوفّر حقل البت هذا في 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));
    }
  }
});

قد يكون تحليل الحقل معقّدًا، لذلك بالنسبة إلى أنواع الأجهزة الأكثر شيوعًا التي يعالجها Chrome نيابةً عنك لضبط الحقل type. عندما لا يكون هذا الخيار متاحًا، أو غير كافٍ لاحتياجاتك، فستحتاج إلى تحلِّل 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);
    }
  }
});

استخدام RFCOMM وL2CAP

قد تُجري تطبيقات Chrome اتصالات بأي جهاز يتوافق مع خدمات RFCOMM أو L2CAP. وتشمل هذه المعلومات ما يلي: لمعظم أجهزة بلوتوث الكلاسيكية في السوق.

الاتصال بمقبس

لإجراء اتصال بأحد الأجهزة، تحتاج إلى ثلاثة أشياء. مقبس لإجراء الاتصال ويكون تم إنشاؤه باستخدام bluetoothSocket.create عنوان الجهاز الذي تريد الاتصال به، وUUID للخدمة نفسها.

قبل إجراء الاتصال، يجب عليك التحقق من أن المحوّل على دراية بالجهاز باستخدام bluetooth.getDevice أو واجهات برمجة تطبيقات اكتشاف الجهاز

يشير هذا المصطلح إلى المعلومات اللازمة لإنشاء الاتصال الأساسي، بما في ذلك ما إذا كان بروتوكول RFCOMM أو يجب استخدام بروتوكول L2CAP وتحديد القناة أو PSM، اللذين يتم الحصول علىهما باستخدام اكتشاف SDP على الخاص بك.

مثال:

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

احتفِظ بمقبض للوصول إلى SocketId كي تتمكّن من إرسال البيانات (bluetoothSocket.send) إلى هذا الرقم لاحقًا. بنجاح.

الاستلام من المقبس وإرساله إلى

يتم استخدام كائنات ArrayBuffer لتلقّي البيانات من المقبس وإرسالها. لمعرفة معلومات عن ArrayBuffers، يمكنك الاطّلاع على النظرة العامة والصفائف المكتوبة بلغة JavaScript والدليل التوجيهي حول كيفية تحويل ArrayBuffer. من وإلى سلسلة.

لإرسال البيانات المتوفّرة لديك في "arrayBuffer"، استخدِم 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")
  }
})

على عكس طريقة إرسال البيانات، يتم استلام البيانات في حدث (bluetoothSocket.onReceive. يتم إنشاء المقابس غير المتوقّفة مؤقتًا (راجِع bluetoothSocket.setPaused). لذا، تتم عادةً إضافة المستمع لهذا الحدث بين bluetoothSocket.create و bluetoothSocket.connect

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

تلقي أخطاء المقبس وانقطاع الاتصال

ليتم إشعارك بأخطاء المقبس، بما في ذلك انقطاع الاتصال، أضف مستمعًا إلى حدث bluetoothSocket.onReceiveError.

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

قطع الاتصال بمقبس

ولإنهاء الاتصال وفصل المقبس، استخدِم bluetoothSocket.disconnect.

chrome.bluetoothSocket.disconnect(socketId);

نشر الخدمات

بالإضافة إلى إجراء اتصالات صادرة بالأجهزة، قد تنشر تطبيقات Chrome خدمات قد تكون يستخدمه أي جهاز يتوافق مع RFCOMM أو L2CAP.

الاستماع على المقبس

يتوفر نوعان من الخدمات المنشورة. ويعتبر معيار RFCOMM هو الأكثر استخدامًا ويتناول غالبية الأجهزة والملفات الشخصية:

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

أما L2CAP، فيشمل أنواعًا أخرى من الأجهزة واستخدامات خاصة بالموردين، مثل البرامج الثابتة التحميل.

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

وفي كلتا الحالتين، يمكن تمرير bluetoothSocket.ListenOptions لتخصيص حقل محدّد. أو PSM. تشير معاودة الاتصال إلى حدوث خطأ خلال chrome.runtime.lastError والنجاح. وإلا. احتفِظ بمقبض إلى SocketId حتى تتمكّن من قبول الاتصالات لاحقًا. (bluetoothSocket.onAccept) من هذا المقبس.

قبول عمليات ربط العملاء

يتم قبول اتصالات العملاء وتمريرها إلى طلبك من خلال حدث 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);
});

إيقاف قبول اتصالات العملاء

لإيقاف قبول اتصالات العملاء وإلغاء نشر الخدمة، استخدِم bluetoothSocket.disconnect.

chrome.bluetoothSocket.disconnect(serverSocketId);

التفاعل مع الأجهزة منخفضة الطاقة

تقنية Bluetooth Low Energy أو (Bluetooth Smart) هي تقنية لاسلكية تهدف إلى خفض الطاقة استهلاكنا. تسمح واجهة برمجة تطبيقات البلوتوث منخفض الطاقة للتطبيقات بتنفيذ الدور المركزي في اتصال منخفض الطاقة (LE) بجهاز ملحق. توضح الأقسام التالية كيفية اكتشاف جهات الاتصال التفاعل مع الأجهزة الملحقة بالبلوتوث منخفض الطاقة.

اكتشاف الأجهزة الملحقة والتوصيل بها

كما هو الحال مع أجهزة البلوتوث التقليدية، يمكن اكتشاف الأجهزة الملحقة ذات الطاقة المنخفضة (LE) باستخدام الطرق الموضّحة في اكتشاف الأجهزة المجاورة . يصبح جهاز منخفض الطاقة قابلاً للاكتشاف من خلال إرسال حِزم البيانات. باسم "بيانات إعلانية" ويُقال إنّ الجهاز في وضع الإعلانات. بيانات الإعلان على معرّف فريد عالمي (UUID) للخدمات المتاحة على الجهاز. وفي حالة وجودها، ستكون هذه المعرفات الفريدة يمكن الوصول إليها باستخدام السمة uuids لكائن bluetooth.Device المقابل.

بعد اكتشاف الجهاز، يمكن الاتصال به من خلال الاتصال بـ bluetoothLowEnergy.connect لكي لكي يتفاعل التطبيق مع خدماته:

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

بعد اكتمال عملية الربط، سيتم تنفيذ الإجراء على السمة connected في العنصر bluetooth.Device المقابل. على القيمة true. يؤدي الاتصال بـ bluetoothLowEnergy.connect إلى إنشاء مطالبة من خلال الاتصال الفعلي بالجهاز. قد يكون هناك اتصال مادي بالجهاز. بدون الاتصال على الإطلاق بـ bluetoothLowEnergy.connect (بسبب تطبيق آخر مثلاً). ضِمن في هذه الحالة، فعلى الرغم من استمرار إمكانية تفاعل تطبيقك مع خدمات الجهاز، إلا أنه يجب الاتصال دائمًا بـ bluetoothLowEnergy.connect لمنع تطبيق آخر من قطع الاتصال ارتباطًا وثيقًا.

عندما لا يكون تطبيقك بحاجة إلى الاتصال، يمكن إزالة المطالبة المتعلقة بالاتصال من خلال جارٍ الاتصال بـ bluetoothLowEnergy.disconnect:

chrome.bluetoothLowEnergy.disconnect(deviceAddress);

لاحظ أن هذا لن يؤدي بالضرورة إلى تدمير الرابط الفعلي للجهاز، إذ قد تكون هناك التطبيقات التي لديها اتصالات نشطة بالجهاز. في بعض الأحيان قد يصبح الجهاز غير متصل لأسباب لا يمكن منها التحكم في التطبيق (على سبيل المثال، إذا كان الجهاز تختفي أو يتم فصلها بشكل صريح من قِبل المستخدم من خلال برامج خدمات نظام التشغيل). يجب أن يتتبّع تطبيقك الحدث bluetooth.onDeviceChanged لتلقّي إشعارات بالتغييرات. بالاتصال وإعادة الاتصال إذا لزم الأمر.

بعد الاتصال، سيكون الجهاز الذي يعمل بمتصفّح Chrome في ما يُعرف باسم الدور المركزي، في حين أن الجهاز البعيد يؤدي دور الجهاز الملحق. في هذه المرحلة، قد يتفاعل تطبيقك مع الخدمات على الجهاز باستخدام الطرق الموضحة في القسم التالي. ملاحظة: لا تتيح واجهات برمجة التطبيقات العمل حاليًا كجهاز ملحق منخفض الطاقة (LE). التطبيقات يمكنها فقط تنفيذ الدور المركزي.

الخدمات والخصائص والأدوات الوصفية

تستند تقنية Bluetooth Low Energy إلى بروتوكول بسيط استجابةً لطلب الاستجابة يسمى بروتوكول السمة (ATT). باستخدام "سياسات شفافية تتبُّع التطبيقات"، يتفاعل الجهاز المركزي مع ما يُعرف باسم السمات على الجهاز الملحق من خلال التوافق مع ملف شخصي خاص عبر البلوتوث يُسمى الملف الشخصي للسمة العامة (GATT). اتفاقية GATT تحدد المفاهيم عالية المستوى التالية:

  • الخدمة: تمثل خدمة GATT مجموعة من البيانات والسلوكيات المرتبطة بها لتحقيق لوظيفة معينة للجهاز. فعلى سبيل المثال، عادةً ما يكون لجهاز مراقبة معدل ضربات القلب ما لا يقل عن واحدة "خدمة معدل ضربات القلب". يتم تضمين المعلومات المتعلقة بخدمة GATT في العنصر bluetoothLowEnergy.Service
  • الخاصية: GATT هي عنصر بيانات أساسي يُستخدم لإنشاء خدمة GATT، الذي يحتوي على قيمة إلى جانب الخصائص التي تحدد كيفية الوصول إلى هذه القيمة. على سبيل المثال: و"خدمة معدل ضربات القلب" يحتوي على "قياس معدل ضربات القلب" والخاصية، والتي تستخدم للحصول على قيمة معدل ضربات قلب المستخدم. يتم تضمين المعلومات المتعلقة بخاصية GATT في الكائن bluetoothLowEnergy.Characteristic
  • الواصف: يحتوي واصف خاصية GATT على معلومات إضافية حول إحدى الخصائص. يتم تضمين المعلومات حول واصف خاصية GATT في الكائن bluetoothLowEnergy.Descriptor.

تسمح واجهة برمجة التطبيقات Bluetooth Low Energy للتطبيقات بالبحث عن معلومات حول مكوّنات جهاز. والخدمات والخصائص والأدوات الوصفية من خلال استدعاء bluetoothLowEnergy.getServices bluetoothLowEnergy.getCharacteristics وbluetoothLowEnergy.getDescriptors يمكن للتطبيقات الفلترة حسب الخدمات والخصائص والأدوات الوصفية من خلال مقارنة حقل uuid بـ المعرّف الفريد العالمي (UUID) المطلوب لـ GATT:

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

يتم تعيين فئة فريدة لكل خدمة وسمة ووصف يمكن الوصول إليها من خلال واجهة برمجة التطبيقات الذي يمكن الحصول عليه باستخدام الحقل instanceId. يمكن استخدام رقم تعريف هذا المثيل يُستخدم لتحديد كائن GATT ولتنفيذ عمليات معينة عليه:

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

أحداث الخدمة

بعد توصيل الجهاز، سيكتشف Chrome خدماته. عند اكتشاف كل خدمة بعد ذلك، سيتلقّى التطبيق الحقل bluetoothLowEnergy.onServiceAdded و أحداث 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 جميع خصائص الخدمة ووصفاتها بشكل غير متزامن ويرسل الحدث bluetoothLowEnergy.onServiceAdded بعد اكتمال اكتشافه إذا كان الاتصال عمليات إنهاء الجهاز الملحق، يزيل Chrome جميع الخدمات ذات الصلة، ويرسل الحدث bluetoothLowEnergy.onServiceRemoved

قد تعدّل بعض الأجهزة الملحقة خدماتها، على سبيل المثال: قد تتغير خصائص الخدمة أو قد تتم إضافة خدماتها وإزالتها تمامًا. ويُرسِل Chrome إشعارات إلى التطبيقات بهذه التغييرات باستخدام bluetoothLowEnergy.onServiceChanged، وbluetoothLowEnergy.onServiceAdded، و أحداث bluetoothLowEnergy.onServiceRemoved

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

    updateMyService(service);
  });

قراءة قيمة السمة وكتابتها

وتشفّر خاصية GATT جانبًا واحدًا من خدمتها. التطبيق المركزي يقرأ ويتعامل مع المحتوى ويعدّله حالة خدمة الجهاز الملحق من خلال العمل على قيمة الميزة. الخاصية القيمة عبارة عن سلسلة من وحدات البايت ويتم تحديد معناها من خلال المواصفات عالية المستوى التي تحدد بخاصية معينة. على سبيل المثال، قيمة سمة قياس معدّل نبضات القلب تعمل على ترميز معدّل نبضات قلب المستخدم وإجمالي السعرات الحرارية التي حرقها، أمّا أداة استشعار الجسم تعمل خاصية الموقع الجغرافي على ترميز المواضع التي يجب فيها ارتداء جهاز استشعار معدّل نبضات القلب في الجسم.

يوفّر Chrome طريقة bluetoothLowEnergy.readCharacteristicValue لقراءة قيمة الخاصية:

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

بعض الخصائص قابلة للكتابة، خاصة تلك التي تعمل كـ "نقاط تحكم"، حيث إن كتابة للقيمة لها آثار جانبية. على سبيل المثال، يتم استخدام خاصية نقطة التحكم في معدّل نبضات القلب بهدف الطلب من جهاز استشعار معدّل نبضات القلب أن يعيد ضبط عدد السعرات الحرارية المحروقة ويدعم عمليات الكتابة فقط. إلى لتحقيق ذلك، يوفّر Chrome طريقة 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.
});

تتصرف أوصاف الخصائص بنفس الطريقة ويمكن أن تكون قابلة للقراءة و/أو قابلة للكتابة. يوفّر Chrome مَعلمة bluetoothLowEnergy.readDescriptorValue وbluetoothLowEnergy.writeDescriptorValue لقراءة قيمة الواصف وكتابةها.

لمعرفة ما إذا كانت إحدى السمات تتوافق مع القراءة أو الكتابة، يمكن لأحد التطبيقات التحقّق من properties الحقل الخاص بالكائن bluetoothLowEnergy.Characteristic وعلى الرغم من أنّ هذا الحقل لا يحتوي على معلومات حول متطلبات الأمان للوصول إلى قيمة ما، فإنها تصف القيمة التي العملية التي تدعمها الخاصية بشكل عام.

التعامل مع إشعارات القيمة

تجعل بعض الخصائص قيمتها معروفة باستخدام الإشعارات أو المؤشرات. على سبيل المثال لا يمكن قراءة سمة قياس معدل نبضات القلب ولا يمكن كتابتها، ولكن يتم إرسال تحديثات بشأن القيمة الحالية على فترات منتظمة. يمكن للتطبيقات الاستماع إلى هذه الإشعارات باستخدام حدث bluetoothLowEnergy.onCharacteristicValueChanged

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

    var bytes = new Uint8Array(chrc.value);

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

حتى إذا كانت هناك ميزة تتوافق مع الإشعارات/المؤشرات، لا يتم تفعيلها تلقائيًا. إنّ فينبغي أن يستدعي bluetoothLowEnergy.startCharacteristicNotifications طرق bluetoothLowEnergy.stopCharacteristicNotifications لبدء استقبال أو إيقاف الحدث 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);
  }

بعد بدء الإشعارات، سيتلقّى التطبيق bluetoothLowEnergy.onCharacteristicValueChanged في كل مرة يتم فيها عرض إشعار أو مؤشر يتم الحصول عليها من الخاصية. وإذا كانت الخاصية تدعم القراءة، فسيكون هذا الحدث أيضًا تم إرساله بعد مكالمة ناجحة إلى bluetoothLowEnergy.readCharacteristicValue. يسمح هذا الإجراء للتطبيقات لتوحيد مسار التحكّم لتعديل قيمة يتم تشغيله من خلال طلب قراءة والإشعارات:

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

إذا كانت إحدى الميزات تتوافق مع الإشعارات، سيحتوي الحقل properties الخاص بها على السمة "notify" أو "indicate".

ملاحظة: إذا كانت هناك خاصية تدعم الإشعارات/المؤشرات، فسيكون لديها "العميل تكوين السمة" واصف لتفعيل/إيقاف الإشعارات. لا يسمح Chrome التطبيقات بالكتابة إلى هذا الواصف. يجب أن تستخدم التطبيقات bluetoothLowEnergy.startCharacteristicNotifications و طرق bluetoothLowEnergy.stopCharacteristicNotifications للتحكم في سلوك الإشعارات.