Vor ein paar Wochen haben wir : wir haben einen Raum geschaffen, der mit intelligenten Geräten gefüllt war, und eine YouTube-Übertragung von dort gestartet. Die Spieler konnten die IoT-Geräte über die Website des Spiels steuern; das Ziel war, eine in dem Raum versteckte Waffe (ein leistungsstarker Laserpointer) zu finden, sie zu hacken und einen Kurzschluss im Raum auszulösen.
Um die Spannung zu erhöhen, haben wir einen Shredder in den Raum gestellt, in den wir 200.000 Rubel geladen haben: der Shredder zerstörte eine Banknote pro Stunde. Wer das Spiel gewann, konnte den Shredder stoppen und das restliche Geld mit nach Hause nehmen.
Wir haben bereits darüber gesprochen , sowie des Projekts erstellt wurde. Es ist an der Zeit, über die Hardware und ihren Aufbau zu berichten.

Es gab viele Anfragen, den Moment der Raumräumung zu zeigen – hier zeigen wir, wie wir ihn abbauen.
Architektur der Hardware: Steuerung des Raums
Wir haben mit der Planung der Hardwarelösung begonnen, als das Szenario bereits ungefähr klar war, das Backend bereit war und wir einen leeren Raum hatten, der für die Installation der Geräte bereit war.
In Anlehnung an den alten Witz „Das S in IoT steht für Sicherheit“ haben wir beschlossen, dass die Teilnehmer diesmal nur mit dem Frontend und Backend der Website interagieren und keinen direkten Zugriff auf die Hardware haben.
Dies wurde aus Sicherheits- und visuellen Gründen entschieden: Bei direktem Zugriff der Teilnehmer auf die Hardware wäre es deutlich schwieriger gewesen, sichere von potenziell gefährlichen Aktionen zu isolieren, wie beispielsweise das beschleunigte Scrollen des Shredders oder die Steuerung von Pyrotechnik.
Vor Beginn der Planung entwickelten wir mehrere Grundsätze für die Steuerung der Spielgeräte, die die Grundlage der Konstruktion bildeten:
Keine drahtlosen Lösungen verwenden
Der gesamte Spielbereich befindet sich in einem einzigen Rahmen, zu dem jede Ecke erreichbar ist. Es gab keinen realen Bedarf für drahtlose Verbindungen, und sie hätten einfach einen weiteren Ausfallpunkt dargestellt.
Keine speziellen Geräte aus dem Smart-Home-Bereich verwenden
In erster Linie wegen der Flexibilität bei der Anpassung. Es ist klar, dass man viele kommerzielle Versionen von Smart-Home-Systemen mit einer fertigen Admin-Oberfläche und Steuerung auf unsere Anforderungen anpassen kann, aber der Aufwand wäre vergleichbar mit der Entwicklung einer eigenen einfachen Lösung.
Außerdem mussten Geräte erfunden werden, an denen klar sichtbar ist, dass die Spieler ihren Status ändern: ein- und ausschalten oder bestimmte Lichter bei den Buchstaben СОКОЛ setzen.
Wir haben alle Komponenten aus allgemein verfügbaren Bauteilen zusammengestellt, die man in normalen Elektronikgeschäften kaufen kann: zwischen der Lieferung von Pizza und Diät-Cola kamen ständig Lieferanten von Chip und Dip und Leroy;
Die Entscheidung, alles selbst zusammenzustellen, erleichterte die Fehlersuche und Skalierbarkeit, erforderte jedoch mehr Sorgfalt bei der Montage.
Alle Relais und Arduino sollten im Bild nicht sichtbar sein.
Wir haben beschlossen, alle steuerbaren Elemente an einem Ort zusammenzufassen und außerhalb des Bildes zu verstecken, um die Funktionalität zu überwachen und im Bedarfsfall unauffällig außerhalb der Sichtkamera zu kriechen und das defekte Modul zu ersetzen.

