Projekthardware: hvordan vi byggede et rum med en hacker-quest

Projekthardware: hvordan vi byggede et rum med en hacker-quest
For et par uger siden tilbragte vi online søgen efter hackere: de byggede et rum, som de fyldte med smarte enheder og lancerede en YouTube-udsendelse fra det. Spillere kunne styre IoT-enheder fra spilwebstedet; Målet var at finde et våben gemt i rummet (en kraftig laserpointer), hacke det og forårsage en kortslutning i rummet.

For at føje til handlingen placerede vi en makulator i rummet, hvori vi læssede 200 rubler: makulatoren spiste en regning i timen. Efter at have vundet spillet, kan du stoppe makuleringsmaskinen og tage alle de resterende penge.

Vi har allerede fortalt går igennemog hvordan backend blev lavet projekt. Det er tid til at tale om hardwaren og hvordan den blev samlet.


Der var mange anmodninger om at vise tidspunktet for rengøring af et værelse - vi viser, hvordan vi skiller det ad

Hardwarearkitektur: Rumkontrol

Vi begyndte at designe en hardwareløsning, da scenariet allerede var nogenlunde forstået, backend var klar, og vi havde et tomt rum klar til at installere udstyret.

Idet vi huskede den gamle vittighed "S'et i IoT står for sikkerhed" ("Bogstavet S i IoT-forkortelsen står for sikkerhed"), besluttede vi, at denne gang interagerer spillerne i spilscenariet kun med front-end og back-end af pladsen, men får ikke mulighed for at komme direkte til strygejernet.

Dette blev gjort af sikkerhedsmæssige årsager og af hensyn til, hvad der skete på skærmen: med spillernes direkte adgang til hardwaren ville det være meget sværere at isolere sikre og potentielt farlige handlinger, for eksempel hurtig rulning af en makuleringsmaskine eller kontrol pyroteknik.

Inden vi startede designet formulerede vi flere principper for styring af spilleenheder, som blev grundlaget for designet:

Brug ikke trådløse løsninger

Hele spillerummet er i én ramme, hvoraf hvert hjørne kan nås. Der var ikke noget reelt behov for trådløse forbindelser, og de ville simpelthen blive endnu et fejlpunkt.

Brug ikke nogen specielle smart home-enheder

Primært af hensyn til tilpasningsfleksibiliteten. Det er klart, at vi kan tilpasse mange boxed versioner af smart home-systemer med færdiglavet admin og kontroller til vores opgave, men lønomkostningerne ville kunne sammenlignes med at skabe din egen enkle løsning.

Derudover var det nødvendigt at komme med enheder, der tydeligt ville vise, at det var spillerne, der ændrede dens tilstand: de tændte/slukkede den eller satte et specifikt lys på bogstaverne FALCON.

Vi samlede alle elementer fra offentligt tilgængeligt hardware, der kan købes i almindelige radiodelebutikker: mellem levering af pizza og diætcola kom kurererne Chip og Dip og Leroy konstant til stedet.

Valget om selv at samle alt forenklet fejlfinding, skalerbarhed krævede dog større omhu under installationen.

Alle relæer og arudin bør ikke være synlige i rammen

Vi besluttede at samle alle de kontrollerbare elementer på ét sted og gemme dem bag kulisserne for at kunne overvåge deres ydeevne og om nødvendigt forsigtigt kravle ud af syne af kameraet og udskifte den defekte enhed.

Projekthardware: hvordan vi byggede et rum med en hacker-quest
Til sidst var alt gemt under bordet, og kameraet blev installeret, så intet var synligt under bordet. Dette var vores "blinde punkt" for ingeniøren at krybe op

Som et resultat fik vi faktisk en smart enhed: den modtog tilstanden for hver af dens dele fra backend og ændrede den med den passende kommando.

Fra et hardwareimplementeringssynspunkt kontrollerede denne enhed 6 elementer:

  1. Flere bordlamper, de har tænd/sluk-tilstand og styres af spillere
  2. Bogstaver på væggen, de kan ændre deres farve på kommando af spillerne
  3. Fans, der snurrer og åbner flipover, når serveren er under belastning
  4. Laserstyret via PWM
  5. Shredder, der spiste penge efter planen
  6. En røgmaskine, der gik i gang før hvert laserskud


Test af en røgmaskine med laser

Senere blev der tilføjet et scenelys, som stod bag stellet og blev styret præcis som lamperne fra punkt 1. Scenelyset virkede i to tilfælde: det oplyste laseren, når der blev sat strøm på den, og det oplyste vægten før laser blev lanceret i kamptilstand.

