Hardware del proyecto: cómo construimos una habitación con una misión de hacker



Hace un par de semanas, realizamos una búsqueda en línea de piratas informáticos : construimos una sala que estaba llena de dispositivos inteligentes y lanzamos una transmisión de YouTube desde ella. Los jugadores podían controlar los dispositivos de IoT desde el sitio del juego; el objetivo era encontrar el arma escondida en la habitación (un poderoso puntero láser), piratearla y provocar un cortocircuito en la habitación.



Para agregar una trama emocionante, colocamos una trituradora en la habitación, en la que cargamos 200,000 rublos: la trituradora se comía un billete por hora. Después de ganar el juego, fue posible detener la trituradora y tomar todo el dinero restante.



Ya hemos descrito el paso del juego , así como cómo se hizo el backend del proyecto. Es hora de contarte sobre el hardware y cómo iba.





Hubo muchas solicitudes para mostrar el momento de limpiar la habitación; mostramos cómo la desmontamos



Arquitectura de hierro: control de la habitación



Comenzamos a diseñar la solución de hardware cuando el escenario ya estaba aproximadamente despejado, el backend estaba listo y teníamos una habitación vacía lista para la instalación del equipo.



Recordando el viejo chiste "La S en IoT significa Seguridad" ("La letra S en la abreviatura IoT significa Seguridad"), decidimos que esta vez los jugadores en el escenario del juego interactúan solo con el front-end y el back-end del sitio, pero no tienen la oportunidad de acceder directamente a la glándula.



Esto se hizo por razones de seguridad y entretenimiento de lo que sucede en la pantalla: con el acceso directo de los jugadores al hardware, sería mucho más difícil aislar acciones seguras y potencialmente peligrosas, por ejemplo, acelerar la trituradora o controlar la pirotecnia.



Antes de comenzar el diseño, formulamos varios principios para controlar los dispositivos de juego, que se convirtieron en la base del diseño:



No use soluciones inalámbricas



Todo el espacio de juego está en un marco, cada rincón al que puede llegar. No había una necesidad real de conexiones inalámbricas y simplemente se convertirían en otro punto de falla.



No utilice ningún dispositivo especial de la casa inteligente.



Principalmente por el bien de la flexibilidad de personalización. Está claro que es posible personalizar muchas versiones en caja de sistemas domésticos inteligentes con un panel de administración y una gestión listos para usar para nuestra tarea, pero los costos laborales serían comparables a crear su propia solución simple.



Además, era necesario idear dispositivos que mostraran claramente qué exactamente cambiaban los jugadores de su estado: encendían / ​​apagaban o ponían una luz específica en las letras FALCON.



Recopilamos todos los elementos del hierro disponible públicamente, que se puede comprar en tiendas de repuestos de radio ordinarios: entre la entrega de pizza y cola dietética, los mensajeros Chip y Deep y Leroy acudían constantemente al sitio.



La elección de ensamblar todo por nosotros mismos simplificó la depuración y la escalabilidad, sin embargo, requirió más precisión durante la instalación.



Todos los relés y arudino no deben ser visibles en el marco.



Decidimos reunir todos los elementos controlables en un solo lugar y ocultarlos detrás de escena para poder monitorear el desempeño y, si es necesario, salir con cuidado del campo de visión de la cámara y reemplazar la unidad defectuosa.





Como resultado, todo se ocultó debajo de la mesa y la cámara se instaló de modo que no se pudiera ver nada debajo de la mesa. Este era nuestro "



punto ciego" para el ingeniero que se arrastraba. Desde el punto de vista del hardware, este dispositivo controlaba 6 elementos:



  1. Varias lámparas de mesa, tienen un estado encendido / apagado y son controladas por los jugadores
  2. Letras en la pared, pueden cambiar su color a las órdenes de los jugadores.
  3. Ventiladores que giran y abren el rotafolio cuando el servidor está bajo carga
  4. Láser controlado por PWM
  5. La trituradora que se comió el dinero en un horario
  6. Una máquina de humo que se activaba antes de cada disparo láser.




Probamos la máquina de humo junto con el láser.



