WebBluetooth: El eslabón perdido

Rate this content
Bookmark

La API de WebBluetooth finalmente cierra la brecha entre el navegador y los dispositivos que nos rodean. Y eso de repente abre un agujero de conejo, en el que inevitablemente nos encontramos con algunos obstáculos: la historia de un desarrollador frontend que se adentra en el mundo de IoT.

This talk has been presented at JSNation 2022, check out the latest edition of this JavaScript Conference.

FAQ

La API Web Bluetooth permite a los sitios web comunicarse con dispositivos Bluetooth de baja energía (BLE) directamente desde el navegador. Se utiliza para interactuar con dispositivos como bombillas inteligentes, sensores de fitness y otros dispositivos IoT, facilitando la interacción y el control directo a través de la web.

BLE significa Bluetooth de Baja Energía y es un estándar diseñado específicamente para dispositivos IoT, ofreciendo una eficiencia energética significativamente mejorada y funcionando a distancias relativamente largas en comparación con el Bluetooth tradicional, conocido como Bluetooth 4.0.

GATT, o Perfil Genérico de Atributos, es una estructura utilizada en BLE para organizar cómo un dispositivo periférico expone sus datos al cliente. Consiste en un servidor GATT que contiene una lista de servicios GATT, y cada servicio agrupa varias características que definen cómo se puede interactuar con los datos del dispositivo.

Los servicios y características en BLE se identifican por UUID (Identificadores Únicos Universales). Estos pueden ser UUID estándar que cubren casos de uso comunes, o UUID personalizados de 128 o 16 bits para casos específicos. Cada servicio agrupa características que pueden implicar operaciones como leer, escribir o ser notificado sobre cambios en los valores de los datos.

Para usar la API Web Bluetooth, primero necesitas solicitar el dispositivo mediante filtros que especifiquen los servicios. Una vez que el usuario selecciona y se conecta al dispositivo, puedes interactuar con él leyendo o escribiendo valores en sus características a través de UUIDs específicos.

Sí, es posible conectar múltiples dispositivos periféricos a un dispositivo central a través de una sola aplicación web utilizando la API Web Bluetooth. Esto permite controlar varios dispositivos simultáneamente dentro del alcance de Bluetooth.

La API Web Bluetooth está disponible en todos los navegadores basados en Chromium desde 2017. Sin embargo, no está disponible en navegadores que usen WebKit, como los de iOS, debido a restricciones en el uso de motores de navegación diferentes a WebKit en estos dispositivos.

Nico Martin
Nico Martin
24 min
16 Jun, 2022

Comments

Sign in or register to post your comment.
Video Summary and Transcription
Esta charla presenta la API de Web Bluetooth y su papel en la conexión entre navegadores y dispositivos periféricos. Cubre cómo interactuar con dispositivos utilizando la API, explora la creación de dispositivos BLE como un zumbador y un pequeño automóvil, y discute las limitaciones y disponibilidad de la API de Web Bluetooth. La charla también destaca el potencial de la API de Web Audio para el desarrollo de hardware y menciona la falta de soporte actual para la API de Web Bluetooth en dispositivos iOS.
Available in English: WebBluetooth – the Missing Link

1. Introducción a la API Web Bluetooth

Short description:

Por favor, denle la bienvenida a Nicole. Hoy estoy aquí para llevarlos a través de mi experiencia con la API Web Bluetooth. Los navegadores siempre han sido excelentes para renderizar datos, pero era difícil interactuar con dispositivos junto al navegador. Con las aplicaciones web progresivas y el proyecto Fugu, nuevas API como web USB, web serial API, web HID API, llenan la brecha entre el navegador y los dispositivos periféricos. Bluetooth es un estándar de tecnología inalámbrica que intercambia datos a corta distancia. BLE, Bluetooth de baja energía, es un nuevo estándar para dispositivos IoT. Web Bluetooth utiliza BLE. Bluetooth funciona con un dispositivo central y dispositivos periféricos. GATT es la forma en que un dispositivo periférico expone sus datos. Los servicios y características GATT se identifican mediante UUID. Los valores GATT son estructuras de datos de bajo nivel. La API web es sencilla.