Hvad var denne smarte enhed?

Projekthardware: hvordan vi byggede et rum med en hacker-quest

Hele vejen forsøgte Yura, vores hardwaremand, ikke at komplicere tingene og komme med den enklest mulige, minimalistiske løsning.

Det blev antaget, at VPS'en blot ville køre et script, der modtager json med enhedernes tilstand og sender det til Arduino tilsluttet via USB.

Tilsluttet portene:

  • 16 almindelige relæer (det var dem, der lavede den kliklyd, der blev hørt i videoen. Vi valgte dem primært på grund af denne lyd)
  • 4 solid state-relæer til styring af PWM-kanaler, såsom blæsere,
  • separat PWM-udgang til laser
  • output, der genererer et signal til LED-strimlen

Her er et eksempel på en json-kommando, der kom til relæet fra serveren

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

Og dette er et eksempel på en funktion, hvormed kommandoen kom til Arudino

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

For at spore det øjeblik, hvor laseren endelig brænder igennem rebet, og vægten flyver ind på akvariet, lavede vi en lille knap, der blev udløst, da vægten faldt og gav et signal til systemet.

Projekthardware: hvordan vi byggede et rum med en hacker-quest
Knap til overvågning af vægtens bevægelse

Ved dette signal skulle røgbomber lavet af pingpongbolde lyse op. Vi satte 4 røgblus direkte ind i serverkassen og tilsluttede dem med en nichrome tråd, som skulle varme op og fungere som en tænder.

Projekthardware: hvordan vi byggede et rum med en hacker-quest
Hus med røgbomber og kinesisk guirlande

Projekthardware: hvordan vi byggede et rum med en hacker-quest

Arduino

Ifølge den oprindelige plan fandt to handlinger sted på Arduino.

For det første, når en ny anmodning blev modtaget, blev anmodningen parset ved hjælp af ArduinoJson-biblioteket. Dernæst blev hver administreret enhed matchet med dens to egenskaber:

  • strømtilstand "on" eller "off" (standardtilstand)
  • den periode, hvor enheden er tændt - tiden i mikrosekunder fra starten af ​​brættet, når det er tid til at slukke det, det vil sige bringe tilstanden til standard

Sidste gang den blev indstillet ved modtagelse af den tilsvarende parameter i JSON, men den kunne ikke transmitteres, så blev værdien sat til 0, og der skete ingen nulstilling.

Den anden handling, som Arduino udførte hver cyklus, var at opdatere tilstande, det vil sige at kontrollere, om der var behov for at tænde noget, eller om det var på tide at slukke for enhver enhed.

Laserpointer - den samme Megatron 3000

Projekthardware: hvordan vi byggede et rum med en hacker-quest

Dette er et almindeligt LSMVR450-3000MF 3000mW 450nm laserskærings- og mærkningsmodul med manuel fokus.

Bogstaver Falcon

De blev lavet meget enkelt - vi kopierede simpelthen bogstaverne fra logoet, skar dem ud af pap og dækkede dem derefter med LED-tape. I dette tilfælde skulle jeg lodde tapestykkerne sammen, 4 kontakter på hver søm, men resultatet var det værd. Vores backender Pasha viste mirakler af dygtighed og gjorde det på mindre end et par timer.

Første test af iot-enheden og efterbehandling

Vi lavede de første test og samtidig kom der nye opgaver til os. Faktum er, at midt i processen sluttede en rigtig filmproducent og kameramand fra VGIK, Ilya Serov, sig til holdet - han byggede rammen, tilføjede ekstra biografbelysning og ændrede en smule spilmanuskriptet for at gøre plottet mere følelsesladet, og billedet mere dramatisk og teatralsk.

Dette øgede kvaliteten markant, men der dukkede elementer op, som også skulle kobles til relæet og den foreskrevne driftsalgoritme.

Et andet problem var laseren: vi lavede adskillige eksperimenter med forskellige typer reb og lasere af forskellig kraft. Til testen hængte vi blot en vægt lodret på et reb.

Når man løb med en test-token, var effekten reguleret gennem PWM mindre end 10% og beskadigede ikke rebet selv ved lang eksponering.

Til kamptilstand blev laseren defokuseret til omtrent et sted med en diameter på 10 mm, og den brændte trygt gennem et reb med en belastning fra en afstand på omkring en meter.

Projekthardware: hvordan vi byggede et rum med en hacker-quest
Så laseren fungerede perfekt i test