Posteriormente, se agregó una luz de escenario, que se colocó detrás del marco y se controló exactamente como las lámparas del punto 1. La luz de escenario se activó en dos casos: iluminaba el láser cuando se le aplicaba energía e iluminaba el peso antes de que se lanzara el láser en combate. modo.



¿Qué era este dispositivo inteligente?







De hecho, terminamos con un dispositivo inteligente: recibió el estado de cada una de sus partes del backend y lo cambió con el comando apropiado.



Se asumió que se ejecutará un script simple en la computadora que recibe json con el estado de los dispositivos y lo envía al arduinka conectado a través de usb. Más tarde, esta computadora fue reemplazada por rasberry, se conectó al backend debido a nat.



Conectado a puertos:



  • 16 relés convencionales (fueron los que hicieron el sonido de clic que se escuchó en el video. Los elegimos principalmente por este sonido)
  • 4 relés de estado sólido para controlar canales PWM como ventiladores,
  • salida PWM separada para láser
  • salida que forma una señal a la tira de LED


Aquí hay un ejemplo de un comando json que llegó al relé desde el servidor



{"power":false,"speed":0,"period":null,"deviceIdentifier":"FAN"}


Y este es un ejemplo de la función con la que llegó el equipo a Arudino




def callback(ch, method, properties, body):    
    request = json.loads(body.decode("utf-8"))    
    print(request, end="\n")     
    send_to_serial(body)


Para rastrear el momento en que el láser finalmente quema la cuerda y el peso volará hacia el acuario, hicimos un pequeño botón que activó la caída del peso y dio una señal al sistema.





Monitoreo de botones del movimiento de pesas rusas



A esta señal, las bombas de humo hechas con pelotas de ping-pong deberían haberse encendido. Pusimos 4 conductos de humo directamente en la caja del servidor y les llevamos un hilo de nicrom, que se suponía que se calentaría y funcionaría como un fusible.





Cuerpo con bombas de humo y guirnalda china.







Arduino



En el arduinka, según el plan original, se llevaron a cabo dos acciones.



Primero, cuando se recibió una nueva solicitud, la solicitud se analizó utilizando la biblioteca ArduinoJson. Además, varias de sus propiedades se asociaron con cada dispositivo controlado:



  • «» «» ( )
  • , ( JSON , , )
  • PWM ,
  • , . 587 . , , , . .


La última vez que se estableció cuando se recibió el parámetro correspondiente en JSON, pero no se pudo haber transmitido, luego el valor se estableció en 0 y no se realizó la puesta a cero.



La segunda acción que realizaba la arduinka en cada ciclo era la actualización de los estados, es decir, comprobar si era necesario encender algo o si era el momento de apagar un dispositivo.



Puntero láser: el mismo Megatron 3000







Este es un módulo láser convencional para cortar y marcar LSMVR450-3000MF 3000mW 450nm enfoque manual.



Letras de halcón



Hecho muy simple: simplemente copiamos las letras del logotipo, las recortamos de cartón y luego las pegamos con cinta LED. En este caso, fue necesario soldar trozos de cinta, 4 contactos en cada costura, pero el resultado valió la pena. Nuestro backend Pasha mostró milagros de habilidad, haciéndolo en menos de unas pocas horas.





Primeras pruebas del dispositivo iot y acabado



Hicimos las primeras pruebas y al mismo tiempo tuvimos nuevos problemas. El hecho es que en el medio del proceso, un productor de cine real y camarógrafo de VGIK, Ilya Serov, se unió al equipo: construyó el marco, agregó iluminación cinematográfica adicional y cambió ligeramente el guión del juego, para que la trama fuera más emotiva y la imagen más dramática y teatral.



Esto aumentó significativamente la calidad, pero había elementos que también debían estar conectados al relé y se prescribió el algoritmo de operación.



El láser resultó ser otro problema: hicimos varios experimentos con diferentes tipos de cuerdas y láseres de diferentes poderes. Para la prueba, simplemente colgamos la carga verticalmente de una cuerda.