Hola a todos. Mi nombre es Nicole. Hoy llegué un poco tarde porque estuve muy ocupada en el trabajo y pasé demasiado tiempo libre jugando con todas las nuevas tecnologías web y API de navegador, y hoy estoy aquí para llevar a través de mi experiencia con la API Web Bluetooth.

Los navegadores se han construido en torno a la idea de que solicitarían datos de un servidor y los renderizarían. Por lo tanto, los navegadores siempre han sido excelentes para renderizar datos. Pero siempre fue bastante difícil interactuar con dispositivos que estaban junto al navegador. Ahora, con todo el movimiento de aplicaciones web progresivas, con el proyecto Fugu, hemos visto un par de nuevas API, hemos visto web USB, web serial API, web HID API, y así sucesivamente, y todas intentan llenar esta brecha entre el navegador y los dispositivos periféricos.

Ahora, veamos algunos conceptos básicos. Bluetooth es una tecnología inalámbrica estándar para intercambiar datos que utiliza la misma frecuencia que LAN inalámbrica, pero envía cantidades muy pequeñas de datos a distancias bastante cortas. Si ahora piensas en esa experiencia antigua, defectuosa y frustrante que tuviste con tus primeros teléfonos inteligentes o tus primeros teléfonos móviles, tengo muy buenas noticias para ti, porque eso era el antiguo Bluetooth, Bluetooth 4.0. También tenemos BLE, que significa Bluetooth de baja energía, y ese es un estándar completamente nuevo que se construyó específicamente para dispositivos IoT, por lo que es muy eficiente en energía y también funciona a distancias bastante largas. Y con Web Bluetooth, siempre hablamos de BLE, porque es un estándar que se implementó. Entonces, Bluetooth normalmente funciona así. Tendrías un dispositivo central que es el dispositivo más capaz en términos de CPU y uso de batería, y luego tendrías dispositivos periféricos. Ahora, también nos referimos a ellos como el cliente y el servidor, y es muy importante que puedas conectar un dispositivo central a varios dispositivos periféricos, pero un dispositivo periférico solo puede estar conectado a un dispositivo central al mismo tiempo. Esa también es la razón por la que, por ejemplo, no puedes conectar tus auriculares y tu reloj inteligente al mismo teléfono inteligente, pero no puedes conectar tus auriculares a dos teléfonos inteligentes al mismo tiempo. Eso simplemente no es posible. Ahora, como parte de BLE, el grupo de interés especial de Bluetooth introdujo GATT, el perfil genérico de atributos, y básicamente es la forma en que el dispositivo periférico expone sus datos al cliente. Tendrías el servidor GATT que contiene una lista de servicios GATT, cada servicio es simplemente un grupo de características, y ahora, una característica identifica un valor y también define qué operaciones se pueden realizar en ese valor. Por ejemplo, si tienes un nivel de batería, tiene sentido que puedas leer el nivel de batería y también quieres ser notificado cuando el nivel de batería cambie en el dispositivo, pero no tiene sentido que sea escribible porque no puedes simplemente sobrescribir el nivel de batería y esperar que sea mágicamente 100 por ciento, si ese fuera el caso, nuestros problemas de energía, problemas de cambio climático se resolverían. Pero no es así. Pero si tienes la dirección de vuelo de un dron, por ejemplo, ahí sí tiene sentido o es crucial que puedas controlar la dirección, que no puedas controlar tu dron. Necesita ser escribible. Ahora, un valor GATT es una estructura de datos de bajo nivel, es solo un conjunto de bytes. Si ahora miras el lado derecho, aquí tengo la implementación de un servidor GTT del Playbulb Sphere, que es una bombilla de luz BLE, y tenemos los servicios, tenemos las características, y es muy importante mencionar que los servicios y características no se identifican realmente por sus nombres, sino por UUID. Hay una lista de UUID estándar mantenidos por el grupo de interés especial de Bluetooth que cubren casos de uso comunes como información sobre el dispositivo o niveles de batería, por lo que sabemos que en cada dispositivo, el servicio, o digamos el servicio 180F, sería el servicio de batería, pero también tenemos servicios no estándar como en ese ejemplo el servicio de luz y la característica de luz, y ahí podemos utilizar UUID de 128 bits, por lo que son largos y únicos, o podemos elegir UUID de 16 bits que aún no están especificados, en ese caso tenemos FF0F para el servicio de luz y FFFC para la característica. La parte complicada ahora es cómo se estructuran esos valores. Los dos primeros son bastante básicos, es básicamente una cadena codificada en UTF-8. El nivel de batería es la representación decimal de nuestro byte, por lo que 5a sería el 90 por ciento, y ahora para las características personalizadas, tenemos que recurrir a la documentación, y en la mayoría de los casos no hay documentación, pero en nuestro caso, tenemos documentación, por lo que sabemos que el Playbulb Sphere tiene cuatro bytes, cuatro LED dentro de la bombilla de luz, y con el valor de cada byte, puedes controlar la intensidad de uno de esos LED, y lo interesante ahora es que con rojo, verde y azul, básicamente podemos crear cualquier color que tengamos en el espacio de color RGB. Ahora que tenemos los conceptos básicos, veamos la API web. La API web es bastante sencilla.