Da vi begyndte at teste alt lige i rummet på en ophængt vægt, viste det sig, at det ikke var så nemt at montere laseren sikkert. Så, når rebet brænder, smelter det, strækkes og bevæger sig ud af sit oprindelige fokus.

Projekthardware: hvordan vi byggede et rum med en hacker-quest
Men sådan fungerede det ikke længere: rebet flyttede sig

Ilya flyttede laseren til enden af ​​rummet modsat rebet, så laserstrålen ville gå hen over hele scenen og se smuk ud i rammen, hvilket fordoblede afstanden.

Efter at have udført flere eksperimenter med at brænde rebet allerede i kamp besluttede vi ikke at torturere skæbnen og sikre overskæringen af ​​rebet ved hjælp af nichrome-tråd. Det ødelagde tråden 120 sekunder efter at have tændt laseren i kamptilstand. Vi besluttede at hardkode dette, såvel som afbrydelsen af ​​ledningen og tændingen af ​​røgbomber, når separationskontakten udløses, direkte ind i hardwaren på mikrocontrolleren.

Projekthardware: hvordan vi byggede et rum med en hacker-quest
Tråden, der til sidst brændte gennem rebet off-screen

Således dukkede en tredje opgave op, som Arduino'en løste - at udarbejde de sekvenser, der er forbundet med udførelsen af ​​disse kommandoer.

Vi besluttede også at give Arduino behovet for at tælle penge på tv'et og køre makuleringsmaskinen. I første omgang blev det antaget, at backend ville gøre dette, og den aktuelle saldo ville være synlig på hjemmesiden, og på tv'et ville vi vise kommentarer fra YouTube som et ekstra interaktivt element, der fortæller seerne, at begivenhederne i rummet foregik i virkeligheden tid.

Men under testkørslen kiggede Ilya på scenen og foreslog at vise spillets saldo på den største skærm: hvor mange penge er der stadig tilbage, hvor meget der er blevet spist og nedtællingen til næste start af makuleringsmaskinen.

Vi knyttede Arduino til det aktuelle tidspunkt: hver hele time blev makuleringsmaskinen startet. Billedet blev vist på tv'et ved hjælp af rasberry, som på det tidspunkt allerede modtog anmodninger fra serveren og sendte dem til arduino'en til udførelse. Billeder med monetære indikatorer blev tegnet ved at kalde konsolværktøjet fim noget som dette

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

Og det blev dannet baseret på den nødvendige mængde eller tid.

Vi genererede billederne på forhånd: Vi tog simpelthen en færdig video med en timer og eksporterede 200 billeder.

Dette er mekanikken, der blev programmeret ind i korset. Da den endelige nedtælling startede, gik vi alle til stedet, bevæbnede os med ildslukkere og satte os for at vente på branden (som kun var i fuld gang i uenigheden)

Sådan laver du en udsendelse, der fungerer i en uge: at vælge et kamera

Til missionen havde vi brug for en kontinuerlig udsendelse på YouTube i 7 dage - det er præcis, hvad vi satte som den maksimale varighed af spillet. Der var to ting, der kunne stoppe os:

  1. Kameraet overophedes på grund af kontinuerlig drift
  2. Internetafbrydelse

Kameraet skulle give mindst et Full HD-billede for at gøre det behageligt at spille og se rummet.

I første omgang kiggede vi mod webkameraer, der er produceret til streamere. Vi skar i vores budget, så vi ønskede ikke at købe et kamera, men som det viste sig, lejer de dem ikke. I samme øjeblik fandt vi mirakuløst et Xbox Kinect-kamera liggende i mit hus, installerede det på mit værelse og startede en testudsendelse i en uge.

Kameraet fungerede fint og blev ikke overophedet, men Ilya bemærkede næsten med det samme, at det manglede indstillinger, især var det umuligt at indstille eksponeringen.

Ilya søgte at bringe udsendelsestypen tættere på standarderne for film- og videoproduktion: at formidle en dynamisk skiftende lysscene med lyse lyskilder, en mørk baggrund og objekter i rammen. Samtidig ønskede jeg at bevare uddybningen af ​​billedet både i højlys og skygger, med minimal digital støj.

Derfor, selvom Kinect viste sig at være pålidelig i test og ikke krævede et videooptagelseskort (et andet fejlpunkt), besluttede vi at opgive det. Efter tre dages test af forskellige kameraer, valgte Ilya Sony FDR-AX53 - et lille, pålideligt videokamera, der er billigt at leje, men som samtidig har tilstrækkelig pålidelighed og visuelle egenskaber.

