Cumu hè statu creatu u backend di un ghjocu di pirate per a distruzzione di un servitore

Cumu hè statu creatu u backend di un ghjocu di pirate per a distruzzione di un servitore
Cuntinuemu à dì cumu a nostra ricerca laser cù a distruzzione di u servitore hè stata disposta. Cumincià in precedente articulu di risolve a ricerca.

In totale, u backend di u ghjocu avia 6 unità architettoniche, chì analizzeremu in questu articulu:

  1. Backend di entità di ghjocu chì eranu rispunsevuli di i miccanismi di ghjocu
  2. Backend è bus di scambiu di dati di u situ in VPS
  3. Traduttore da richieste di backend (elementi di ghjocu) à Arduino è hardware in situ
  4. Arduino, chì era rispunsevuli di cuntrullà i relay, hà ricevutu cumandamenti da u traduttore è hà fattu u travagliu propiu
  5. Dispositivi attuali: fan, ghirlande, lampade da terra, etc.
  6. Frontend - u situ web Falcon stessu, da quale i ghjucatori cuntrullavanu i dispositi

Andemu per ognunu di elli.

Backend di entità di ghjocu

U backend hè statu implementatu cum'è una applicazione di primavera: hà avutu parechji controller di restu, un endpoint websocket è servizii cù logica di ghjocu.

Ci era solu trè cuntrolli:

  • Megatron. L'attuale pagina di Megatron hè stata mandata per mezu di e dumande GET: prima è dopu accende u putere. U laser hà sparatu attraversu a dumanda POST.
  • Mappatura di e pagine di tilde in modu chì sò servite da u nome di a pagina. Tilde produce pagine per l'esportazione micca cù i nomi originali, ma cù l'ID internu è l'infurmazioni di conformità.
  • Controller Captcha per serve captcha di u servitore pseudo-high-load.

L'endpoint Websocket hè stata utilizata per cuntrullà i gadgets: lampade, ghirlanda è lettere. Hè statu sceltu per affissà in modu sincronu à tutti i ghjucatori u statutu attuale di u dispusitivu: s'ellu hè attivatu o disattivatu, attivu o micca, chì culore di a lettera hè attualmente illuminata nantu à u muru. Per fà u compitu di accende u laser un pocu più difficiule, avemu aghjustatu l'autorizazione à a guirlanda è u laser cù u stessu login è password admin / admin.

I ghjucatori puderanu pruvà accendendu a ghirlanda è ripetite u listessu cù u laser.

Avemu sceltu una coppia di login-password cusì triviale per ùn turmentà i ghjucatori cù una selezzione inutile.

Per fà u compitu un pocu più interessante, l'ID d'ughjettu da mongodb sò stati utilizati com'è identificatori di u dispositivu in a stanza.

ObjectId cuntene un timestamp: dui valori aleatorii, unu di i quali hè pigliatu basatu annantu à l'identificatore di u dispositivu, è u sicondu basatu annantu à u pid di u prucessu chì u genera è u valore di u contatore. Vuliu fà l'identificatori generati à intervalli rigulari è cù diversi prucessi di pid, ma cù un contatore cumunu, perchè a selezzione di un identificatore di u dispositivu laser seria più interessante. In ogni casu, à a fine, ognunu hà cuminciatu cù identificatori chì sò diffirenti solu in u valore di u cuntrariu. Questu pò avè fattu u passu troppu simplice è ùn hà micca bisognu di l'analisi di a struttura objectId.

Traduttore da richieste di backend

Scrittura Python, chì hà travagliatu nantu à i timers è i tradutti da l'astrazioni di u ghjocu in un mudellu fisicu. Per esempiu, "accende a lampada da terra" → "accende u relay N2".

U script hà cunnessu à a fila RabbitMQ è trasfirì e richieste da a fila à Arduino. Hè ancu implementatu a logica di u cambiamentu di luce parallela: inseme cù certi dispositi, a luce nantu à elli hè stata accesa, per esempiu, quandu u putere era inizialmente furnitu à Megatron, hè stata illuminata cù luci di scena. U disignu di l'illuminazione per a cinematografia di tutta a scena hè una storia separata nantu à u grande travagliu di u nostru co-produttore di prughjettu è u designer di produzzione Ilya Serov, è avemu da cuntà in un postu separatu.

U traduttore era ancu rispunsevuli di a logica di lanciari u shredder cù un timer è trasmette l'imaghjini à a TV: u timer per lancià u shredder, un capibara urlanti, un cummerciale à a fine di u ghjocu.

Cumu a logica per generà u token Megatron hè stata strutturata

Tiro di prova