2. Interactuando con dispositivos utilizando la API Web Bluetooth

Short description:

Para interactuar con dispositivos utilizando la API Web Bluetooth, debes solicitar un dispositivo, especificar los servicios y características, y conectarte al servidor. Puedes leer valores obteniendo el servicio y la característica utilizando UUID, y escribir valores llamando a la función de escritura de valores. Además, puedes escuchar cambios en los valores de las características y recibir notificaciones sobre la eficiencia de la batería. Luego, puedes probar la API conectándote a un dispositivo Playbop Sphere y seleccionando servicios para leer y escribir valores.

Primero debes solicitar un dispositivo, pasar un conjunto de filtros, necesitamos especificar los servicios que usaremos más adelante, y cuando se ejecute ese código, el usuario verá esta ventana emergente, allí podemos seleccionar uno de todos los dispositivos que coincidan con los filtros que hemos definido.

En nuestro caso, queremos filtrar por el nombre Playbop Sphere, y por lo tanto podemos seleccionar el Playbop Sphere, una vez que el usuario se conecta a él, podemos llamar a device.connect para conectarnos al servidor.

Para leer el valor, podemos obtener el servicio utilizando el UUID y también la característica utilizando el UUID. Ahora, en la característica, podemos llamar a characteristic.readValue para leer el valor, y en ese caso, recibiremos una vista de datos y ahora estamos interesados en el primer byte de la vista de datos en formato decimal, así que en este momento solo queremos imprimir en la consola el nivel de batería de la característica del dispositivo.

Dado que la característica de la batería también permite la operación de notificación, podemos agregar un event listener para el cambio de valor de la característica, y eso se activará cada vez que el nivel de batería cambie en el dispositivo. Es muy importante aquí también que necesitamos llamar a notifications porque, por eficiencia de la batería, esos eventos no se envían de forma predeterminada.

Para escribir valores, nuevamente necesitamos solicitar el servicio y la característica, esta vez para el servicio de luz. Ahora podemos leer el valor como antes, pero ahora estamos interesados en el valor RGB. Así que el segundo, el tercer y el cuarto valor. Y ahora, para escribir un valor, podemos llamar a la función writeValue sin respuesta o con respuesta. Eso depende del dispositivo que estés utilizando. Pero ambas funciones aceptan una nueva vista de datos. Así que en ese caso, simplemente sobrescribiremos la vista de datos actual y eso cambiará la característica en el dispositivo.

Ahora comencemos con una pequeña demostración. En primer lugar, mis diapositivas se ejecutan en el navegador. Lo que puedo hacer es abrir la consola. Y estos son exactamente los comandos que has visto antes. En primer lugar, copiemos esto. No soy una persona de trackpad, pero creo que funcionará. Ahora podemos conectarnos al Playbop Sphere. En el dispositivo, podemos seleccionar el servidor. En el servidor, podemos seleccionar el servicio de diapositivas. Y en el servicio de luz, ahora podemos escribir un nuevo valor. Así que en nuestro caso, queremos sobrescribir ese valor y esperamos que la bombilla de luz se encienda. Sí, OK. Lo siento, olvidé obtener la característica. Intentémoslo de nuevo. Aquí vamos. No, lo siento. Espera.

