Projekthårdvara: hur vi byggde ett rum med ett hackeruppdrag

Projekthårdvara: hur vi byggde ett rum med ett hackeruppdrag
För ett par veckor sedan höll vi online-jakt efter hackareDe byggde ett rum fyllt med smarta enheter och startade en YouTube-sändning därifrån. Spelare kunde styra IoT-enheter från spelets webbplats; målet var att hitta ett vapen gömt i rummet (en kraftfull laserpekare), hacka det och kortsluta rummet.

För att öka spänningen placerade vi en dokumentförstörare i rummet och laddade den med 200 000 rubel: dokumentförstöraren åt en sedel i timmen. Om man vann spelet kunde man stoppa dokumentförstöraren och ta alla återstående pengar.

Vi har redan berättat genomgångOch hur backend-delen gjordes projektet. Det är dags att prata om hårdvaran och hur den monterades.

Spela upp video

Det kom många förfrågningar om att visa städögonblicket för rummet - vi visar hur vi demonterar det.

Järnarkitektur: Rumshantering

Vi började designa hårdvarulösningen när scenariot redan var ungefär klart, backend-systemet var klart och vi hade ett tomt rum redo för installation av utrustningen.

Med tanke på det gamla skämtet "S:et i IoT står för säkerhet" bestämde vi oss för att spelarna den här gången bara interagerar med webbplatsens frontend och backend, men inte har möjlighet att komma direkt till hårdvaran.

Detta gjordes av säkerhets- och underhållningsskäl: om spelare hade direkt tillgång till hårdvaran skulle det vara mycket svårare att isolera säkra och potentiellt farliga handlingar, som att snabbspola framåt i en dokumentförstörare eller kontrollera pyroteknik.

Innan vi började designa formulerade vi flera principer för att styra spelenheter, vilka blev grunden för designen:

Använd inte trådlösa lösningar

Hela spelutrymmet finns i en enda bildruta, vars varje hörn kan nås. Det fanns inget egentligt behov av trådlösa anslutningar, och de skulle helt enkelt bli ytterligare en felpunkt.

Använd inga speciella smarta hemenheter

Främst för att ge flexibilitet i anpassningen. Det är tydligt att vi kan anpassa många färdiga versioner av smarta hemsystem med färdig administratörspanel och kontroll för vår uppgift, men arbetskostnaderna skulle vara jämförbara med att skapa vår egen enkla lösning.

Dessutom var det nödvändigt att ta fram anordningar som tydligt skulle visa att det var spelarna som ändrade dess tillstånd: att slå på/av den eller att sätta ett specifikt ljus på bokstäverna SOKOL.

Vi monterade alla komponenter från lättillgänglig hårdvara som kan köpas i vanliga elektronikbutiker: mellan pizza- och Diet Coke-leveranser anlände ständigt kurirer från Chip & Deep och Leroy till platsen.

Valet att montera allt själva förenklade felsökningen; skalbarheten krävde dock större noggrannhet under installationen.

Alla reläer och arudino ska inte synas i ramen.

Vi bestämde oss för att samla alla styrda element på ett ställe och dölja dem bakom kameran, så att vi kunde övervaka deras funktionalitet och, om nödvändigt, försiktigt krypa ut ur kamerans synfält och byta ut en trasig enhet.

Projekthårdvara: hur vi byggde ett rum med ett hackeruppdrag
Till slut gömdes allt under bordet, och kameran installerades så att ingenting kunde ses under bordet. Detta var vår "döda fläck" som ingenjören kunde krypa upp till.

Som ett resultat fick vi i huvudsak en smart enhet: den tog emot tillståndet för var och en av sina delar från backend-systemet och ändrade det med lämpligt kommando.

Ur hårdvarusynpunkt styrde den här enheten 6 element:

  1. Flera bordslampor, de har ett på/av-läge och styrs av spelare
  2. Bokstäver på väggen, de kan ändra färg på spelarnas kommando
  3. Fläktar som snurrar och öppnar blädderblocket när servern är belastad
  4. Laserstyrd via PWM
  5. Dokumentförstöraren som åt pengar i tid
  6. En rökmaskin som gick igång före varje laserskott.

Spela upp video

Testa en rökmaskin med en laser

Senare tillkom en scenbelysning, som stod bakom ramen och styrdes exakt som ljusen från punkt 1. Scenbelysningen fungerade i två fall: den lyste upp lasern när ström tillfördes den, och den lyste upp vikten innan lasern avfyrades i stridsläge.

