Взаимодействовать с Bluetooth-устройствами в Интернете

  1. Прежде чем мы начнем
  2. Доступно для ознакомительных испытаний
  3. Требования безопасности
  4. Только HTTPS
  5. Требуется жест пользователя
  6. Попасть в код
  7. Запрос устройств Bluetooth
  8. Подключиться к устройству Bluetooth
  9. Читать характеристики Bluetooth
  10. Написать на Bluetooth характеристику
  11. Отключиться от устройства Bluetooth
  12. Читать и писать в дескрипторы Bluetooth
  13. Образцы, демонстрации и кодовые метки
  14. начинающий
  15. Объединение нескольких операций
  16. Библиотеки
  17. Советы разработчиков
  18. Что дальше

Что если я скажу вам, что веб-сайты могут общаться с близлежащими устройствами Bluetooth безопасным и конфиденциальным способом? Таким образом, мониторы сердечного ритма, поющие лампочки, черепахи а также летающие сварливые кошки может взаимодействовать напрямую с веб-сайтом.

До сих пор возможность взаимодействия с устройствами Bluetooth была возможна только для нативных приложений. API-интерфейс Web Bluetooth направлен на то, чтобы изменить это и распространить на веб-браузеры. Наряду с такими усилиями, как Физическая Сеть люди могут ходить и взаимодействовать с устройствами прямо из Интернета. Проверьте это Дрон управляется из веб-приложения видео, чтобы понять, как это будет работать.

Прежде чем мы начнем

В этой статье предполагается, что у вас есть базовые знания о том, как Bluetooth Low Energy (BLE) и Профиль общих атрибутов (GATT) Работа.

Хотя Спецификация веб-Bluetooth API еще не завершена, команда Chrome активно ищет энтузиастов-разработчиков (я имею в виду вас), чтобы опробовать этот незавершенный API и дать Отзыв о спецификации а также отзывы о реализации ,

Подмножество веб-API Bluetooth доступно в Chrome OS, Chrome для Android M, Mac (Chrome 56) и Windows 10 (Chrome 70). Это означает, что вы должны быть в состоянии запрос а также присоединиться близлежащие устройства Bluetooth, читать / записывать Характеристики Bluetooth, получать уведомления ГАТТ знать когда Bluetooth-устройство отключается , и даже читать и писать в дескрипторы Bluetooth ,

Для более ранних версий Windows и Linux вам по-прежнему нужно перейти в chrome: // flags / # enable-эксперимент-web-platform-functions, включить выделенный флаг и перезапустить Chrome.

Доступно для ознакомительных испытаний

Чтобы получить как можно больше отзывов от разработчиков, использующих API Web Bluetooth в полевых условиях, мы ранее добавили эту функцию в Chrome 53 как исходное испытание для Chrome OS, Android M и Mac.

Судебный процесс успешно завершился в январе 2017 года.

Требования безопасности

Чтобы понять компромиссы безопасности, я рекомендую Модель безопасности Web Bluetooth сообщение от Джеффри Яскина, инженера-программиста из команды Chrome, работающего над спецификацией Web Bluetooth API.

Только HTTPS

Поскольку этот экспериментальный API является мощной новой функцией, добавленной в Интернет, Google Chrome стремится сделать его доступным только для безопасные контексты , Это означает, что вам нужно строить с учетом TLS.

Во время разработки вы сможете взаимодействовать с веб-Bluetooth через http: // localhost, используя такие инструменты, как Редактор Chrome Dev или удобный python -m SimpleHTTPServer, но для его развертывания на сайте вам необходимо настроить HTTPS на вашем сервере. Лично мне нравится GitHub Pages для демонстрационных целей.

Чтобы добавить HTTPS на ваш сервер, вам нужно получить сертификат TLS и настроить его. Не забудьте проверить Статья о безопасности с HTTPS для лучших практик там. Для информации, теперь вы можете получить бесплатные сертификаты TLS с новым центром сертификации Давайте зашифруем ,

Требуется жест пользователя

В качестве функции безопасности обнаружение устройств Bluetooth с помощью navigator.bluetooth.requestDevice должно быть инициировано пользовательский жест такие как прикосновение или щелчок мыши. Мы говорим о прослушивании pointerup , нажмите и коснитесь события.

