Разработчикам может быть трудно идти в ногу со всеми новыми доступными фреймворками и инструментами, но иметь базовые знания о том, что они могут предложить, как они работают и т. Д., Всегда приятно.
По моему собственному опыту, хороший способ сделать это - работать над небольшими личными проектами, где у вас есть возможность познакомиться с технологией, создавая что-то, что вам действительно нравится.
В последнее время меня заинтересовал 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. Все функции еще не реализованы, но мне этого хватило, чтобы добраться туда, куда я хотел.
Не стесняйтесь вносить свой вклад и отправлять запросы на включение! :)