Vad var det här för smart enhet?

Projekthårdvara: hur vi byggde ett rum med ett hackeruppdrag

Hela vägen försökte Yura, vår hårdvaruexpert, att inte komplicera saker och ting och komma med den enklaste och mest minimalistiska lösningen som möjligt.

Det antogs att VPS:en helt enkelt skulle köra ett skript som tar emot json med enheternas status och skickar det till Arduino:n ansluten via USB.

Följande portar var anslutna:

  • 16 vanliga reläer (det var de som gav ifrån sig klickandet som du hörde i videon. Vi valde dem främst på grund av det ljudet)
  • 4 solid state-reläer för styrning av PWM-kanaler, såsom fläktar,
  • separat PWM-utgång för laser
  • utgång som genererar en signal till LED-remsan

Här är ett exempel på ett json-kommando som kom till reläet från servern

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

Och detta är ett exempel på den funktion som laget använde för att nå Arudino

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

För att spåra ögonblicket när lasern slutligen bränner igenom repet och vikten flyger in i akvariet, tillverkade vi en liten knapp som skulle reagera på viktens fall och skicka en signal till systemet.

Projekthårdvara: hur vi byggde ett rum med ett hackeruppdrag
Knapp för övervakning av viktrörelser

Vid denna signal skulle rökbomber gjorda av pingisbollar tändas. Vi satte fyra rökbomber direkt i serverhöljet och anslöt en nikromtråd till dem, som skulle värmas upp och fungera som en säkring.

Projekthårdvara: hur vi byggde ett rum med ett hackeruppdrag
Fodral med rökbomber och kinesisk girlang

Projekthårdvara: hur vi byggde ett rum med ett hackeruppdrag

Arduino

Enligt den ursprungliga planen ägde två åtgärder rum på Arduino.

Först, när en ny förfrågan mottogs, analyserades den med hjälp av ArduinoJson-biblioteket. Därefter tilldelades varje kontrollerad enhet två av sina egenskaper:

  • strömtillstånd "på" eller "av" (standardtillstånd)
  • den period under vilken enheten är påslagen - tiden i mikrosekunder från kortet startar, när det är dags att stänga av det, det vill säga att återställa tillståndet till standarden

Den senaste tiden ställdes in när motsvarande parameter togs emot i JSON, men den kunde utelämnas, då sattes värdet till 0 och nollställning skedde inte.

Den andra åtgärden som Arduino utförde varje cykel var att uppdatera tillstånden, det vill säga kontrollera om det fanns ett behov av att slå på något eller om det var dags att stänga av någon enhet.

Laserpekare - samma Megatron 3000

Projekthårdvara: hur vi byggde ett rum med ett hackeruppdrag

Detta är en vanlig LSMVR450-3000MF 3000mW 450nm manuell fokuseringslaserskärnings- och märkningsmodul.

Bokstäver Falk

De var väldigt enkelt gjorda – vi kopierade helt enkelt bokstäverna från logotypen, skar ut dem ur kartong och klistrade sedan fast dem med LED-remsa. För att göra det var vi tvungna att löda ihop remsbitarna, 4 kontakter på varje söm, men resultatet var värt det. Vår designer Pasha visade upp enastående skicklighet och gjorde detta på mindre än några timmar.

Spela upp video

Första tester av IoT-enheten och sista handen vid arbetet

Vi gjorde de första testerna och samtidigt fick vi nya uppgifter. Grejen är den att mitt i processen anslöt sig en riktig filmproducent och kameraman från VGIK, Ilya Serov, till teamet – han byggde ramen, lade till ytterligare filmbelysning och ändrade spelets manus något så att handlingen skulle bli mer känslosam och bilden mer dramatisk och teatralisk.

Detta ökade kvaliteten avsevärt, men element dök upp som också behövde anslutas till reläet och driftsalgoritmen skrivas ner.

Ett annat problem var lasern: vi gjorde några experiment med olika typer av rep och lasrar med olika effekt. För testet hängde vi helt enkelt lasten vertikalt på repet.

Vid körning med en testbricka var effekten som reglerades via PWM mindre än 10 % och skadade inte repet ens vid lång exponering.

För stridsläge defokuserades lasern till en punkt med en diameter på cirka 10 mm, och den brände med säkerhet genom repet med lasten från ett avstånd av cirka en meter.