Am Ende haben wir alles unter dem Tisch versteckt, und die Kamera wurde so installiert, dass nichts unter dem Tisch sichtbar war. Das war unsere "tote Zone" für das Kriechen des Ingenieurs.
So haben wir letztendlich ein einziges intelligentes Gerät geschaffen: Es erhielt vom Backend den Status jedes Teils und änderte ihn mit dem entsprechenden Befehl.
Was die hardwaretechnische Umsetzung betrifft, steuerte dieses Gerät 6 Elemente:
- Mehrere Tischlampen, die den Zustand Ein/Aus haben und von den Spielern gesteuert werden.
- Die Buchstaben an der Wand, die ihre Farbe auf Befehl der Spieler ändern können.
- Ventilatoren, die sich drehen und das Flipchart bei Serverlast öffnen.
- Ein Laser, der über PWM gesteuert wird.
- Ein Schredder, der nach Zeitplan Geld frisst.
- Eine Nebelmaschine, die vor jedem Schuss des Lasers aktiviert wird.

Wir testen die Nebelmaschine zusammen mit dem Laser.
Später kam noch Bühnenlicht hinzu, das hinter den Kulissen stand und genauso gesteuert wurde wie die Lampen aus Punkt 1. Das Bühnenlicht wurde in zwei Fällen aktiviert: Es beleuchtete den Laser, wenn er mit Strom versorgt wurde, und beleuchtete das Gewicht, bevor der Laser im Gefechtsmodus gestartet wurde.
Was genau dieses intelligente Gerät ausmachte.

Über den gesamten Zeitraum hinweg hat Jura, unser Hardware-Experte, sich bemüht, es nicht komplizierter zu machen und die einfachste, minimalistische Lösung zu finden.
Geplant war, dass auf dem VPS einfach ein Skript läuft, das JSON-Daten über den Status der Geräte erhält und diese an ein per USB angeschlossenes Arduino sendet.
An die Ports wurden angeschlossen:
- 16 normale Relais (Sie waren es, die das Klickgeräusch erzeugten, das im Video zu hören war. Hauptsächlich haben wir sie wegen dieses Geräuschs ausgewählt.)
- 4 Solid-State-Relais zur Steuerung der Kanäle mit PWM, z. B. für Ventilatoren,
- ein separater PWM-Ausgang für den Laser
- ein Ausgang, der das Signal für den LED-Streifen bildet.
Hier ist ein Beispiel für einen JSON-Befehl, der vom Server an das Relais gesendet wurde.
{"power":false,"speed":0,"period":null,"deviceIdentifier":"FAN"}Und hier ist ein Beispiel für die Funktion, mit der der Befehl an das Arduino gelangte.
def callback(ch, method, properties, body):
request = json.loads(body.decode("utf-8"))
print(request, end="n")
send_to_serial(body)Um den Moment festzuhalten, in dem der Laser schließlich das Seil durchtrennte und das Gewicht auf das Aquarium fiel, haben wir einen kleinen Knopf gemacht, der beim Fallen des Gewichts aktiviert wurde und ein Signal an das System sendete.

Knopf zur Überwachung der Gewichtsbewegung
In diesem Signal sollten Rauchbomben aus Tischtennisbällen entzündet werden. Wir haben vier Rauchbomben direkt in das Gehäuse des Servers eingebaut und eine Nichromdrahtleitung angeschlossen, die sich erhitzen und als Zünder fungieren sollte.

Gehäuse mit Rauchbomben und chinesischer Girlande

Arduino
Auf dem Arduino sollten ursprünglich zwei Aktionen stattfinden.
Die erste — bei Eingang einer neuen Anfrage wurde die Anfrage mithilfe der Bibliothek ArduinoJson geparst. Dann wurden jedem steuerbaren Gerät zwei seiner Eigenschaften zugeordnet:
- Stromstatus „ein“ oder „aus“ (Standardzustand)
- Zeitspanne, in der das Gerät eingeschaltet ist — Zeit in Mikrosekunden vom Start des Boards, wann es Zeit wäre, es auszuschalten, also den Zustand auf den Standard zurückzusetzen.
Der letzte Wert wurde bei Eingang des entsprechenden Parameters im JSON gesetzt, konnte jedoch auch weggelassen werden; in diesem Fall wurde der Wert auf 0 gesetzt und es fand keine Rücksetzung statt.
Die zweite Maßnahme, die die Arduino in jedem Zyklus durchführte, war die Aktualisierung der Zustände, das heißt, die Überprüfung, ob es notwendig ist, etwas einzuschalten oder ob es an der Zeit ist, ein Gerät auszuschalten.
Der Laserpointer – das ist der Megatron 3000.

