Разработчикам может быть трудно идти в ногу со всеми новыми доступными фреймворками и инструментами, но иметь базовые знания о том, что они могут предложить, как они работают и т. Д., Всегда приятно.

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

В последнее время меня заинтересовал Web Bluetooth API. Поскольку мне очень нравится возиться с оборудованием, я работал над небольшими прототипами в Node.js в прошлом, но подумал, что с этим новым API будет действительно интересно поиграть.

Поскольку у меня есть несколько устройств Bluetooth, таких как Sphero 2.0 и повязка Myo, я подумал, что могу попробовать создать что-нибудь для взаимодействия с одним из этих устройств в браузере.

Я ничего не знал о протоколах bluetooth до того, как начал заниматься этим, поэтому этот личный проект многому меня научил.

Если вам не хочется читать все это, вы можете сразу перейти к репозиторию Github.

Основные факты.

Прежде всего, вы должны знать, что Web Bluetooth работает только с устройствами BLE (Bluetooth Low Energy). В результате я не смог использовать свой Sphero для этого проекта, но повязка Myo работала нормально.

Устройства BLE работают в подключенной среде следующим образом: периферийное устройство может быть подключено только к одному центральному устройству, но центральное устройство может быть подключенным к нескольким периферийным устройствам. В этом проекте ноутбук является центральным устройством, а повязка Myo - периферийным.

Чтобы установить связь между двумя устройствами, они должны быть сначала соединены вместе. После установления соединения данные могут передаваться между ними с помощью протокола GATT (Generic Attribute Profile).

Настраивать

Начать работу с Web Bluetooth довольно просто, но вам нужно знать две важные вещи:

  • Ваш веб-сайт должен обслуживаться через HTTPS.
  • Подключение к устройству должно инициироваться действием пользователя (например, щелчком)

Как только действие пользователя инициировано, вам необходимо запросить ближайшие устройства BLE. Вы можете принять все устройства или предоставить объект, содержащий имя устройства и / или службы Bluetooth.

Пример Hello World

Вот пример кода, чтобы начать запрашивать обслуживание батареи Myo:

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

Как только проблема будет решена, мы сможем получить первичный сервис GATT и прочитать одну из его характеристик.

В целом это будет выглядеть так:

Использование пользовательских сервисов и характеристик GATT

Теперь, если мы хотим получить доступ к настраиваемым службам и характеристикам GATT из Myo (например: данные EMG), нам нужно предоставить их полные UUID Bluetooth в getPrimaryService и getCharacteristic функции.

Чтобы узнать, что это за UUID, я нашел репозиторий на Github со спецификацией Bluetooth на повязке Myo.

Просматривая код, я обнаружил, что MYO_SERVICE_BASE_UUID был в формате 128-битного UUID, равного d5060000-a904-deb9-4748-2c7f4a124842, полученного из следующего перечисления:

#define MYO_SERVICE_BASE_UUID { \
    0x42, 0x48, 0x12, 0x4a,     \
    0x7f, 0x2c, 0x48, 0x47,     \
    0xb9, 0xde, 0x04, 0xa9,     \
    0x00, 0x00, 0x06, 0xd5      \
}

Чтобы получить доступ к сервисам и характеристикам, нам нужно заменить два 0x00 шестнадцатеричных байта любым другим коротким 16-битным UUID из стандартных сервисов Myo enum.

Например, короткий UUID для ControlService - 0x0001, поэтому полный UUID будет d5060001-a904-deb9-4748-2c7f4a124842.

Используя Web Bluetooth API, нам не нужно ссылаться на полный UUID, мы также можем использовать короткие UUID; поэтому запрос ControlService можно выполнить с помощью:

Теперь, когда у нас есть доступ к ControlService, нам нужно указать Myo, что мы хотим получать все данные, прежде чем мы сможем получать IMU, EMG и данные позы.

Для этого нам нужно записать значение в CommandCharacteristic, чтобы установить IMU, EMG и режим классификатора.

В приведенном выше коде вы можете видеть, что после возврата CommandCharacteristic мы создаем массив, в котором передаем различные значения для интересующих нас режимов и записываем это в характеристику. Подробнее о различных режимах, доступных здесь.

Как только мы указали Myo данные, которые хотим получить, мы можем запросить новые услуги и характеристики.

Поскольку полученные данные IMU постоянно меняются, мы можем получать уведомления об этих обновлениях с помощью функции startNotifications().

Из приведенного выше примера кода этот фрагмент кода делает следующее:

char.startNotifications().then(res => {
   char.addEventListener('characteristicvaluechanged', handleIMUDataChanged);
})
var handleIMUDataChanged = (event) => {
   let imuData = event.target.value;
   let accelerometerX = imuData.getInt16(8) / 2048;
}

Если вам интересно, что здесь делает этот 2048-й, достаточно честно! Из спецификации Myo bluetooth кажется, что данные о движении умножаются на разные шкалы (2048 для данных акселерометра, 16 для данных гироскопа и 16348 для данных ориентации). В результате, когда мы распаковываем данные в нашей функции handleIMUDataChanged, нам нужно разделить наши данные по соответствующему масштабу.

Этот процесс одинаков для данных ЭМГ и данных различных событий позы / рук.

Если у вас есть Myo и вы хотите попробовать это, вы можете перейти на эту страницу.

Больше кода можно найти в репозитории Github. Все функции еще не реализованы, но мне этого хватило, чтобы добраться туда, куда я хотел.

Не стесняйтесь вносить свой вклад и отправлять запросы на включение! :)