Projekthårdvara: hur vi byggde ett rum med ett hackeruppdrag
Så lasern fungerade perfekt i tester.

När vi började testa allting direkt i rummet på en upphängd vikt, visade det sig att det inte är så lätt att fixera lasern ordentligt. Sedan, när repet brinner, smälter det, sträcker sig och förskjuts från det ursprungliga fokuset.

Projekthårdvara: hur vi byggde ett rum med ett hackeruppdrag
Men det fungerade inte så längre: repet förskjutits

Ilja flyttade lasern till motsatt ände av rummet från repet så att laserstrålen skulle gå över hela scenen och se snygg ut i bilden, vilket fördubblade avståndet.

Efter att ha utfört flera experiment med att bränna repet redan i strid, bestämde vi oss för att inte utmana ödet och säkra att repet skulle skäras av med en nikromtråd. Den förstörde tråden 120 sekunder efter att lasern slagits på i stridsläge. Detta, förutom att stänga av tråden och antända rökbomberna när brytkontakten utlöses, bestämde vi oss för att hårdkoda direkt i mikrokontrollerns hårdvara.

Projekthårdvara: hur vi byggde ett rum med ett hackeruppdrag
Tråden som så småningom brann igenom repet utanför skärmen

Således dök en tredje uppgift upp som Arduino löste - att utarbeta sekvenserna i samband med utförandet av dessa kommandon.

Vi bestämde oss också för att ge Arduino ansvaret för att räkna pengar på TV:n och starta dokumentförstöraren. Ursprungligen antogs det att backend-systemet skulle göra detta och att det aktuella saldot skulle synas på webbplatsen, och på TV:n skulle vi visa kommentarer från YouTube som ett ytterligare interaktivt element, vilket antydde för tittarna att händelser i rummet sker i realtid.

Men under testkörningen tittade Ilya på scenen och föreslog att visa spelsaldot på den största skärmen: hur mycket pengar som är kvar, hur mycket som har ätits och en nedräkning till nästa start av dokumentförstöraren.

Vi kopplade Arduino till aktuell tid: varje hel timme startade dokumentförstöraren. Bilden på TV:n skickades ut med hjälp av Raspberry, som i det ögonblicket redan tog emot förfrågningar från servern och skickade dem till Arduino för exekvering. Bilder med monetära indikatorer ritades genom att anropa konsolverktyget fim, något i stil med detta.

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

Och den bildades baserat på den erforderliga mängden eller tiden.

Vi genererade bilderna i förväg: vi tog helt enkelt en färdig video med timer och exporterade 200 bilder.

Detta är mekaniken som programmerades in i korset. När den slutliga nedräkningen började hade vi alla kört ut till platsen, beväpnat oss med brandsläckare och satt oss ner för att vänta på elden (som bara flammade med full kraft i disharmonin).

Hur man gör en sändning som varar en vecka: Att välja en kamera

För uppdraget behövde vi en kontinuerlig sändning på YouTube i 7 dagar – det var så länge vi planerade för spelets maximala längd. Det fanns två saker som kunde komma i vägen:

  1. Kameran överhettas från kontinuerlig drift
  2. Internetavbrott

Kameran var tvungen att ge minst en Full HD-bild för att göra det bekvämt att spela och titta på i rummet.

Inledningsvis tittade vi på webbkameror som är producerade för streamers. Vi höll på att skära ner på vår budget, så vi ville inte köpa en kamera, och det visade sig att de inte hyr ut dem. I det ögonblicket hittade vi mirakulöst nog en Xbox Kinect-kamera liggandes runt omkring mitt hus, ställde den i rummet och startade en testsändning i en vecka.

Kameran fungerade bra och överhettades inte, men Ilya märkte nästan omedelbart att den saknade inställningar, i synnerhet var det omöjligt att ställa in exponeringen.

Ilja ville föra sändningstypen närmare standarderna för film- och videoproduktion: att överföra en dynamiskt föränderlig ljusscen med starka ljuskällor, en mörkare bakgrund och objekt i bilden. Samtidigt ville han bevara bildförädlingen både i högdagrar och skuggor, med minimalt digitalt brus.

Därför, även om Kinect visade sig vara pålitlig i tester och inte krävde ett videoinspelningskort (ytterligare ett fel), bestämde vi oss för att överge den. Efter tre dagars tester av olika kameror valde Ilya Sony FDR-AX53 - en liten, pålitlig videokamera, budgetvänlig att hyra, men samtidigt med tillräcklig tillförlitlighet och bildegenskaper.