Es handelt sich um ein gewöhnliches Laser-Modul zum Schneiden und Markieren, LSMVR450-3000MF, 3000mW, 450nm mit manueller Fokussierung.
Die Buchstaben von Sokol.
Sie sind ganz einfach gemacht – wir haben die Buchstaben einfach vom Logo kopiert, sie aus Pappe ausgeschnitten und dann mit LED-Streifen beklebt. Dabei mussten wir die Streifen miteinander verlöten, jeweils 4 Kontakte an jeder Naht, aber das Ergebnis war es wert. Unser Backend-Entwickler Pasha zeigte Wunder der Geschicklichkeit und erledigte das in weniger als ein paar Stunden.

Die ersten Tests des IoT-Geräts und Feinarbeiten.
Wir haben die ersten Tests durchgeführt und gleichzeitig kamen neue Aufgaben auf uns zu. Denn während des Prozesses trat ein echter Filmproduzent und Kameramann von WGIKa, Ilya Serov, dem Team bei – er stellte den Rahmen ein, fügte zusätzliches Filmlicht hinzu und änderte ein wenig das Skript des Spiels, damit die Handlung emotionaler und die Bilder dramatischer und theatralischer werden.
Das hat die Qualität erheblich verbessert, aber es traten auch Elemente auf, die an das Relais angeschlossen und ein Arbeitsalgorithmus geschrieben werden mussten.
Ein weiteres Problem war der Laser: Wir haben mehrere Experimente mit verschiedenen Seiltypen und Lasern unterschiedlicher Leistung durchgeführt. Für den Test hängten wir einfach ein Gewicht vertikal an das Seil.
Beim Start mit einem Testtoken lag die über PWM geregelte Leistung unter 10 % und beschädigte das Seil selbst bei längerer Exposition nicht.
Im Kampfmodus wurde der Laser auf etwa einen Durchmesser von 10 mm fokussiert und durchbrannte das Seil mit dem Gewicht auf etwa einem Meter Abstand.

So funktionierte der Laser bei den Tests hervorragend.
Als wir dann in dem Raum mit der hängenden Hantel alles testeten, stellte sich heraus, dass es nicht so einfach war, den Laser sicher zu befestigen. Zudem, wenn das Seil brennt, schmilzt es, dehnt sich aus und verschiebt sich aus dem ursprünglichen Fokus.

So funktionierte er nicht mehr: Das Seil verschob sich.
Ilja hat den Laser an das gegenüberliegende Ende des Raumes versetzt, sodass der Laserstrahl die gesamte Szene durchquerte und im Bild schön aussah, wodurch der Abstand sich verdoppelte.
Nach weiteren Experimenten mit dem Verbrennen des Seils im Kampf haben wir beschlossen, unser Glück nicht herauszufordern und das Durchtrennen des Seils mit Hilfe von Nichromdraht abzusichern. Dieser zerstörte die Schnur nach 120 Sekunden, nachdem der Laser im Kampfbetrieb eingeschaltet wurde. Dies sowie das Trennen des Drahts und die Zündung der Rauchbomben beim Auslösen des Trennkontakts haben wir direkt in den Code des Mikrocontrollers festgelegt.

