Een paar weken geleden hielden we :Ze bouwden een kamer vol slimme apparaten en startten er een YouTube-uitzending mee. Spelers konden IoT-apparaten besturen via de website van het spel; Het doel was om een wapen te vinden dat in de kamer verborgen zat (een krachtige laserpointer), dit te hacken en kortsluiting in de kamer te veroorzaken.
Om het nog wat spannender te maken, plaatsten we een papierversnipperaar in de kamer en laadden deze met 200 roebel. De papierversnipperaar verwerkte één biljet per uur. Als je het spel won, kon je de papierversnipperaar stoppen en al het overgebleven geld meenemen.
Wij hebben het al verteld En project. Het is tijd om over de hardware te praten en hoe deze in elkaar is gezet.

Er waren veel verzoeken om het moment van het schoonmaken van de kamer te laten zien - we laten zien hoe we het afbreken
IJzeren architectuur: ruimtebeheer
We begonnen met het ontwerpen van de hardwareoplossing toen het scenario al globaal duidelijk was, de back-end klaar was en we een lege ruimte gereed hadden voor de installatie van de apparatuur.
Omdat we de oude mop "De S in IoT staat voor Security" in gedachten hielden, besloten we dat spelers dit keer in het spelscenario alleen met de frontend en backend van de site te maken krijgen, maar niet de mogelijkheid hebben om rechtstreeks bij de hardware te komen.
Dit werd gedaan om veiligheids- en entertainmentredenen: als spelers directe toegang tot de hardware zouden hebben, zou het veel lastiger zijn om veilige en potentieel gevaarlijke acties te isoleren, zoals het vooruitspoelen van een shredder of het besturen van pyrotechniek.
Voordat we met het ontwerp begonnen, formuleerden we een aantal principes voor de besturing van spelapparaten. Deze principes vormden de basis voor het ontwerp:
Gebruik geen draadloze oplossingen
De volledige speelruimte bevindt zich in één frame en elke hoek is bereikbaar. Er was geen echte behoefte aan draadloze verbindingen en ze zouden alleen maar een extra bron van falen vormen.
Gebruik geen speciale slimme apparaten voor thuisgebruik
Vooral vanwege de flexibiliteit wat betreft maatwerk. Het is duidelijk dat we veel standaardversies van smart home-systemen kunnen aanpassen met kant-en-klare beheer- en controlefuncties voor onze taken, maar de arbeidskosten zouden vergelijkbaar zijn met die van het zelf creëren van een eenvoudige oplossing.
Bovendien was het noodzakelijk om apparaten te bedenken die duidelijk zouden laten zien dat het de spelers waren die de status van het apparaat veranderden: door het apparaat aan/uit te zetten of door een specifiek lampje op de letters SOKOL te laten branden.
We hebben alle onderdelen samengesteld uit hardware die je in gewone elektronicawinkels kunt kopen: naast de pizza's en Diet Coke-bezorgingen kwamen er voortdurend koeriers van Chip & Deep en Leroy langs.
De keuze om alles zelf te assembleren vereenvoudigde het debuggen; schaalbaarheid vereiste echter meer zorgvuldigheid tijdens de installatie.
Alle relais en arudino mogen niet zichtbaar zijn in het frame
We besloten om alle aangestuurde elementen op één plek samen te brengen en ze achter de camera te verstoppen. Zo konden we de functionaliteit ervan in de gaten houden en, indien nodig, voorzichtig uit het zicht van de camera kruipen om een defecte unit te vervangen.

Uiteindelijk werd alles onder de tafel weggewerkt en werd de camera zo geïnstalleerd dat er niets van onder de tafel te zien was. Dit was onze ‘blinde vlek’ waar de ingenieur doorheen moest kruipen.
Uiteindelijk hielden we in principe één slim apparaat over: het ontving de status van elk onderdeel van de backend en paste deze aan met het juiste commando.
Vanuit hardware-oogpunt bestuurde dit apparaat zes elementen:
- Verschillende tafellampen, deze hebben een aan/uit-stand en worden door spelers aangestuurd
- Letters op de muur, ze kunnen van kleur veranderen op commando van de spelers
- Ventilatoren die draaien en de flipchart openen wanneer de server belast is
- Lasergestuurd via PWM
- De versnipperaar die op schema geld at
- Een rookmachine die afging vóór elk laserschot.

Rookmachine testen met laser
Later werd er een podiumlamp aan toegevoegd, die achter het frame stond en precies hetzelfde werd aangestuurd als de lampen uit punt 1. De podiumlamp werkte in twee gevallen: hij verlichtte de laser wanneer er stroom op werd gezet, en hij verlichtte het gewicht voordat de laser in de gevechtsmodus werd gelanceerd.
Wat was dit voor een slim apparaat?