Vi lejede et kamera, tændte det i en uge sammen med et videooptagelseskort og indså, at med det kunne vi regne med kontinuerlig udsendelse gennem hele missionen.

At lave en film: iscenesætte scenen og lyssætning

Arbejdet med belysningen krævede en vis ynde; vi havde brug for at opbygge et lysresultat med minimale midler:

1. Belysning af genstande, når spillerne finder dem (laser, vægt), samt konstant lys på makuleringsmaskinen. Her brugte vi dedolight 150 - pålidelige og kompakte filmbelysningsenheder med lavspændingshalogenlamper, som giver dig mulighed for at fokusere strålen på et bestemt objekt uden at påvirke baggrunden og andre objekter.

2. Praktisk legelys - bordlampe, gulvlampe, stjerne, guirlande. Alt praktisk lys blev harmonisk fordelt i rammen for at oplyse billedområdet, der var LED-lamper med en farvetemperatur på 3200K indeni, lampen i gulvlampen var dækket af et rødt Rosco-foliefilter for at skabe en usædvanlig farveaccent.

Projekthardware: hvordan vi byggede et rum med en hacker-quest
Jeg er ingeniør hos min mor, ellers er lanceringen i morgen

Hvordan vi reserverede internet og elektricitet

De nærmede sig spørgsmålet om fejltolerance næsten som i et datacenter: de besluttede ikke at afvige fra de grundlæggende principper og reserverede i henhold til den sædvanlige N+1-ordning.

Hvis udsendelsen på YouTube stopper, betyder det, at det vil være umuligt at oprette forbindelse igen ved at bruge det samme link og fortsætte streamen. Det var et kritisk øjeblik, og lokalet var placeret på et almindeligt kontor.

Til dette brugte vi en OpenWRT-baseret router og mwan3-pakken. Den testede automatisk tilgængeligheden af ​​kanalen hvert 5. sekund og skiftede i tilfælde af en pause til backup-modemet med Yota. Som følge heraf skete skiftet til backupkanalen på mindre end et minut.
Projekthardware: hvordan vi byggede et rum med en hacker-quest
Det var også lige så vigtigt at eliminere strømafbrydelser, fordi selv en kortvarig strømstigning ville forårsage en genstart af alle computere.

Derfor tog vi en ippon innova g2 3000 uafbrydelig strømforsyning, som ville sikkerhedskopiere alle gaming-enheder: det samlede strømforbrug for vores system var omkring 300 watt. Det ville vare i 75 minutter, ganske nok til vores formål.

Vi besluttede at ofre yderligere belysning i tilfælde af, at elektriciteten i rummet gik ud - det var ikke tilsluttet en uafbrydelig strømforsyning.

Tak

  • Til hele holdet RUVDS, der opfandt og implementerede spillet.
  • Separat for RUVDS-administratorerne for overvågning af servernes arbejde var belastningen acceptabel, og alt fungerede som normalt.
  • Til den bedste chef ntsaplin for det faktum, at som svar på opkaldet, "Jeg har en idé: vi tager en server, sætter et akvarium på den og hænger en vægt over den, bom, bang, alt er oversvømmet med vand, kortslutning, brand !" han siger altid selvsikkert "gør det!"
  • Tak Tilda Forlag og separat til Mikhail Karpov for ikke kun at mødes halvvejs og give os lov til at overtræde vilkårene for brug, men endda give os en virksomhedskonto i et år, da vi talte om projektet.
  • Ilya Serov S_ILja for at være med og blive co-producer på projektet, klar til at kravle den halve nat, limning af LED-strimmel, på udkig efter tekniske løsninger og gøre alt for at vi får en rigtig film.
  • zhovner for altid at være klar til at redde situationen, når andre slog hænderne op, borsjtj, moralsk støtte og samtaler til morgenstunden.
  • samat for at forbinde os med landets bedste pentester, som rådgav os og hjalp os med opgaver.
  • daniemælk for den fede videoproduktion af alle videoer.
  • delphe for en fast hånd og vilje til at arbejde til det sidste.
  • godt Dodo Pizza Engineering til næsten altid varm pizza.

Og den største taknemmelighed går til spillerne for alle de følelser, vi oplevede, mens du stormede søgen efter to dage uden søvn og endda udsætte arbejdet.

Andre artikler om søgen efter at ødelægge serveren

Projekthardware: hvordan vi byggede et rum med en hacker-quest

Kilde: www.habr.com

Tilføj en kommentar