Vi hyrde en kamera, satte på den i en vecka tillsammans med ett videoinspelningskort och insåg att med den kunde vi räkna med kontinuerlig sändning under hela uppdraget.

Att göra en film: scenografi och ljussättning

Arbetet med ljussättningen krävde en viss finess; vi var tvungna att skapa ett ljuspartitur med minimala medel:

1. Belysning av föremål när spelare hittar dem (laser, vikt), samt konstant ljus på dokumentförstöraren. Här användes Dedolight 150 - pålitliga och kompakta belysningsarmaturer med lågspänningshalogenlampor, vilket gör att du kan fokusera strålen på ett specifikt objekt utan att påverka bakgrunden och andra föremål.

2. Praktisk leklampa - bordslampa, golvlampa, stjärna, girlang. Allt praktiskt ljus fördelades harmoniskt i ramen för att belysa dess bildområde, inuti fanns LED-lampor med en färgtemperatur på 3200K, lampan i golvlampan var täckt med ett rött Rosco-foliefilter för att skapa en ovanlig färgaccent.

Projekthårdvara: hur vi byggde ett rum med ett hackeruppdrag
Jag är ingenjör hos min mamma eller så lanserar jag imorgon

Hur vi reserverade internet och el

Frågan om feltolerans hanterades nästan som i ett datacenter: man beslutade att inte avvika från grundprinciperna och reserverade sig enligt det vanliga N+1-schemat.

Om sändningen på YouTube avbryts betyder det att det inte längre går att återansluta med samma länk och fortsätta streamen. Detta var ett kritiskt ögonblick, och rummet var i ett vanligt kontor.

För detta använde vi en OpenWRT-baserad router och mwan3-paketet. Den testade automatiskt kanalens tillgänglighet var 5:e sekund och bytte, vid ett avbrott, till ett backupmodem med Yota. Som ett resultat skedde bytet till backupkanalen på mindre än en minut.
Projekthårdvara: hur vi byggde ett rum med ett hackeruppdrag
Det var också lika viktigt att eliminera strömavbrott, eftersom även en kortvarig strömavbrott skulle få alla datorer att starta om.

Därför valde vi den avbrottsfria strömförsörjningen Ippon Innova G2 3000, som skulle backa upp alla spelenheter: den totala strömförbrukningen för vårt system var cirka 300 watt. Den skulle räcka i 75 minuter, vilket är fullt tillräckligt för våra ändamål.

Vi bestämde oss för att offra extra belysning ifall strömmen skulle gå i rummet – vi anslöt den inte till UPS:en.

Kvitteringar

  • Till hela teamet RUVDS, som kom på idén och genomförde spelet.
  • Separat för RUVDS-administratörerna, för övervakning av servrarnas arbete, var belastningen acceptabel och allt fungerade normalt i vanligt läge.
  • Till den bästa chefen ntsaplin för det faktum att han som svar på uppmaningen ”Jag har en idé: vi tar en servering, sätter ett akvarium på den och hänger en vikt ovanför, pang, pang, allt är översvämmat av vatten, kortslutning, eld!” säger han alltid självsäkert ”gör det!”
  • Tack Tilda förlag och ett särskilt tack till Mikhail Karpov för att han inte bara gjorde allt för att låta oss bryta mot användarvillkoren, utan till och med gav oss ett företagskonto i ett år när vi berättade om projektet.
  • Till Ilja Serov S_ILya för att ha varit med och blivit medproducent i projektet, redo att krypa halva natten och limma LED-remsor, leta efter tekniska lösningar och göra allt för att vi ska få till en riktig film.
  • zhovner för att alltid vara redo att rädda situationen när andra räckte upp, borsjtj, moraliskt stöd och samtal fram till morgonen.
  • samat för att ha kopplat oss till den bästa penntestaren i landet som gav oss råd och hjälpte oss med uppgifterna.
  • danielmjölk för den coola videoproduktionen av alla videor.
  • Delphé för en fast hand och en vilja att arbeta in i det sista.
  • bra Dodo Pizza Engineering för nästan alltid varm pizza.

Och det största tacket går till spelarna för alla känslor vi upplevde medan ni stormade uppdraget i två dagar utan sömn och till och med sköt upp jobbet.

Andra artiklar om strävan att förstöra servern

Projekthårdvara: hur vi byggde ett rum med ett hackeruppdrag

Källa: will.com