Onze ijzerwarenman, Yura, deed zijn uiterste best om alles zo simpel en minimalistisch mogelijk te houden en met een oplossing te komen die zo simpel en minimalistisch mogelijk was.
Er werd aangenomen dat de VPS simpelweg een script zou draaien dat json met de status van de apparaten ontvangt en deze naar de Arduino stuurt die via USB is aangesloten.
De volgende poorten zijn aangesloten:
- 16 gewone relais (dat waren degenen die het klikkende geluid maakten dat je in de video hoorde. We hebben ze vooral gekozen vanwege dat geluid)
- 4 solid state relais voor het aansturen van PWM-kanalen, zoals ventilatoren,
- aparte PWM-uitgang voor laser
- uitgang die een signaal naar de LED-strip genereert
Hier is een voorbeeld van een json-opdracht die van de server naar de relay is verzonden
{"power":false,"speed":0,"period":null,"deviceIdentifier":"FAN"}En dit is een voorbeeld van de functie waarmee het team in Arudino terechtkwam
def callback(ch, method, properties, body):
request = json.loads(body.decode("utf-8"))
print(request, end="n")
send_to_serial(body)Om het moment te kunnen vastleggen waarop de laser uiteindelijk door het touw heen brandt en het gewicht in het aquarium vliegt, maakten we een kleine knop die de val van het gewicht activeert en een signaal naar het systeem stuurt.

Knop voor gewichtsbewegingsbewaking
Op dat signaal moesten rookbommen, gemaakt van pingpongballetjes, ontploffen. We plaatsten 4 rookbommen rechtstreeks in de serverbehuizing en sloten er een nichroomdraad op aan. Deze draad zou warm worden en als lont moeten fungeren.

Koffer met rookbommen en Chinese slinger

Arduino
Volgens het oorspronkelijke plan vonden er twee acties plaats op de Arduino.
Eerst werd een nieuw verzoek ontvangen en geparseerd met behulp van de ArduinoJson-bibliotheek. Vervolgens werden aan elk bestuurd apparaat twee eigenschappen toegewezen:
- stroomstatus "aan" of "uit" (standaardstatus)
- de periode waarin het apparaat is ingeschakeld - de tijd in microseconden vanaf het begin van het bord, wanneer het tijd is om het uit te schakelen, dat wil zeggen de staat naar de standaard te brengen
De laatste tijd werd ingesteld bij het ontvangen van de overeenkomstige parameter in JSON, maar deze kon worden weggelaten. In dat geval werd de waarde op 0 gezet en vond er geen nulstelling plaats.
De tweede actie die de Arduino tijdens elke cyclus uitvoerde, was het bijwerken van de statussen; dat wil zeggen, controleren of er iets aan moest worden gezet of dat het tijd was om een apparaat uit te zetten.
Laserpointer - dezelfde Megatron 3000

Dit is een normale LSMVR450-3000MF 3000mW 450nm handmatige focus laser snij- en markeermodule.
Brieven Falcon
Ze zijn heel eenvoudig gemaakt: we hebben gewoon de letters van het logo gekopieerd, ze uit karton gesneden en ze vervolgens met ledtape bedekt. Hiervoor moesten stukjes tape aan elkaar gesoldeerd worden, met 4 contacten op elke naad, maar het resultaat was de moeite waard. Onze back-endontwikkelaar Pasha toonde wonderen van vakmanschap door dit in minder dan een paar uur te realiseren.

Eerste tests van het IoT-apparaat en de laatste hand eraan
We hebben de eerste testen afgerond en tegelijkertijd hebben we nieuwe opdrachten gekregen. Het punt is dat halverwege het proces een echte filmproducent en cameraman van VGIK, Ilya Serov, zich bij het team voegde - hij bouwde het frame, voegde extra filmische belichting toe en veranderde het script van het spel lichtjes, zodat de plot emotioneler en de film dramatischer en theatraler zou zijn.
De kwaliteit ging hierdoor aanzienlijk omhoog, maar er kwamen ook elementen naar voren die op het relais moesten worden aangesloten en het werkingsalgoritme moest worden vastgelegd.
Een ander probleem was de laser: we hebben verschillende experimenten gedaan met verschillende soorten touw en lasers met verschillend vermogen. Voor de test hingen we de last eenvoudigweg verticaal aan een touw.
Bij gebruik van een testtoken bedroeg het via de PWM geregelde vermogen minder dan 10% en raakte het touw niet beschadigd, zelfs niet bij langdurige blootstelling.
Voor de gevechtsmodus werd de laser gedefocusseerd tot een punt met een diameter van ongeveer 10 mm, waarna de laser met zekerheid door het touw met de lading heen schoot vanaf een afstand van ongeveer een meter.