Ogni 25 seconde un novu token hè statu generatu è puderia esse usatu per accende u laser per 10 seconde à u putere 10/255. Link à github cù codice Megatron.

U laser poi rinfriscà per 1 minutu - in questu tempu ùn era micca dispunibile è ùn accettava micca novi richieste di colpi.

Stu putere ùn era micca abbastanza per brusgià à traversu a corda, ma ogni ghjucadore puderia sparà Megatron è vede u fasciu laser in azzione.

L'algoritmu di hashing MD5 hè statu utilizatu per generà u token. È u schema hà travagliatu MD5 da MD5 + counter + secret per un token di cummattimentu è senza un sicretu per un token di prova.

MD5 hè una riferenza à un prughjettu cummerciale chì Pavel, u nostru backender, hà fattu. Solu un paru d'anni fà stu prughjettu hà utilizatu MD5, è quandu hà dettu à l'architettu di u prughjettu chì era un algoritmu di criptografia anticu, cuminciaru à aduprà MD5 da MD5. Siccomu avemu decisu di fà u prughjettu più noob pussibule, si ricurdò di tuttu è hà decisu di fà una piccula riferenza.

Tiru di cummattimentu

U modu di cummattimentu di Megatron hè 100% di putenza laser à 3 watts. Questu hè abbastanza per 2 minuti per brusgià a corda chì mantene u pesu, per rompe l'aquarium è inundate u servitore cù l'acqua.

Avemu lasciatu parechji suggerimenti nantu à u Github di u prughjettu: vale à dì, u codice di generazione di token, da quale unu puderia capisce chì i tokens di teste è di cumbattimentu sò generati nantu à u listessu indicatore contatore. In u casu di un token di cummattimentu, in più di u valore di u cuntrariu, hè ancu utilizatu un sali, chì hè quasi cumplettamente lasciatu in a storia di cambià stu gist, cù l'eccezzioni di l'ultimi dui caratteri.

Sapendu sti dati, era pussibili a sorte à traversu l 'ultimi simboli 2 di u sali è in realtà scopre chì i numeri da Lost, cunvertiti à u sistema hexadecimal, sò stati usati per questu.

Allora i ghjucatori anu da catturà u valore di u cuntrariu (analizendu u token di prova) è generà un token di cummattimentu utilizendu u prossimu valore di cuntrariu è u sali sceltu à u passu precedente.

U cuntatore hà aumentatu simpliciamente cù ogni colpu di prova è ogni 25 seconde. Ùn avemu micca scrittu annantu à questu in ogni locu, duverebbe esse una piccula sorpresa di ghjocu.

serviziu d'interazione Captcha

In u mondu di u ghjocu, questu era u stessu captcha chì deve esse carricatu per accende u fan è apre u flipchart cun un suggerimentu. Accantu à a camera era un laptop cun monitoraghju di carica.

Cumu hè statu creatu u backend di un ghjocu di pirate per a distruzzione di un servitore

sirvizziu Aghju calculatu ciò chì mostra in u monitoraghju cum'è a carica attuale: temperatura è CPU Fan. I metrici sò stati trasferiti à a basa di basa di u tempu è disegnati da grafana.

Se in l'ultimi secondi 5 ci era più di 50 richieste per vede u captcha, allora a carica hè aumentata da un numeru fissu + aleatoriu di passi. U calculu era chì a carica di 100% puderia esse ottenuta in dui minuti.

In fatti, ci era più logica in u serviziu di ciò chì era visualizatu in u ghjocu finali: avemu postu u monitor in tale manera chì solu a rotazione di u CPU Fan era visibile.

À u principiu di a ricerca vulianu lascià Grafan accessibile da u situ web Falcon. Ma cuntene ancu e metriche di springboot da u rapportu di l'applicazione backend, chì ùn avemu micca avutu u tempu di sguassà, cusì avemu decisu di bluccà l'accessu. È ghjustu cusì - ancu à u principiu di a ricerca, certi attori anu indovinatu chì l'applicazione hè stata scritta in u framework Springboot è ancu scavà i nomi di certi servizii.

Hosting è bus di dati

Un strumentu per trasfiriri l'infurmazioni da u backend à u situ, u servitore VPS in quale RabbitMQ era in esecuzione.

U backend è u bus di dati sò stati mantenuti u nostru VPS. U so putere era paragunabile à l'urdinatore chì avete vistu nantu à u screnu: un VPS 2-core cù dui gigabyte di RAM. A tarifa hè stata pagata per i risorsi, postu chì a carica di punta hè stata pianificata per uni pochi di ghjorni - questu hè ciò chì i nostri clienti facenu chì pensanu à carricà VPS per un pocu tempu. Allora hè risultatu chì a carica era più altu ch'è no avemu aspittatu, è una tarifa fissa seria più prufittuosa. Sè vo fate una ricerca, sceglite i tariffi di linea turbo.