Die Schnur, die letztendlich im Hintergrund das Seil durchbrannte
So entstand die dritte Aufgabe, die die Arduinobasis zu lösen hatte – die Abfolge der Ausführung dieser Befehle zu bearbeiten.
Wir haben auch beschlossen, dass die Arduino die Notwendigkeit übernimmt, die Geldbeträge auf dem Fernseher anzuzeigen und den Schredder zu starten. Ursprünglich war geplant, dass das Backend dies übernimmt und der aktuelle Kontostand auf der Website sichtbar ist, während wir auf dem Fernseher Kommentare von YouTube als zusätzliches interaktives Element anzeigen, um den Zuschauern zu zeigen, dass die Ereignisse im Raum in Echtzeit stattfinden.
Bei der Testdurchlauf hat Ilja die Szene gesehen und vorgeschlagen, auf dem größten Bildschirm den Spielstand anzuzeigen: wie viel Geld noch übrig ist, wie viel gegessen wurde und den Countdown bis zum nächsten Start des Schredders.
Wir haben das Arduino mit der aktuellen Uhrzeit verknüpft: jede volle Stunde wurde der Schredder gestartet. Das Bild auf dem Fernseher wurde mithilfe eines Raspberry Pi ausgegeben, der bereits Serveranfragen empfing und sie zur Ausführung an das Arduino weiterleitete. Die Bilder mit den Geldbeträgen wurden mit einem Aufruf des Konsolenwerkzeugs fim in etwa so erstellt:
image = subprocess.Popen(["fim", "-q", "-r", "1920×1080", fim_str]), wobei fim_str
und basierte auf dem erforderlichen Betrag oder der Zeit.
Wir haben die Bilder im Voraus generiert: einfach ein fertiges Video mit einem Timer genommen und 200 Bilder exportiert.
So wurde die Mechanik im Kreuz programmiert. Als der endgültige Countdown begann, waren wir alle auf dem Gelände, mit Feuerlöschern bewaffnet, und warteten gespannt auf das Feuer (das nur im Discord loderte).
Wie man einen Livestream für eine Woche einrichtet: Kamerawahl.
Für das Abenteuer benötigten wir einen durchgehenden Livestream auf YouTube für 7 Tage - das war die maximale Spieldauer, die wir eingeplant hatten. Es gab zwei Dinge, die uns behindern könnten:
- Überhitzung der Kamera durch Dauerbetrieb.
- Internetunterbrechung.
Die Kamera musste ein Bild mindestens in Full HD liefern, damit das Spiel und die Beobachtung des Raumes angenehm waren.
Ursprünglich hatten wir nach Webcams Ausschau gehalten, die für Streamer angeboten werden. Wir wollten die Kosten senken und eine Kamera kaufen war nicht gewollt; die Vermietung war, wie sich herausstellte, nicht möglich. In diesem Moment fanden wir zufällig eine Xbox Kinect Kamera, die ich zuhause hatte, stellten sie im Raum auf und starteten einen Teststream für eine Woche.
Die Kamera funktionierte gut und überhitzte nicht, doch Ilya bemerkte sofort, dass es an Einstellungen mangelte, insbesondere konnte die Belichtung nicht angepasst werden.
Ilya strebte danach, die Übertragung an die Standards der Film- und Videoproduktion anzupassen: eine dynamisch wechselnde Lichtszene mit hellen Lichtquellen, einem dunklen Hintergrund und Objekten im Bild zu übertragen. Dabei wollte er die Detailgenauigkeit sowohl in hellen als auch in dunklen Bereichen bewahren, mit minimalem digitalem Rauschen.
Deshalb, auch wenn der Kinect sich bei den Tests als zuverlässig erwies und kein Capture-Card benötigt wurde (eine weitere Fehlermöglichkeit), haben wir entschieden, ihn abzulehnen. Nach drei Tagen Tests verschiedener Kameras wählte Ilya die Sony FDR-AX53 – einen kleinen, zuverlässigen Camcorder, günstig in der Miete, aber dennoch mit ausreichender Zuverlässigkeit und Bildqualität.
Wir haben die Kamera gemietet, sie eine Woche lang in Verbindung mit einer Capture-Card eingeschaltet und verstanden, dass wir mit ihr auf eine durchgehende Übertragung während des gesamten Quests zählen können.
Wir machen Film: Aufbau von Szenen und Licht.
Die Beleuchtung erforderte ein gewisses Maß an Eleganz; wir mussten mit minimalen Mitteln eine Lichtpartitur schaffen:
1. Hervorhebung von Objekten, wenn die Spieler sie finden (Laser, Hantel), sowie konstante Beleuchtung auf dem Schneider. Hierbei kamen dedolight 150 zum Einsatz – zuverlässige und kompakte Filmlichter mit Niederspannungshalogenlampen, die es ermöglichen, einen Lichtstrahl auf ein bestimmtes Objekt zu fokussieren, ohne den Hintergrund und andere Objekte zu beeinträchtigen.
2. Praktisches Spiellicht – Tischlampe, Stehlampe, Stern, Lichterkette. Das gesamte praktische Licht war harmonisch im Bild verteilt, um den jeweiligen Bildbereich auszuleuchten; es wurden LED-Lampen mit einer Farbtemperatur von 3200 K verwendet, und die Lampe in der Stehlampe war mit einem roten Folienfilter von Rosco abgedeckt, um einen ungewöhnlichen Farbakzent zu setzen.