Cuando se lanzó con una ficha de prueba, la potencia ajustable a través del PWM fue inferior al 10% y la cuerda no se dañó incluso después de una exposición prolongada.



Para el modo de combate, el láser se desenfocó a aproximadamente un punto con un diámetro de 10 mm, y quemó con confianza a través de la cuerda con una carga desde una distancia de aproximadamente un metro.





Entonces, el láser funcionó perfectamente en las pruebas.Cuando



comenzamos a probar todo en la habitación con un peso suspendido, resultó que no era tan fácil fijar el láser de forma segura. Luego, cuando la cuerda está en llamas, se derrite, se estira y se desplaza desde debajo del foco original.





Pero así es como ya no funcionaba: se desplazó la cuerda



Ilya movió el láser hasta el final de la habitación opuesto a la cuerda para que el rayo láser recorriera toda la escena y se viera hermosa en el encuadre, que duplicó la distancia.



Después de realizar algunos experimentos más con la cuerda en llamas ya en batalla, decidimos no torturar al destino y asegurar el corte de la cuerda con un alambre de nicromo. Ella destruyó el hilo 120 segundos después de encender el láser en modo combate. Esto, además de la desconexión del cable y el fusible de las bombas de humo cuando se activa el contacto de ruptura, decidimos codificarlo directamente en el hardware del microcontrolador.





El hilo, que finalmente quemó la cuerda fuera de la pantalla.



Así, apareció una tercera tarea que resolvió el arduinka: elaborar las secuencias asociadas con la ejecución de estos comandos.



También decidimos darle frambuesa, que solía enviar simplemente JSON ad-hoc recibido del backend, y la necesidad de realizar un seguimiento del dinero en el televisor y ejecutar la trituradora. Inicialmente, se asumió que el backend haría esto y el saldo actual sería visible en el sitio, y en la televisión mostraríamos los comentarios de YouTube como un elemento interactivo adicional que indicaría a los espectadores que los eventos en la sala estaban sucediendo en tiempo real.



Pero durante la prueba, Ilya observó la escena y sugirió mostrar el saldo del juego en la pantalla más grande: cuánto dinero quedaba, cuánto se comía y la cuenta regresiva hasta el próximo inicio de la trituradora.



Vinculamos Raspberry a la hora actual: cada hora completa se iniciaba la trituradora. La imagen se mostró en el televisor con la ayuda de la frambuesa, que en ese momento ya estaba recibiendo solicitudes del servidor y enviándolas para su ejecución a la arduinka. Se dibujaron imágenes con indicadores monetarios usando la llamada de utilidad de la consola fim como esta



image = subprocess.Popen(["fim", "-q", "-r", "1920×1080", fim_str]),  fim_str



y se formó en función de la cantidad o el tiempo requerido.



Generamos las imágenes por adelantado: solo tomamos el video terminado con un temporizador y exportamos 200 imágenes.



Esta es la mecánica que se programó en la misión. Cuando comenzó la cuenta regresiva final, todos condujimos hasta el lugar, nos armamos con extintores y nos sentamos a esperar el fuego (que ardía con fuerza y ​​principal solo en discordia).



Cómo hacer una transmisión que funcione durante una semana: elegir una cámara



Para la misión, necesitábamos una transmisión continua en YouTube durante 7 días; eso es lo que establecimos como la duración máxima del juego. Había dos cosas que podían obstaculizarnos:



  1. Sobrecalentamiento de la cámara por funcionamiento continuo
  2. Corte de internet


La cámara tenía que dar al menos una imagen Full HD para poder jugar y observar la habitación cómodamente.



Inicialmente, miramos en la dirección de las cámaras web que se lanzan para transmisores. Recortamos el presupuesto, así que no queríamos comprar una cámara, pero resultó que no estaban disponibles para alquilar. En el mismo momento, encontramos milagrosamente la cámara Xbox Kinect en mi casa, la pusimos en la habitación y comenzamos una transmisión de prueba durante una semana.



La cámara funcionó bien y no se sobrecalentó, pero Ilya notó casi de inmediato que carecía de ajustes, en particular, era imposible establecer la exposición.



