Monitor de bus CAN.

Se construyó un panel web en tiempo real para monitorear, depurar y visualizar redes de buses CAN, con registro de tramas en vivo, descubrimiento de topología, seguimiento de conexiones y comunicación híbrida de nodos.

Diagrama de circuito para un monitor de bus CAN.

Un bus CAN no le proporciona registros; le proporciona bytes, todos transmitidos a través de un único cable compartido, sin ninguna indicación integrada de quién se está comunicando con quién. can-monitor transforma unas pocas placas Arduino + MCP2515 en esa funcionalidad que falta: una pestaña del navegador que monitoriza cada nodo del bus en tiempo real, dibuja la red a medida que se forma y, dado que el mismo cable que transmite información de diagnóstico puede transmitir cualquier cosa, permite que dos nodos mantengan una conversación textual real a través de tramas CAN.

Seis microcontroladores, una pestaña del navegador.

No es necesario instalar ningún componente de backend ni controlador. SerialManager abre cada nodo a través del propio API Web Serial del navegador (navigator.serial.requestPort()) y mantiene cada conexión en un objeto Map simple, indexado por el ID del puerto, permitiendo leer y multiplexar varios nodos físicos simultáneamente desde un único componente cliente. Cada lector ejecuta su propio bucle, almacena temporalmente fragmentos incompletos entre lecturas para que una línea dividida a la mitad se interprete correctamente, y envía las líneas completas a la página. Toda la aplicación está desarrollada con Next.js 15 (App Router) y React 19 en TypeScript, utilizando D3 para la visualización de la topología y Tailwind para el estilo del panel de instrumentos; sin embargo, la parte que realiza el trabajo real, es decir, la lectura de hardware físico desde una pestaña sin necesidad de extensiones ni servidor local, se basa únicamente en las funcionalidades ya incluidas en el navegador.

Un protocolo lo suficientemente sencillo como para poder leerlo por encima del hombro de alguien.

Cada nodo ejecuta el mismo programa con un modo diferente compilado: LOOPBACK, SENDER, RECEIVER, SNIFFER, OBD o HYBRID, y todos utilizan un protocolo basado en líneas y delimitadores de tubería a través de la conexión serial. Un nodo se anuncia una vez al inicio y luego informa de todo: cada trama CAN que envía o recibe, un pulso cada dos segundos y un contador de tramas cada cinco. Aquí no se necesita ningún analizador binario ni ninguna especificación; es como leer un registro porque está diseñado para serlo.

serial output — one HYBRID nodetext
NODE|HYBRID|HYBRID
HB|SENT|HYBRID|148
CAN|TX|321|6|48 45 4c 4c 4f 00|HELLO
CAN_PEER|ID:321
STAT|FRAMES|12

El archivo parser.tsx convierte cada una de esas líneas en un objeto CanFrame con tipo definido, que incluye: el nodo, la dirección, el ID CAN, la longitud de los datos, los bytes hexadecimales sin procesar y una decodificación ASCII (con el mejor resultado posible). Cada panel de la interfaz de usuario (la vista del registro, el inspector de nodos, el gráfico) lee esta única estructura de datos.

Un gráfico que olvida quién dejó de hablar.

CanGraph ejecuta una simulación de fuerza D3 en tiempo real, utilizando funciones como forceLink, forceManyBody, forceCenter y forceCollide, sobre los nodos y aristas que se han descubierto hasta el momento. Esto permite que la topología adopte un diseño realista en lugar de una cuadrícula fija. Las conexiones solo existen entre nodos híbridos que realmente han intercambiado un marco CAN_PEER, no simplemente entre cualquier par de nodos que estén conectados.

Design detail

An edge is pruned three seconds after its last CAN_PEER frame. The graph shows who is talking right now, not a history of who ever talked — stop a conversation and the line between those two nodes disappears within seconds.

Chatea, pero cada mensaje es tráfico de datos CAN.

El modo HÍBRIDO también sirve como una demostración de lo que el autobús puede transportar realmente. Seleccione dos nodos híbridos en la barra lateral y se abrirá una ventana de chat; el texto ingresado se envía a la función sendStringOverCAN() en el nodo emisor, que lo divide en paquetes de 8 bytes con el ID CAN 0x321, que es el límite estándar del tamaño del marco, y el firmware HÍBRIDO del otro extremo vuelve a ensamblarlo en un mensaje. Es una pequeña prueba, pero real: los mismos 8 bytes por trama que pueden transportar un pulso o una respuesta OBD-II también pueden transportar una oración.

Seleccione dos nodos híbridos y la herramienta de diagnóstico se convierte en un walkie-talkie; el autobús nunca notó la diferencia.

El mismo equipo puede leer un motor real.

Al cambiar un nodo al modo OBD, el mismo protocolo de comunicación transmite información completamente diferente: obd.ino decodifica los códigos estándar OBD-II que se encuentran en el bus — RPM, velocidad del vehículo, carga del motor, posición del acelerador, temperatura del refrigerante y del aire de admisión, nivel de combustible, ajuste de combustible a corto y largo plazo, voltaje del módulo de control, tiempo de funcionamiento desde el inicio, distancia recorrida desde que se borraron los códigos — e interpreta estos datos en las mismas líneas CAN que el navegador ya sabe cómo analizar. Para agregar una fuente de diagnóstico real, fue necesario escribir un nuevo firmware, sin modificar la interfaz de usuario.

¿Qué está áspero?

Esto comenzó como una tarea para realizar en casa (para IGT), no como un producto comercializado, y eso se nota en algunos aspectos. La API de Web Serial es exclusiva de Chromium: no funciona con Firefox ni Safari, por lo que solo se ejecuta donde existe esa API. Cada nodo, borde y fotograma almacenado reside en el estado de React, sin ninguna capa de persistencia: al actualizar la pestaña, la topología desaparece y se vuelve a construir a partir de los datos que los nodos conectados proporcionen. Además, cada puerto guarda únicamente las 100 líneas de registro más recientes y los marcos CAN, por diseño; esto es un instrumento en tiempo real, no un grabador de datos.

No se trata de un producto, sino de un instrumento funcional para un autobús que nunca fue construido y que solo existió para ser observado.
Puede mostrar una captura de pantalla del panel de control.