QnA

Check out more articles and videos

We constantly think of articles and videos that might spark Git people interest / skill us up or help building a stellar career

Instalar Nada: Interfaces de Aplicación con APIs Nativas del Navegador
JSNation 2024JSNation 2024
31 min
Instalar Nada: Interfaces de Aplicación con APIs Nativas del Navegador
This Talk introduces real demos using HTML, CSS, and JavaScript to showcase new or underutilized browser APIs, with ship scores provided for each API. The dialogue element allows for the creation of modals with minimal JavaScript and is supported by 96% of browsers. The web animations API is a simple and well-supported solution for creating animations, while the view transitions API offers easy animation workarounds without CSS. The scroll snap API allows for swipers without JavaScript, providing a smooth scrolling experience.
Ampliando los límites de la codificación de video en navegadores con WebCodecs
JSNation 2023JSNation 2023
25 min
Ampliando los límites de la codificación de video en navegadores con WebCodecs
Top Content
This Talk explores the challenges and solutions in video encoding with web codecs. It discusses drawing and recording video on the web, capturing and encoding video frames, and introduces the WebCodecs API. The Talk also covers configuring the video encoder, understanding codecs and containers, and the video encoding process with muxing using ffmpeg. The speaker shares their experience in building a video editing tool on the browser and showcases Slantit, a tool for making product videos.
API WebHID: Controla Todo a través de USB
JSNation 2022JSNation 2022
23 min
API WebHID: Controla Todo a través de USB
Today's Talk introduces the webHID API, which allows developers to control real devices from the browser via USB. The HID interface, including keyboards, mice, and gamepads, is explored. The Talk covers device enumeration, input reports, feature reports, and output reports. The use of HID in the browser, especially in Chrome, is highlighted. Various demos showcase working with different devices, including a DualShock controller, microphone, gamepad, and Stream Deck drum pad. The Talk concludes with recommendations and resources for further exploration.
Visualización de Cuellos de Botella de Rendimiento Front-End
React Summit 2020React Summit 2020
34 min
Visualización de Cuellos de Botella de Rendimiento Front-End
React's web-based tools allow for independent learning. Dazzone, a sports streaming service, faces challenges with low memory and CPU targets. Measuring, analyzing, and fixing performance issues is crucial. Virtualization improves rendering efficiency and performance. The application is now much faster with significantly less jank.
Automatiza el Navegador con la API de Renderizado del Navegador de Workers
JSNation 2024JSNation 2024
20 min
Automatiza el Navegador con la API de Renderizado del Navegador de Workers
The Talk discusses browser automation using the Worker's Browser Rendering API, which allows tasks like navigating websites, taking screenshots, and creating PDFs. Cloudflare integrated Puppeteer with their workers to automate browser tasks, and their browser rendering API combines remote browser isolation with Puppeteer. Use cases for the API include taking screenshots, generating PDFs, automating web applications, and gathering performance metrics. The Talk also covers extending sessions and performance metrics using Durable Objects. Thank you for attending!
Cómo he estado utilizando JavaScript para automatizar mi casa
JSNation 2022JSNation 2022
22 min
Cómo he estado utilizando JavaScript para automatizar mi casa
The Talk covers various experiments with JavaScript and C++, including controlling lights and creating a car control system. The speaker shares his experiences with home automation and the challenges of hiding wires. He explores using JavaScript with Esperino for face recognition and discusses the benefits and limitations of the platform. The Talk concludes with suggestions for using JavaScript in hardware projects and learning opportunities.

Workshops on related topic