De laser werkte dus perfect tijdens de tests.
Toen we alles in de ruimte aan een hangend gewicht gingen testen, bleek het niet zo eenvoudig om de laser stevig te bevestigen. Want als het touw verbrandt, smelt het, rekt het uit en verplaatst het zich van zijn oorspronkelijke focus.

Maar zo werkte het niet meer: het touw verschoof
Ilya verplaatste de laser naar de andere kant van de kamer, tegenover het touw, zodat de laserstraal het hele tafereel bestreek en mooi in beeld kwam. Hierdoor werd de afstand verdubbeld.
Nadat we nog een paar experimenten hadden uitgevoerd met het doorbranden van het touw tijdens een gevecht, besloten we het lot niet te tarten en het doorsnijden van het touw te verzekeren met behulp van nichroomdraad. De draad werd 120 seconden nadat de laser in de gevechtsmodus werd ingeschakeld, vernietigd. We besloten dit, evenals het losraken van de draad en het ontsteken van rookbommen wanneer het verbreekcontact wordt geactiveerd, rechtstreeks in de hardware van de microcontroller te programmeren.

De draad die uiteindelijk door het touw heen brandde, ook buiten beeld
Zo ontstond er een derde taak die de Arduino oploste: het uitwerken van de volgordes die bij de uitvoering van deze opdrachten horen.
We besloten de Arduino ook de taak te geven om geld te tellen op de televisie en de papierversnipperaar aan te zetten. In eerste instantie werd aangenomen dat de backend dit zou afhandelen en dat het actuele saldo op de site zichtbaar zou zijn. Op de televisie zouden we als interactief extra element reacties van YouTube laten zien, zodat kijkers weten dat er in de ruimte in realtime gebeurtenissen plaatsvinden.
Maar tijdens de test zag Ilya het tafereel en stelde voor om de spelbalans op het grootste scherm te laten zien: hoeveel geld er nog over was, hoeveel er al was gegeten en een aftelling tot de volgende keer dat de papierversnipperaar aan de slag moest.
We koppelden de Arduino aan de huidige tijd: elk heel uur werd de papierversnipperaar aangezet. Het beeld werd met behulp van een Raspberry op de televisie weergegeven. De Raspberry ontving op dat moment al verzoeken van de server en stuurde deze door naar de Arduino om deze uit te voeren. Afbeeldingen met monetaire indicatoren werden getekend door het consolehulpprogramma fim te noemen, zoiets als dit
image = subprocess.Popen(["fim", "-q", "-r", "1920×1080", fim_str]), где fim_str
En het werd gevormd op basis van de vereiste hoeveelheid of tijd.
Wij genereerden de afbeeldingen vooraf: we maakten een kant-en-klare video met een timer en exporteerden 200 afbeeldingen.
Dit is het mechanisme dat in het kruis geprogrammeerd is. Tegen de tijd dat de laatste aftelling begon, reden we allemaal naar de locatie, bewapenden we onszelf met brandblussers en gingen we zitten om te wachten op de brand (die alleen op Discord op volle sterkte woedde).
Hoe maak je een uitzending die een week duurt: een camera kiezen
Voor de missie hadden we een doorlopende uitzending op YouTube nodig van 7 dagen. Dat is de maximale duur van het spel. Er waren twee dingen die ons hadden kunnen tegenhouden:
- Oververhitting van de camera door continu gebruik
- internetstoring
De camera moest minimaal een Full HD-beeld kunnen leveren om het spelen en kijken in de kamer comfortabel te maken.
In eerste instantie keken we naar webcams die gemaakt zijn voor streamers. Omdat we ons budget beperkten, wilden we geen camera kopen. En het bleek dat ze die niet verhuurden. Op datzelfde moment vonden we op wonderbaarlijke wijze een Xbox Kinect-camera in mijn huis. We plaatsten die in de kamer en startten een week lang een testuitzending.
De camera functioneerde prima en raakte niet oververhit, maar Ilja merkte vrijwel meteen dat er instellingen ontbraken. Met name de belichting kon niet worden ingesteld.
Ilja wilde de uitzendmethode dichter bij de normen van film- en videoproductie brengen: een dynamisch veranderende lichtscène weergeven met felle lichtbronnen, een donkere achtergrond en objecten in het beeld. Tegelijkertijd wilde ik de details in de foto behouden, zowel in de lichte als in de schaduwpartijen, en de digitale ruis tot een minimum beperken.
Hoewel de Kinect in de testen betrouwbaar bleek en geen video-capturekaart nodig had (nog een minpunt), hebben we besloten het apparaat toch maar te laten vallen. Na drie dagen verschillende camera's te hebben getest, koos Ilya voor de Sony FDR-AX53: een kleine, betrouwbare camcorder die betaalbaar is om te huren, maar tegelijkertijd voldoende betrouwbaarheid en beeldeigenschappen heeft.
We huurden een camera, zetten die een week lang aan in combinatie met een videokaart en kwamen erachter dat we er daarmee op konden rekenen dat de beelden gedurende de hele zoektocht continu uitgezonden zouden worden.
Een film maken: enscenering en belichting
Het werk aan de verlichting vereiste een zekere finesse; We moesten met minimale middelen een lichtpartituur creëren:
1. Verlichting van objecten wanneer spelers ze vinden (laser, gewicht), evenals constant licht op de versnipperaar. Hierbij hebben we gebruik gemaakt van dedolight 150, een betrouwbare en compacte bioscoopverlichtingsinrichting met laagspanningshalogeenlampen. Hiermee kunt u de lichtbundel op een specifiek object richten zonder de achtergrond en andere objecten te beïnvloeden.
2. Praktische speellamp - tafellamp, staande lamp, ster, slinger. Al het praktische licht werd harmonieus verdeeld in het frame om het betreffende deel van het beeld te verlichten. Binnenin zaten LED-lampen met een kleurtemperatuur van 3200K, de lamp in de staande lamp was bedekt met een rood Rosco-foliefilter om een ongewoon kleuraccent te creëren.

