Skip to content

WebSocketProvider

createWebSocketProvider(serverUrl) devuelve un SerialProvider que retransmite I/O serial a un servidor puente Node.js a través de una conexión WebSocket.

Cuándo usarlo

  • Acceder a puertos seriales en una máquina remota (ej. una Raspberry Pi) desde un navegador.
  • Construir interfaces web para dispositivos conectados a un servidor detrás de un firewall.
  • Probar código serial en un entorno donde Web Serial no está disponible.

Importación

ts
import { createWebSocketProvider } from "webserial-core";

Función de fábrica

ts
createWebSocketProvider(serverUrl: string): SerialProvider
ParámetroTipoDescripción
serverUrlstringURL WebSocket del servidor puente (ej. "ws://localhost:8080")

Uso

ts
import {
  AbstractSerialDevice,
  delimiter,
  createWebSocketProvider,
} from "webserial-core";

AbstractSerialDevice.setProvider(
  createWebSocketProvider("ws://localhost:8080"),
);

class MyDevice extends AbstractSerialDevice<string> {
  constructor() {
    super({
      baudRate: 9600,
      parser: delimiter("\n"),
      autoReconnect: true,
    });
  }

  protected async handshake(): Promise<boolean> {
    return true;
  }
}

const device = new MyDevice();
await device.connect(); // Conecta al primer puerto listado por el puente

Uso por instancia

Pasa provider en las opciones del constructor para limitar el proveedor WebSocket a una sola instancia. Útil cuando diferentes dispositivos se conectan a distintos servidores puente, o cuando un dispositivo usa WebSocket y otro un proveedor diferente en la misma app.

ts
import {
  AbstractSerialDevice,
  delimiter,
  createWebSocketProvider,
} from "webserial-core";

class RemoteDevice extends AbstractSerialDevice<string> {
  constructor(bridgeUrl: string) {
    super({
      baudRate: 9600,
      parser: delimiter("\n"),
      autoReconnect: true,
      provider: createWebSocketProvider(bridgeUrl), // WS solo para esta instancia
    });
  }

  protected async handshake(): Promise<boolean> {
    return true;
  }
}

// Dos instancias independientes, cada una con su propia URL de puente
const deviceA = new RemoteDevice("ws://pi-sensor.local:8080");
const deviceB = new RemoteDevice("ws://pi-actuador.local:8080");

await deviceA.connect();
await deviceB.connect();

Servidor puente

Se incluye un servidor puente Node.js listo para usar en demos/websocket/server.js. Ve el README del demo del puente WebSocket para las instrucciones de configuración.

Protocolo de comunicación

Todos los mensajes son objetos JSON enviados sobre la conexión WebSocket.

DirecciónTipoDescripción del payload
Navegador → Serverlist-ports{ filters: SerialPortFilter[] }
Server → Navegadorport-list{ payload: PortInfo[] }
Navegador → Serveropen{ path, baudRate, dataBits, stopBits, parity, parser }
Server → Navegadoropenedconfirmación
Navegador → Serverwrite{ bytes: number[] }
Server → Navegadordata{ bytes: number[] }
Navegador → Serverclose
Server → Navegadorclosed
Server → Navegadorerror{ payload: { message: string } }

Selección de puerto

requestPort() abre una nueva conexión WebSocket, solicita la lista de puertos y selecciona automáticamente el primer puerto disponible. Para aplicaciones en producción, muestra un selector de UI sobre la lista de puertos devuelta antes de llamar a open.

Nota de seguridad

El servidor puente tiene acceso directo a los puertos seriales. Despliégalo solo en redes de confianza y añade autenticación para cualquier configuración expuesta a internet.

Publicado bajo la licencia MIT.