Escribiendo Módulos Universales para Deno, Node y el Navegador
Node Congress 2022Node Congress 2022
57 min
Escribiendo Módulos Universales para Deno, Node y el Navegador
Workshop
Luca Casonato
Luca Casonato
En este masterclass te guiaré en la escritura de un módulo en TypeScript que pueda ser utilizado por usuarios de Deno, Node y los navegadores. Explicaré cómo configurar el formato, linting y pruebas en Deno, y luego cómo publicar tu módulo en deno.land/x y npm. Comenzaremos con una breve introducción sobre qué es Deno.
Construye una aplicación IoT con InfluxDB
JSNation Live 2021JSNation Live 2021
105 min
Construye una aplicación IoT con InfluxDB
Workshop
Miroslav Malecha
Miroslav Malecha
InfluxDB es una base de datos de series temporales de código abierto que permite a los desarrolladores construir software para IoT, análisis y monitoreo. Está diseñada específicamente para manejar los volúmenes masivos y las innumerables fuentes de datos con marca de tiempo producidos por sensores, aplicaciones e infraestructura.
Este masterclass muestra una aplicación de muestra completamente funcional llamada IoT Center que está construida sobre InfluxDB. Esta aplicación demuestra las capacidades de la plataforma InfluxDB para desarrollar una aplicación basada en series de tiempo habilitada para JavaScript. Recopila, almacena y muestra un conjunto de valores que incluyen temperatura, humedad, presión, concentración de CO2, calidad del aire, así como proporciona coordenadas GPS de un conjunto de dispositivos IoT. Con estos datos almacenados en InfluxDB, la aplicación puede consultar estos datos para mostrarlos y también escribir datos de nuevo en la base de datos.
Este masterclass práctico mostrará a los estudiantes cómo instalar este código de código abierto para aprender a consultar y escribir en InfluxDB utilizando el cliente JavaScript de InfluxDB, y familiarizarse con el lenguaje de consulta Flux que está diseñado para consultar, analizar y actuar sobre datos de series de tiempo. Y finalmente, recopilar y visualizar datos de rendimiento de la aplicación Node.js.
Masterclass de IoT Center por InfluxData
Node Congress 2021Node Congress 2021
131 min
Masterclass de IoT Center por InfluxData
Workshop
Miroslav Malecha
Miroslav Malecha
InfluxDB es una base de datos de series temporales de código abierto que permite a los desarrolladores construir software de IoT, análisis y monitoreo. Está diseñado específicamente para manejar los volúmenes masivos y las innumerables fuentes de datos con marca de tiempo producidos por sensores, aplicaciones e infraestructura. En esta masterclass se presenta una aplicación de muestra completamente funcional llamada IoT Center que se basa en InfluxDB. Esta aplicación demuestra las capacidades de la plataforma InfluxDB para desarrollar una aplicación basada en series de tiempo habilitada para JavaScript. Recopila, almacena y muestra un conjunto de valores que incluyen temperatura, humedad, presión, concentración de CO2, calidad del aire, así como proporciona coordenadas GPS de un conjunto de dispositivos IoT. Con estos datos almacenados en InfluxDB, la aplicación puede consultar estos datos para mostrarlos y también escribir datos en la base de datos.
En esta masterclass práctica, los estudiantes aprenderán cómo instalar este código de código abierto para aprender a consultar y escribir en InfluxDB utilizando el cliente JavaScript de InfluxDB, y familiarizarse con el lenguaje de consulta Flux que está diseñado para consultar, analizar y actuar sobre datos de series de tiempo. Y finalmente, recopilar y visualizar datos de rendimiento de la aplicación Node.js.
Requisitos previos
Cuenta gratuita registrada en InfluxDB Cloud en https://cloud2.influxdata.comTres opciones disponibles (a través de cuenta de Google, a través de cuenta de Microsoft o a través de correo electrónico)Probar inicio de sesión después del registro y guardar las credenciales para la masterclassInstalación de la herramienta git (por ejemplo, desde https://git-scm.com/downloads)Clonar IoT CenterEjecutar: git clone https://github.com/bonitoo-io/iot-center-v2Instalar nodejs (desde https://nodejs.org/en/download)Instalar el gestor de paquetes yarn (desde https://classic.yarnpkg.com/en/docs/install)Instalar los paquetes requeridosEn el directorio clonadoEjecutar: cd appEjecutar: yarn install