Ik ben ingenieur bij mijn moeder of lanceer morgen
Hoe wij internet en elektriciteit reserveerden
Het vraagstuk van fouttolerantie werd op een vergelijkbare manier benaderd als in een datacenter: er werd besloten niet af te wijken van de basisprincipes en alles volgens het gebruikelijke N+1-schema te organiseren.
Als de uitzending op YouTube stopt, betekent dit dat het niet meer mogelijk is om via dezelfde link opnieuw verbinding te maken en de stream voort te zetten. Het was een kritiek moment en de kamer waarin ik zat, was een gewoon kantoor.
Hiervoor gebruikten we een OpenWRT-gebaseerde router en het mwan3-pakket. Er werd automatisch elke 5 seconden de beschikbaarheid van het kanaal getest en bij een storing werd overgeschakeld naar de back-upmodem van Yota. Hierdoor werd er in minder dan een minuut overgeschakeld naar het back-upkanaal.

Het was eveneens van groot belang om stroomuitval te voorkomen, aangezien zelfs een kortstondige stroompiek ervoor zorgde dat alle computers opnieuw moesten opstarten.
Daarom hebben we de Ippon Innova G2 3000 onderbrekingsvrije voeding genomen, die alle spelapparaten van stroom zou voorzien. Het totale stroomverbruik van ons systeem was ongeveer 300 watt. Het zou 75 minuten duren, wat voor ons doel ruim voldoende is.
We hebben besloten om geen extra verlichting aan te schaffen voor het geval de stroom in de kamer uitvalt. We hebben de verlichting niet op de UPS aangesloten.
Dankbetuigingen
- Aan het hele team , die het idee bedacht en het spel uitvoerde.
- Afgezien van de RUVDS-beheerders was de belasting voor het monitoren van de werking van de servers acceptabel en werkte alles normaal in de gebruikelijke modus.
- Aan de beste baas omdat er gehoor werd gegeven aan de oproep: “We hebben een idee: we nemen een server, zetten er een aquarium op, hangen er een gewicht boven, boem, boem, alles staat onder water, kortsluiting, brand!” Hij zegt altijd vol vertrouwen: "Doe het!"
- Dank en speciale dank aan Mikhail Karpov, die niet alleen zijn best deed om ons toe te staan de Gebruiksvoorwaarden te schenden, maar ons zelfs een zakelijk account voor een jaar gaf toen we over het project vertelden.
- Aan Ilya Serov voor het meedoen en het medeproduceren van het project, bereid om de halve nacht door te werken aan het lijmen van LED-strips, het zoeken naar technische oplossingen en er alles aan te doen om er een echte film van te maken.
- voor het altijd klaarstaan om de situatie te redden als anderen het opgaf, voor borsjt, morele steun en gesprekken tot de ochtend.
- om ons in contact te brengen met de beste pentester van het land, die ons adviseerde en hielp met de taken.
- voor de coole videoproductie van alle video's.
- voor een vaste hand en de bereidheid om door te werken tot het einde.
- goed voor bijna altijd warme pizza.
En onze grootste dank gaat uit naar de spelers voor alle emoties die we hebben ervaren terwijl jullie twee dagen lang de missie bestormden, zonder te slapen en zelfs werk uitstelden.
Andere artikelen over de zoektocht om de server te vernietigen
Bron: www.habr.com
