Empecemos con el hierro.

Una vez trabajé en una fábrica, donde esculpieron todo tipo de productos electrónicos, no muy complicados, y a veces caían bajo la definición de "Internet de las cosas". En su mayor parte, todo tipo de sensores para sistemas de seguridad: humo, ruido, penetración, fuego y más. La gama de productos era amplia, los lotes a veces tenían menos de 500 piezas, y casi todos los productos tenían que hacerse un accesorio de prueba separado; de hecho, solo una caja de lata en la que el producto se sometió a pruebas, se presionó con una tapa y, desde abajo, las agujas de contacto se presionaron a los puntos de contacto en una placa de circuito impreso, algo como esto:
Por lo tanto, fue posible comunicarse físicamente con el dispositivo. El protocolo de comunicación que teníamos era bastante común en la industria: RS232 (puerto COM, un tipo de UART). También se colocaron en la caja todo tipo de dispositivos controlados simples para probar el producto final. Todos estos instrumentos auxiliares se controlaron de la misma manera. Toda la estructura era muy endeble, y todo tipo de problemas formaban parte de la rutina diaria.
La gama de problemas era muy amplia: contactos deficientes, inversión de la polaridad durante la instalación, problemas con el producto probado, con dispositivos de control y medición, con agujas de contacto, con el código de prueba ... ¡pero nunca se sabe! Pero era necesario realizar pruebas constantemente, y si las pruebas comenzaban a "entrar" en alguna parte, uno de los ingenieros tenía que pisar la línea y comenzar a verificar todo manualmente.
En primer lugar, se lanzó Docklight, una buena utilidad para "comunicarse" a través de los puertos COM, pero tenía muchas limitaciones. Y aquí nos estamos acercando a la esencia del asunto.
¿Por qué no me quedaba Docklight?
Pues vamos.
- El primer problema es que Docklight solo se ejecuta en Windows. Por lo tanto, la instalación del "centro nervioso" en forma de RaspberryPi, que conectaría todos los dispositivos, o algo así, podría olvidarse. Tuve que instalar NUC, la solución más barata en esta situación. Pesado, bastante grande, y no el más barato. Por cierto, cuando estos accesorios de prueba fueron arrastrados de un lugar a otro, los NUC lucharon mucho, mucho (aunque admito que su diseño es bastante sólido).
- El segundo, el acceso remoto solo podía llevarse a cabo a través del uso compartido de escritorio, se ralentizó incluso a través de la red local, e incluso a través de Internet fue completamente lamentable.
- En tercer lugar, cada dispositivo tenía su propio conjunto de comandos, y Docklight podía cargar un archivo con una lista de comandos. Si, por ejemplo, tiene que compartir una lista similar con alguien del departamento, envíe un correo electrónico con el archivo o ... ¡envíe un enlace al archivo en la carpeta compartida! Naturalmente, cada instalación de Docklight requería dichos archivos localmente, y todo esto tenía que hacerse docenas (si no cientos de veces) manualmente, por cada NUC, cada ingeniero arrastraba sus listas de comandos favoritas y convenientes. Y en el patio 2019, déjame recordarte ...
- Cuarto, Docklight no le permite asociar automáticamente un puerto COM con un nombre de dispositivo: por ejemplo, Windows, cuando conecta la fuente de alimentación, se comunicará con el dispositivo a través de COM12. Si desea "tirar de las cadenas" manualmente, en Docklight debe abrir COM12. ¿Cómo podemos descubrir que esto se trata solo de la fuente de alimentación y no, por ejemplo, de SwitchBoard? Bueno, siempre puede buscar en el administrador de dispositivos e intentar no olvidar qué dispositivo está conectado a qué puerto. Al mismo tiempo, nadie garantiza que si simplemente retira el dispositivo y luego lo vuelve a enchufar, el puerto anterior permanecerá con este dispositivo. En resumen, cada vez que tienes que hacerlo manualmente. Y créeme, al final del día mi cabeza daba vueltas por esto.
- Quinto, cada puerto necesitaba una copia separada del programa y, por supuesto, todas las operaciones tenían que hacerse individualmente para cada dispositivo, y aunque Docklight admite secuencias de comandos, no hay interacción entre las instancias individuales.
Siguiente No se proporcionó integración con ningún otro producto. Parece ser un poco insignificante, pero aquí hay una situación en la que llegó al calor blanco: la prueba cayó, y tenemos que averiguar por qué. En primer lugar, debe conectarse a los dispositivos y ver si están muertos. Vamos al administrador de dispositivos, observamos en qué puerto se encuentra nuestro dispositivo, abrimos Docklight, iniciamos la comunicación con nuestro puerto ... Error. ¡Maldita sea! Olvidé detener el servicio que está instalado en el NUC y mantiene todos los puertos. Exclusivo, ya sabes. Bien, ralentizamos el servicio, abrimos el puerto, cargamos el archivo con los comandos del dispositivo, enviamos los comandos, obtenemos (o no obtenemos) las respuestas, resolvemos el problema. Ejecutamos la prueba nuevamente, se bloquea nuevamente ... Oh, maldición, olvidé cerrar Docklight y reiniciar el servicio. Todo parece ser sin errores. Pero esto es por las próximas dos horas, hasta que algo vuelva a salir mal. Y créanme, era necesario resolver tales problemas más a menudo de lo que quisiéramos.
Bueno, y por supuesto, sobre cualquier extensión, agregue. no podría haber ninguna característica o similar: el producto está cerrado, escrito durante mucho tiempo (parece que ya no están especialmente desarrollados), no hay personalización.
Bueno, decidí hacer algo mío, pero corrigiendo (o mejorando) la situación con los problemas descritos.
Resultó algo así como Zabbix, pero con agudización para una situación específica.
Entonces, ¿cuál es la diferencia?
Quizás tenga sentido comenzar con una descripción general de la arquitectura y luego entrar en detalles.
El esquema se ve así:

Tenemos un agente que se ejecuta en la estación a la que están conectados físicamente nuestros dispositivos. El agente se escribió en Python, por lo que funciona sin problemas en Windows, Linux, y puede finalizarlo de manera segura para usarlo en RaspberryPi y dispositivos similares. El programa es extremadamente poco exigente con los recursos y muy estable. El agente se conecta constantemente a través de Websocket al servidor (back end) y recibe todas las configuraciones de puerto y sus parámetros desde allí, tanto durante la inicialización como durante las actualizaciones. El Agente tiene su propia GUI para la configuración y la supervisión, en cuyo caso (tal vez se perdió la conexión, tal vez la licencia ha caducado).

Siguiente El servidor (también conocido como back-end) surge del docker (y, por lo tanto, simplemente se ejecuta no solo en Amazon o Google Cloud, sino también en cualquier máquina no tan potente en una LAN con Linux a bordo). Está escrito en Django junto con Redis (para admitir websockets). Almacena todas las configuraciones y proporciona comunicación entre la GUI del usuario (solo una página escrita en ReactJS) y a través del Agente, con nuestros dispositivos. Comunicación bidireccional, totalmente asíncrona. Todos los ajustes se almacenan en Postgres y Mongo.
Bueno, y, tal vez, la parte más importante del sistema es el propio cliente (simplemente, una página en un navegador, escrita para ReactJS para un mayor dinamismo).

Sí, el diseño visual está lejos de ser perfecto, pero esto se puede arreglar.
Bueno, esto se puede redondear, agregaré solo unas pocas palabras sobre el estado del proyecto y la demostración.
- Este es un alfa bastante temprano, diseñado para demostrar con mayor probabilidad las comodidades potenciales y verificar el nivel de interés.
- Juega una demo - aquí
Para iniciar sesión
nombre de usuario: operador_0
contraseña: 123456789
Seleccionamos QA_Test y cualquier estación (esto es solo un intento de simular la estructura de la empresa: los puertos están conectados a las estaciones, se dividen en departamentos y cada oficina tiene su propia estructura)
En principio, si hay interés, agregaré soporte para https, y construiré los ensamblados del Agente para diferentes plataformas, así como también agregaré todas las demás características.
Estaré encantado de cualquier comentario y sugerencia. ¡La crítica es bienvenida!