Per prutege u servitore da DDoSa, avemu usatu Cloudflare.

Hè vale à dì chì u VPS hà resistutu tuttu cun onore.

Arduino, chì era rispunsevuli di cuntrullà i relay, hà ricevutu cumandamenti da u traduttore è hà fattu u travagliu propiu

Questu hè più u tema di u prossimu articulu nantu à a parte hardware di u prughjettu: u backend simpricimenti mandatu richieste per accende un relay specificu. Hè accadutu chì u backend cunniscia quasi tutte e entità è e dumande da ellu parevanu "accende sta entità". Avemu fattu questu per a prova iniziale di u situ (ùn aviamu micca assemblatu tutti l'Arduino è i relay), à a fine avemu lasciatu tuttu cusì.

Frontend

Avemu criatu rapidamente u situ nantu à tilde, hà pigliatu un ghjornu di travagliu è ci hà salvatu 30 mila nantu à u nostru budgetu.

In u principiu, avemu pensatu à esse solu exportà u situ è ​​aghjunghje a logica chì ci mancava, ma avemu incuntratu in termini d'usu chì ci pruibitu di fà questu.

Ùn eramu micca pronti per violà a licenza, cusì ci era duie opzioni: per implementà tuttu noi stessu o per cuntattà Tilda direttamente, parlà di u prugettu è dumandà permessu di cambià u codice.

Avemu sceltu a seconda opzione è ùn sò micca solu scontru à a mità di strada, ma ancu ci hà datu un annu di cuntu cummerciale gratuitu, per quale li simu assai grati. Era assai sgradu di mostrà u disignu di u situ web di Sokol.

In u risultatu, avemu attaccatu a logica js à u frontend per mandà richieste à i dispositi elementari, è cambiatu pocu i stili di i buttoni per accende è disattiva l'elementi di u ghjocu.

Cuncepimentu di u situ

A storia di e ricerche, chì vale a pena un capitulu separatu.

Vulemu creà micca solu un situ anticu, ma un assolutamente disgustu chì viola tutte e regule basi di u disignu. À u listessu tempu, era impurtante di mantene a credibilità: ùn deve micca rumpia a storia ENT, dimustrà a pretensione di l'autore, è i ghjucatori anu da crede chì un tali situ puderia esiste è ancu portà i clienti. È l'hà purtatu ! Mentre u ghjocu era in corso, ci sò stati cuntattati duie volte per creà siti web.

À u principiu, aghju fattu u disignu stessu, pruvatu à include più gif è elementi brillanti. Ma u mo maritu di designer di 10 anni hà guardatu nantu à a so spalla è l'hà cacciatu cum'è "troppu bè". Per rompe e regule di cuncepimentu, avete bisognu di cunnosce.

Cumu hè statu creatu u backend di un ghjocu di pirate per a distruzzione di un servitore

Ci hè parechje cumminazzioni di culori chì evocanu un sensu di disgustu durabile: verde è rossu di uguali ricchezza, grisgiu è rosa, blu più marrone. In fine, avemu stallatu nantu à una cumminazione di rossu è verde cum'è i culori di basa, aghjunghjenu gif cù un gattu è selezziunate 3-4 ritratti di Sokolov stessu da una foto di stock. Aviu avutu solu uni pochi di esigenze: un omu di mezza età, chì portava un vestitu malatu un coppiu di dimensioni troppu grande è in una posa di "studiu prufessiunale". Per a prova, anu dimustratu à l'amichi è li dumandò "cumu ti piace?"

Durante u prucessu di sviluppu di cuncepimentu, u mo maritu avia da andà à stende ogni meza ora; l'elicotteru hà cuminciatu à vola. Pasha hà pruvatu à apre a cunsola di sviluppatore à a maiò parte di u screnu mentre finisci di finisce u frontend - per prutege l'ochji.

Dispositivi attuali

I fanali è e luci sò stati muntati attraversu relè à u statu solidu per ùn accende micca immediatamente à piena putenza - per chì a putenza aumenterà in parallelu cù u monitoraghju.

Ma parlemu di questu in u prossimu postu, nantu à a parti hardware di u ghjocu è a custruzzione attuale di u situ.

Resta attenti!

Altri articuli nantu à a ricerca di distrughje u servitore

Cumu hè statu creatu u backend di un ghjocu di pirate per a distruzzione di un servitore

Source: www.habr.com

Add a comment