button.addEventListener ('pointerup', function (event) {// Вызвать navigator.bluetooth.requestDevice});

Попасть в код

API веб Bluetooth в значительной степени опирается на JavaScript обещания , Если вы не знакомы с ними, проверьте этот великий Обещание учебник , Еще одна вещь, () => {} это просто ECMAScript 2015 Функции стрелок - они имеют более короткий синтаксис по сравнению с выражениями функций и лексически связывают значение this.

Запрос устройств Bluetooth

Эта версия спецификации Web Bluetooth API позволяет веб-сайтам, работающим в центральной роли, подключаться к удаленным серверам GATT через соединение BLE. Он поддерживает связь между устройствами, которые реализуют Bluetooth 4.0 или новее.

Когда веб-сайт запрашивает доступ к ближайшим устройствам с помощью navigator.bluetooth.requestDevice, Google Chrome предложит пользователю выбрать устройство, где он может выбрать одно устройство или просто отменить запрос.

Функция navigator.bluetooth.requestDevice принимает обязательный объект, который определяет фильтры. Эти фильтры используются для возврата только тех устройств, которые соответствуют объявленным службам Bluetooth GATT и / или имени устройства.

Например, запрос устройств Bluetooth, рекламирующих Обслуживание батареи Bluetooth GATT это просто:

navigator.bluetooth.requestDevice ({filters: [{services: ['battery_service']}]}) .then (device => {/ * ... * /}) .catch (ошибка => {console.log (ошибка) );});

Если вашей службы Bluetooth GATT нет в списке стандартизированные сервисы Bluetooth GATT тем не менее, вы можете предоставить либо полный UUID Bluetooth, либо короткую 16- или 32-битную форму.

navigator.bluetooth.requestDevice ({filters: [{services: [0x1234, 0x12345678, '99999999-0000-1000-8000-00805f9b34fb']}]}) .then (device => {/ * ... * /}) .catch (error => {console.log (error);});

Вы также можете запросить устройства Bluetooth на основе объявления имени устройства с помощью ключа фильтров имени или даже префикса этого имени с помощью ключа фильтров namePrefix. Обратите внимание, что в этом случае вам также потребуется определить ключ AdditionalServices, чтобы иметь возможность доступа к некоторым службам. Если вы этого не сделаете, вы получите ошибку позже при попытке доступа к ним.

navigator.bluetooth.requestDevice ({filters: [{name: 'Francois robot'}], необязательные услуги: ['battery_service']}) .then (device => {/ * ... * /}) .catch (error = > {console.log (error);});

Наконец, вместо фильтров вы можете использовать ключ acceptAllDevices, чтобы показать все близлежащие устройства Bluetooth. Вам также потребуется определить ключ AdditionalServices, чтобы иметь доступ к некоторым службам. Если вы этого не сделаете, вы получите ошибку позже при попытке доступа к ним.

navigator.bluetooth.requestDevice ({acceptAllDevices: true, optionServices: ['battery_service']}) .then (device => {/ * ... * /}) .catch (error => {console.log (error); });

Подключиться к устройству Bluetooth

Итак, что вы делаете сейчас, когда у вас есть BluetoothDevice, возвращенный из Promise navigator.bluetooth.requestDevice? Давайте подключимся к удаленному Bluetooth-серверу GATT, который содержит определения сервиса и характеристик.

navigator.bluetooth.requestDevice ({filters: [{services: ['battery_service']}]}) .then (device => {// Удобное для восприятия имя устройства. console.log (device.name); // Пытается подключиться к удаленному серверу GATT. Return device.gatt.connect ();}) .then (server => {/ * ... * /}) .catch (error => {console.log (error);} );

Читать характеристики Bluetooth

Здесь мы подключены к серверу GATT удаленного устройства Bluetooth. Теперь мы хотим получить Первичную услугу GATT и прочитать характеристику, которая принадлежит этой услуге. Попробуем, например, прочитать текущий уровень заряда батареи устройства.

В приведенном ниже примере battery_level является стандартизированная характеристика уровня заряда батареи ,

navigator.bluetooth.requestDevice ({filters: [{services: ['battery_service']}]}) .then (device => device.gatt.connect ()) .then (server => {// Получение обслуживания батареи .. . return server.getPrimaryService ('battery_service');}) .then (service => {// Получение характеристики уровня заряда батареи ... return service.getCharacteristic ('battery_level');}) .then (характеристика => {// Считывание уровня заряда батареи ... возвращаемая характеристика.readValue ();}) .then (значение => {console.log («Процент заряда батареи» + value.getUint8 (0));}) .catch (error => {console .log (ошибка);});

Если вы используете пользовательскую характеристику Bluetooth GATT, вы можете предоставить либо полный UUID Bluetooth, либо короткую 16- или 32-битную форму для service.getCharacteristic.

Обратите внимание, что вы можете также добавить прослушиватель события с признаком и значением для характеристики, чтобы обрабатывать чтение его значения. Проверять, выписываться Пример изменения значения признака чтобы узнать, как опционально обрабатывать предстоящие уведомления GATT.

... .then (характеристика => {// Настройка прослушивателя событий для случая, когда значение характеристики изменяется. характеристика. addEventListener ('Characteristicueueoted', handleBatteryLevelChanged); // // Чтение уровня заряда батареи ... return attribute.readValue ();}) .catch (error => {console.log (error);}); function handleBatteryLevelChanged (event) {let batteryLevel = event.target.value.getUint8 (0); console.log («Процент заряда батареи» + уровень батареи); }

Написать на Bluetooth характеристику

Запись в Bluetooth GATT Характеристика так же просто, как и чтение. На этот раз давайте воспользуемся точкой контроля сердечного ритма, чтобы сбросить значение поля «Расход энергии» на 0 на устройстве контроля сердечного ритма.

Я обещаю, что здесь нет магии. Это все объясняется в Страница характеристик контрольной точки сердечного ритма ,

navigator.bluetooth.requestDevice ({filters: [{services: ['heart_rate']}]}) .then (device => device.gatt.connect ()) .then (server => server.getPrimaryService ('heart_rate') ) .then (service => service.getCharacteristic ('heart_rate_control_point')) .then (характеристика => {// Запись 1 - это сигнал для сброса затраченной энергии. var resetEnergyExpended = Uint8Array.of (1); вернуть характеристику.writeValue ( resetEnergyExpended);}) .then (_ => {console.log ('Израсходовано энергии.');}) .catch (error => {console.log (error);});

Теперь давайте посмотрим, как получить уведомление, когда Измерение пульса Характерные изменения на устройстве:

navigator.bluetooth.requestDevice ({filters: [{services: ['heart_rate']}]}) .then (device => device.gatt.connect ()) .then (server => server.getPrimaryService ('heart_rate') ) .then (service => service.getCharacteristic ('heart_rate_measurement')) .then (характеристика => характеристика.startNotifications ()) .then (характеристика => {характеристика.addEventListener ('характеристика_значения_объекта) 'Уведомления запущены.');}) .Catch (error => {console.log (error);}); function handleCharacteristicValueChanged (event) {var value = event.target.value; console.log («Получено» + значение); // TODO: анализировать значение измерения пульса. // См. Https://github.com/WebBluetoothCG/demos/blob/gh-pages/heart-rate-sensor/heartRateSensor.js}

Образец уведомлений покажет вам, как остановить уведомления с помощью stopNotifications () и как правильно удалить добавленную характеристику прослушиваемого события со значением.

Отключиться от устройства Bluetooth

Чтобы обеспечить лучшее взаимодействие с пользователем, вы можете отобразить предупреждающее сообщение, если BluetoothDevice отключается, чтобы пригласить пользователя на повторное подключение.

navigator.bluetooth.requestDevice ({filters: [{name: 'Francois robot'}]}) .then (device => {// Настройка прослушивателя событий, когда устройство отключается. device.addEventListener ('gattserverdisconnected', onDisconnected) ; // Пытается подключиться к удаленному серверу GATT. Return device.gatt.connect ();}) .then (server => {/ * ... * /}) .catch (error => {console.log (error) );}); function onDisconnected (event) {let device = event.target; console.log ('Device' + device.name + 'отключен.'); }

Вы также можете вызвать device.gatt.disconnect (), чтобы отключить ваше веб-приложение от устройства Bluetooth. Это вызовет существующие прослушиватели событий gattserverdisconnected. Обратите внимание, что он НЕ прекратит связь с устройством Bluetooth, если другое приложение уже обменивается данными с устройством Bluetooth. Проверьте Пример отключения устройства и Образец автоматического переподключения нырнуть глубже.

Читать и писать в дескрипторы Bluetooth

Дескрипторы Bluetooth GATT - это атрибуты, которые описывают характерное значение. Вы можете читать и записывать их аналогично характеристикам Bluetooth GATT.

Посмотрим, например, как прочитать пользовательское описание интервала измерения термометра состояния устройства.

В приведенном ниже примере health_thermometer является Сервис термометров здоровья , измерение_интервал Характеристика интервала измерения и gatt.characteristic_user_description the Характеристика Дескриптор описания пользователя ,

navigator.bluetooth.requestDevice ({filters: [{services: ['health_thermometer']}]}) .then (device => device.gatt.connect ()) .then (server => server.getPrimaryService ('health_thermometer') ) .then (service => service.getCharacteristic (' measure_interval')) .then (характеристика => характеристика.getDescriptor ('gatt.characteristic_user_description')) .then (дескриптор => descriptor.readValue ()) .then (значение = > {let decoder = new TextDecoder ('utf-8'); console.log ('Описание пользователя:' + decoder.decode (value));}) .catch (error => {console.log (error);} );

Теперь, когда мы прочитали пользовательское описание интервала измерения термометра состояния устройства, давайте посмотрим, как его обновить и записать пользовательское значение.

navigator.bluetooth.requestDevice ({filters: [{services: ['health_thermometer']}]}) .then (device => device.gatt.connect ()) .then (server => server.getPrimaryService ('health_thermometer') ) .then (service => service.getCharacteristic ('measure_interval')) .hen '); let userDescription = encoder.encode (' Определяет время между измерениями. '); return descriptor.writeValue (userDescription);}) .catch (error => {console.log (error);});

Образцы, демонстрации и кодовые метки

Все Образцы веб-Bluetooth Ниже были успешно протестированы. Чтобы насладиться этими образцами в полной мере, я рекомендую вам установить Приложение BLE Peripheral Simulator для Android который имитирует BLE-периферию с помощью службы батарей, службы сердечного ритма или службы термометров состояния.

начинающий

  • Информация об устройстве - получить основную информацию об устройстве с устройства BLE.
  • Уровень заряда батареи - получить информацию о батарее из устройства BLE, рекламируя информацию о батарее.
  • Сбросить энергию - сбросить энергию, затраченную на устройство BLE, рекламирующее сердечный ритм.
  • Характеристические свойства - отобразить все свойства определенной характеристики с устройства BLE.
  • Уведомления - запускать и останавливать характерные уведомления от устройства BLE.
  • Отключение устройства - отключиться и получить уведомление об отключении устройства BLE после подключения к нему.
  • Получить характеристики - получить все характеристики рекламируемой услуги с устройства BLE.
  • Получить дескрипторы - получить дескрипторы всех характеристик рекламируемой услуги с устройства BLE.

Объединение нескольких операций

Проверьте наш куратор веб-демонстрации Bluetooth а также официальные веб-коды Bluetooth также.

Библиотеки

  • веб-Bluetooth-Utils это модуль npm, который добавляет некоторые удобные функции в API.
  • Оболочка Web Bluetooth API доступна в благородный , самый популярный центральный модуль Node.js BLE. Это позволяет вам упаковать / просмотреть благородный веб без необходимости использования сервера WebSocket или других плагинов.
  • угловой веб-Bluetooth это модуль для угловатый это отвлекает весь шаблон, необходимый для настройки Web Bluetooth API.
  • <Платино-Bluetooth> это набор полимер элементы для обнаружения и связи с близлежащими устройствами Bluetooth на основе веб-API Bluetooth. Например, вот как можно прочитать уровень заряда батареи с устройства Bluetooth, находящегося поблизости, рекламируя обслуживание батареи:

<platinum-bluetooth-device services-filter = '["battery_service"]'> <platinum-bluetooth-service service = 'battery_service'> <характеристика платиновой Bluetooth-характеристики = 'уровень-батареи'> </ характеристика платиновой bluetooth> </ platinum-bluetooth-service> </ platinum-bluetooth-device> var bluetoothDevice = document.querySelector («платиновое-bluetooth-устройство»); var batteryLevel = document.querySelector («характеристика платины-bluetooth»); bluetoothDevice.request () .then (_ => batteryLevel.read ()) .then (value => {console.log ('Процент заряда батареи равен + + value.getUint8 (0));}) .catch (error => {console.log (error);});

  • Начните с веб-Bluetooth это простое веб-приложение, которое генерирует весь стандартный код JavaScript для начала взаимодействия с устройством Bluetooth. Введите имя устройства, услугу, характеристику, определите ее свойства, и все готово.
  • Если вы уже являетесь разработчиком Bluetooth, Плагин Web Bluetooth Developer Studio также сгенерирует код JavaScript Web Bluetooth для вашего устройства Bluetooth.

Советы разработчиков

Страница «Внутренние устройства Bluetooth» доступна в Chrome по адресу chrome: // bluetooth-internals, так что вы можете проверить все, что касается соседних устройств Bluetooth: состояние, услуги, характеристики и дескрипторы.

Страница «Внутренние устройства Bluetooth» доступна в Chrome по адресу chrome: // bluetooth-internals, так что вы можете проверить все, что касается соседних устройств Bluetooth: состояние, услуги, характеристики и дескрипторы

Я также рекомендовал бы вам проверить официальный «Как подать веб-сообщения об ошибках Bluetooth» Страница как отладка Bluetooth иногда бывает сложной.

Что дальше

Проверить состояние реализации браузера и платформы сначала узнать, какие части Web Bluetooth API в настоящее время внедряются.

Хотя это все еще не полностью, вот краткий обзор того, что ожидать в ближайшем будущем:

  • Сканирование на наличие рекламы BLE поблизости произойдет с помощью navigator.bluetooth.requestLEScan ().
  • Указание обновления Eddystone позволит веб-сайту, открытому из уведомления Physical Web, обмениваться данными с устройством, которое объявило свой URL-адрес.
  • Новое событие с добавленной службой будет отслеживать недавно обнаруженные службы Bluetooth GATT, а событие с удаленной службой будет отслеживать удаленные. Новое событие с измененным сервисом сработает, когда какой-либо признак и / или дескриптор будет добавлен или удален из службы Bluetooth GATT.

Ресурсы

RequestDevice?