Ich bin der Ingenieur bei Mama oder starte morgen
Wie wir Internet und Strom reserviert haben
Wir sind der Frage der Ausfallsicherheit fast wie in einem Rechenzentrum begegnet: Wir entschieden uns, von den grundlegenden Prinzipien nicht abzurücken und haben nach dem gewohnten N+1-Schema reserviert.
Wenn die Übertragung auf YouTube abbricht, bedeutet das, dass eine erneute Verbindung über denselben Link und das Fortsetzen des Streams nicht mehr möglich ist. Dies war ein kritischer Moment, zudem befand sich der Raum in einem normalen Büro.
Dafür haben wir einen Router auf Basis von OpenWRT und das Paket mwan3 verwendet. Er testete automatisch alle 5 Sekunden die Verfügbarkeit des Kanals und wechselte im Falle eines Verlusts auf das Backup-Modem von Yota. Das Umschalten auf den Backup-Kanal erfolgte in weniger als einer Minute.

Ebenso wichtig war es, Stromausfälle auszuschließen, denn bereits ein kurzzeitiger Spannungsstoß würde einen Neustart aller Computer zur Folge haben.
Daher haben wir eine unterbrechungsfreie Stromversorgung, den Ippon Innova G2 3000, gewählt, der alle Spielegeräte absichert: Die Gesamtstromaufnahme unseres Systems lag bei etwa 300 Watt. Damit wären wir für 75 Minuten versorgt, was für unsere Zwecke völlig ausreichend ist.
Wir haben beschlossen, auf zusätzliches Licht zu verzichten, falls der Strom im Raum ausfällt — es wurde nicht an die USV angeschlossen.
Danksagungen
- Dem gesamten Team , das das Spiel entworfen und umgesetzt hat.
- Ein besonderer Dank an die RUVDS-Admins, die dafür gesorgt haben, dass die Server stabil liefen, die Last akzeptabel war und alles reibungslos funktionierte.
- An den besten Chef für die Antwort auf den Anruf: „Ich habe eine Idee: Wir nehmen einen Server, setzen ein Aquarium darauf und hängen ein Gewicht darüber. Platsch, alles wird nass, Kurzschluss, Feuer!“ Er sagt immer souverän: „Macht es!“
- Danke und speziell an Michail Karpov, dafür, dass er nicht nur nachgegeben hat und die Nutzungsbedingungen gebrochen hat, sondern uns sogar ein Jahr lang ein Business-Konto geschenkt hat, als wir ihm von unserem Projekt erzählten.
- Ilja Serov für seinen Beitritt als Co-Produzent des Projekts, der bereit war, bis Mitternacht zu krabbeln, LED-Streifen zu kleben, technische Lösungen zu finden und alles zu tun, damit wir eine echte Filmproduktion hinbekommen.
- für die Unterstützung in kritischen Situationen, während andere nur die Schultern zuckten, der beste Borschtsch, moralische Unterstützung und nächtliche Gespräche.
- für die Verbindung zu dem besten Penetrationstester des Landes, der uns beraten und bei unseren Aufgaben geholfen hat.
- für die großartige Videoproduktion aller Clips.
- für die feste Hand und die Bereitschaft, bis zum Schluss zu arbeiten.
- Nun für fast immer warme Pizza.
Und der größte Dank gebührt den Spielern für all die Emotionen, die wir erlebt haben, während ihr zwei Tage lang den Quest ohne Schlaf und sogar mit aufgeschobenen Arbeiten gestürmt habt.
Weitere Artikel über den Server-Zerstörung-Quest
Quelle: habr.com