Ilya buscó acercar el tipo de transmisión a los estándares de la producción de películas y videos: transmitir una escena de luz que cambia dinámicamente con fuentes de luz brillantes, un fondo oscuro y objetos en el encuadre. Al mismo tiempo, quería preservar la elaboración de la imagen tanto en luces como en sombras, con un mínimo de ruido digital.



Por lo tanto, aunque el kinect demostró ser confiable en las pruebas y no requirió una tarjeta de captura de video (otro punto de falla), decidimos abandonarlo. Después de tres días de probar diferentes cámaras, Ilya eligió la Sony FDR-AX53, una videocámara pequeña y confiable, asequible para alquilar, pero al mismo tiempo con suficiente confiabilidad y características visuales.



Alquilamos una cámara, la encendimos durante una semana junto con una tarjeta de captura de video y nos dimos cuenta de que con ella podíamos contar con una transmisión continua durante toda la búsqueda.



:



Trabajar en la iluminación requería cierta gracia, necesitábamos construir una partitura de luz con medios mínimos:



1. Iluminación de objetos cuando son encontrados por los jugadores (láser, peso), así como luz constante en la trituradora. Aquí utilizaron dedolight 150: dispositivos de iluminación de cine compactos y confiables con lámparas halógenas de bajo voltaje, que le permiten enfocar el haz de luz en un sujeto específico, sin tocar el fondo y otros objetos.



2. Luz de juego práctica: lámpara de mesa, lámpara de pie, estrella, guirnalda. Toda la luz práctica se distribuyó armoniosamente en el marco para iluminar su área de la imagen, en el interior había lámparas LED con una temperatura de color de 3200K, la lámpara de la lámpara de pie se cubrió con un filtro de folio Rosco rojo para crear un toque de color inusual.





Soy ingeniero con mi mamá o lanzo mañana



Cómo respaldamos Internet y la electricidad



La cuestión de la tolerancia a fallos se abordó casi como en un centro de datos: decidieron no desviarse de los principios básicos y se reservaron según el esquema habitual N + 1.



Si la transmisión en YouTube se detiene, significa que será imposible volver a conectarse usando el mismo enlace y continuar la transmisión. Fue un momento crítico y la habitación estaba en una oficina normal.



Para ello, utilizamos un enrutador basado en OpenWRT y el paquete mwan3. Probó automáticamente la disponibilidad del canal cada 5 segundos y, en caso de una interrupción, cambió al módem de respaldo de Yota. Como resultado, cambiar al canal de respaldo tomó menos de un minuto.



También era igualmente importante excluir los cortes de energía, porque incluso una subida de tensión a corto plazo provocaría el reinicio de todas las computadoras.



Por lo tanto, tomamos la fuente de alimentación ininterrumpida ippon innova g2 3000, que habría respaldado todos los dispositivos de juego: el consumo total de energía de nuestro sistema fue de alrededor de 300 vatios. Sería suficiente para 75 minutos, suficiente para nuestros propósitos.



Decidimos sacrificar la iluminación adicional en caso de que se cortara la electricidad en la habitación, ya que no estaba conectada al UPS.



Expresiones de gratitud



  • A todo el equipo de RUVDS , que inventó e implementó el juego.
  • Por separado para los administradores de RUVDS, para monitorear el trabajo de los servidores, la carga fue aceptable y todo funcionó normalmente en modo normal.
  • Al mejor jefe ntsaplinpor el hecho de que en respuesta a la llamada "hay una idea: tomaremos un servidor, le pondremos un acuario y colgaremos un peso encima, boom, bang, todo está inundado de agua, un cortocircuito, ¡un incendio!" siempre dice con confianza "¡hazlo!"
  • Tilda Publishing , - , .
  • S_ILya , , , , , .
  • zhovner , , , , .
  • samat , , .
  • daniemilk .
  • delfphe .
  • Dodo Pizza Engineering .


Y la mayor gratitud es para los jugadores por todas las emociones que experimentamos mientras ustedes irrumpieron en la búsqueda sin dormir durante dos días e incluso pospusieron el trabajo.



Otros artículos sobre la misión con la destrucción del servidor.








All Articles