Il y a quelques semaines, nous avons mené une quête en ligne de pirates informatiques : nous avons construit une salle, l'avons remplie d'appareils intelligents et avons lancé une diffusion YouTube à partir de celle-ci. Les joueurs pouvaient contrôler les appareils IoT à partir du site de jeu; le but était de trouver l'arme cachée dans la pièce (un puissant pointeur laser), de la pirater et de court-circuiter la pièce.
Pour ajouter une intrigue passionnante, nous avons mis un broyeur dans la pièce, dans lequel nous avons chargé 200 000 roubles: le broyeur mangeait une facture par heure. Après avoir remporté le jeu, il était possible d'arrêter la déchiqueteuse et de prendre tout l'argent restant.
Nous avons déjà décrit le passage du jeu , ainsi que la manière dont le backend du projet a été réalisé . Il est temps de vous parler du matériel et de son déroulement.
Il y a eu beaucoup de demandes pour montrer le moment du nettoyage de la chambre - nous montrons comment nous la démontons
Architecture de fer: contrôle de la pièce
Nous avons commencé à concevoir la solution matérielle lorsque le scénario était déjà à peu près clair, le backend était prêt et nous avions une salle vide prête pour l'installation de l'équipement.
Rappelant la vieille blague "Le S dans l'IoT signifie Sécurité" ("La lettre S dans l'abréviation IoT signifie Sécurité"), nous avons décidé que cette fois, les joueurs du scénario de jeu interagissent uniquement avec le front-end et le back-end du site, mais n'ont pas l'opportunité d'obtenir directement à la glande.
Cela a été fait pour des raisons de sécurité et de divertissement de ce qui se passe à l'écran: avec l'accès direct des joueurs au matériel, il serait beaucoup plus difficile d'isoler les actions sûres et potentiellement dangereuses, par exemple, accélérer le broyeur ou contrôler la pyrotechnie.
Avant de commencer la conception, nous avons formulé plusieurs principes de contrôle des appareils de jeu, qui sont devenus la base de la conception:
N'utilisez pas de solutions sans fil
L'espace de jeu entier est dans une seule image, chaque coin que vous pouvez atteindre. Il n'y avait pas vraiment besoin de connexions sans fil et elles deviendraient simplement un autre point de défaillance.
N'utilisez aucun appareil spécial de la maison intelligente
Surtout dans un souci de flexibilité de personnalisation. Il est clair qu'il est possible de personnaliser de nombreuses versions en boîte de systèmes de maison intelligente avec un panneau d'administration et un contrôle prêts à l'emploi pour notre tâche, mais les coûts de main-d'œuvre seraient comparables à la création de votre propre solution simple.
De plus, il était nécessaire de proposer des dispositifs qui montreraient clairement ce que exactement les joueurs changent d'état: allumer / éteindre ou mettre une lumière spécifique sur les lettres FALCON.
Nous avons rassemblé tous les éléments du fer à repasser accessible au public, qui peut être acheté dans les magasins de pièces de radio habituels: entre la livraison de pizza et de Coca light, les courriers Chip and Deep et Leroy sont constamment venus sur le site.
Le choix de tout assembler par nous-mêmes simplifiait le débogage, l'évolutivité, cependant, exigeait plus de précision lors de l'installation.
Tous les relais et arudino ne doivent pas être visibles dans le cadre
Nous avons décidé de rassembler tous les éléments contrôlables en un seul endroit et de les cacher dans les coulisses afin de pouvoir surveiller les performances et, si nécessaire, de ramper proprement hors du champ de vision de la caméra et de remplacer l'unité défaillante.
En conséquence, tout a été caché sous la table et la caméra a été installée de sorte que rien ne puisse être vu sous la table. C'était notre "angle
mort " pour l'exploration de l'ingénieur. D'un point de vue matériel, cet appareil contrôlait 6 éléments:
- Plusieurs lampes de table, elles ont un état marche / arrêt et sont contrôlées par les joueurs
- Lettres sur le mur, ils peuvent changer de couleur à la commande des joueurs
- Des ventilateurs qui tournent et ouvrent le paperboard lorsque le serveur est sous charge
- Laser contrôlé par PWM
- Le déchiqueteur qui a mangé de l'argent selon un horaire
- Une machine à fumée qui s'est déclenchée avant chaque tir laser
Nous testons la machine à fumée avec le laser.
Plus tard, une lumière de scène a été ajoutée, qui se tenait derrière le cadre et était contrôlée exactement comme les lampes du point 1. La lumière de la scène a été déclenchée dans deux cas: elle éclairait le laser lorsque la puissance était appliquée et éclairait le poids avant que le laser ne soit lancé au combat. mode.
Quel était cet appareil intelligent?
Nous nous sommes finalement retrouvés avec un appareil intelligent: il a reçu l'état de chacune de ses parties du backend et l'a changé avec la commande appropriée.
On a supposé qu'un simple script s'exécuterait sur l'ordinateur qui reçoit json avec l'état des périphériques et l'envoie à l'arduinka connecté via USB. Plus tard, cet ordinateur a été remplacé par rasberry, il a été connecté au backend à cause de nat.
Connecté aux ports:
- 16 relais conventionnels (ce sont eux qui ont produit le cliquetis entendu dans la vidéo. Nous les avons principalement choisis à cause de ce son)
- 4 relais à semi-conducteurs pour contrôler les canaux PWM tels que les ventilateurs,
- sortie PWM séparée pour laser
- sortie qui forme un signal vers la bande LED
Voici un exemple de commande json qui est arrivée au relais depuis le serveur
{"power":false,"speed":0,"period":null,"deviceIdentifier":"FAN"}
Et ceci est un exemple de la fonction avec laquelle l'équipe est arrivée à Arudino
def callback(ch, method, properties, body):
request = json.loads(body.decode("utf-8"))
print(request, end="\n")
send_to_serial(body)
Pour suivre le moment où le laser brûle enfin la corde et que le poids s'envole vers l'aquarium, nous avons créé un petit bouton qui a déclenché la chute du poids et donné un signal au système.
Contrôle des boutons du mouvement du kettlebell
À ce signal, des bombes fumigènes constituées de balles de ping-pong devraient s'être allumées. Nous avons placé 4 évents de fumée directement dans le boîtier du serveur et leur avons apporté un fil nichrome, qui était censé chauffer et fonctionner comme un fusible.
Corps avec bombes fumigènes et guirlande chinoise
Arduino
Sur l'arduinka, selon le plan initial, deux actions ont eu lieu.
Tout d'abord, lorsqu'une nouvelle demande était reçue, la demande était analysée à l'aide de la bibliothèque ArduinoJson. De plus, plusieurs de ses propriétés étaient associées à chaque appareil contrôlé:
- «» «» ( )
- , ( JSON , , )
- PWM ,
- , . 587 . , , , . .
La dernière fois a été définie lorsque le paramètre correspondant a été reçu dans JSON, mais il n'a pas pu être transmis, puis la valeur a été définie sur 0 et la remise à zéro n'a pas eu lieu.
La deuxième action que l'arduinka effectuait à chaque cycle était l'actualisation des états, c'est-à-dire la vérification s'il était nécessaire d'allumer quelque chose ou s'il était temps d'éteindre un appareil.
Pointeur laser - le même Megatron 3000
Il s'agit d'un module laser conventionnel pour la découpe et le marquage de mise au point manuelle LSMVR450-3000MF 3000mW 450nm.
Lettres de faucon
C'est très simple - nous avons simplement copié les lettres du logo, les avons découpées dans du carton, puis collées avec du ruban adhésif. Dans ce cas, il était nécessaire de souder des morceaux de ruban adhésif ensemble, 4 contacts à chaque couture, mais le résultat en valait la peine. Notre backend Pacha a montré des miracles de compétence, le faisant en moins de quelques heures.
Premiers tests de l'appareil iot et finition
Nous avons fait les premiers tests et en même temps nous avons eu de nouveaux problèmes. Le fait est qu'au milieu du processus, un véritable producteur de films et caméraman de VGIK, Ilya Serov, a rejoint l'équipe - il a construit le cadre, ajouté un éclairage cinématographique supplémentaire et légèrement modifié le scénario du jeu afin que l'intrigue soit plus émotionnelle et que l'image soit plus dramatique et théâtrale.
Cela a considérablement augmenté la qualité, mais il y avait des éléments qui devaient également être connectés au relais et l'algorithme de fonctionnement a été prescrit.
Le laser s'est avéré être un autre problème: nous avons fait plusieurs expériences avec différents types de cordes et de lasers de différentes puissances. Pour le test, nous avons simplement accroché la charge verticalement sur une corde.
Lors du lancement avec un jeton de test, la puissance réglable via le PWM était inférieure à 10% et la corde ne s'est pas endommagée même après une exposition prolongée.
Pour le mode combat, le laser a été défocalisé à environ un endroit d'un diamètre de 10 mm et il a brûlé avec confiance à travers la corde avec une charge à une distance d'environ un mètre.
Le laser a donc parfaitement fonctionné lors des tests:
lorsque nous avons déjà commencé à tout tester directement dans la pièce sur un poids suspendu, il s'est avéré qu'il n'était pas si facile de fixer le laser en toute sécurité. Ensuite, lorsque la corde est en feu, elle fond, s'étire et se déplace sous le foyer d'origine.
Mais c'est ainsi que cela ne fonctionnait plus: la corde a été déplacée
.
Après avoir mené quelques expériences supplémentaires avec la corde brûlée déjà au combat, nous avons décidé de ne pas torturer le destin et d'assurer la coupe de la corde avec du fil nichrome. Elle a détruit le fil 120 secondes après avoir allumé le laser en mode combat. Ceci, ainsi que la déconnexion du fil et le fusible des bombes fumigènes lorsque le contact de rupture est déclenché, nous avons décidé de coder en dur directement dans le matériel du microcontrôleur.
Le fil, qui a fini par brûler la corde hors de
l'écran.Ainsi, une troisième tâche est apparue que l'arduinka a résolu - élaborer les séquences associées à l'exécution de ces commandes.
Nous avons également décidé de donner Raspberry, qui envoyait simplement du JSON ad hoc reçu du backend, et la nécessité de garder une trace de l'argent sur le téléviseur et d'exécuter le destructeur. Initialement, on supposait que le backend le ferait et que le solde actuel serait visible sur le site, et sur la télévision, nous afficherions les commentaires de YouTube comme un élément interactif supplémentaire incitant les téléspectateurs à ce que les événements dans la salle se déroulent en temps réel.
Mais pendant le test, Ilya a regardé la scène et a suggéré d'afficher l'équilibre du jeu sur le plus grand écran: combien d'argent restait, combien a été mangé et le compte à rebours jusqu'au prochain démarrage de la déchiqueteuse.
Nous avons lié le Raspberry à l'heure actuelle: toutes les heures complètes, le broyeur était démarré. L'image a été affichée sur le téléviseur à l'aide de la framboise, qui à ce moment-là recevait déjà les demandes du serveur et les envoyait pour exécution à l'arduinka. Des images avec des indicateurs monétaires ont été dessinées à l'aide de l'appel de l'utilitaire de console fim comme celui-
image = subprocess.Popen(["fim", "-q", "-r", "1920×1080", fim_str]), fim_str
ci.
Nous avons généré les images à l'avance: nous venons de prendre la vidéo finale avec un minuteur et d'exporter 200 images.
C'est la mécanique qui a été programmée dans la quête. Au moment où le compte à rebours final a commencé, nous nous sommes tous rendus sur le site, nous nous sommes armés d'extincteurs et nous nous sommes assis pour attendre le feu (qui a brûlé avec force et principal uniquement dans la discorde)
Comment faire une diffusion qui fonctionne pendant une semaine: choisir une caméra
Pour la quête, nous avions besoin d'une diffusion continue sur YouTube pendant 7 jours - c'est ce que nous avons fixé comme durée maximale du jeu. Deux choses pouvaient nous gêner:
- Surchauffe de la chambre due à un fonctionnement continu
- Internet coupé
La caméra devait donner au moins une image Full HD pour pouvoir jouer et observer confortablement la pièce.
Au départ, nous avons regardé dans la direction des webcams qui sont libérées pour les streamers. Nous avons réduit le budget, nous ne voulions donc pas acheter d'appareil photo, mais il s'est avéré qu'ils ne sont pas disponibles à la location. Au même moment, nous avons miraculeusement trouvé la caméra Xbox Kinect gisant dans ma maison, l'avons mise dans la pièce et avons commencé un test de diffusion pendant une semaine.
L'appareil photo s'est bien comporté et n'a pas surchauffé, mais Ilya a presque immédiatement remarqué qu'il manquait de réglages, en particulier, il était impossible de régler l'exposition.
Ilya s'est efforcé de rapprocher le type de diffusion des normes de la production cinématographique et vidéo: pour transmettre une scène lumineuse changeante de manière dynamique avec des sources de lumière brillantes, un fond sombre et des objets dans le cadre. En même temps, je souhaitais préserver l'élaboration de l'image aussi bien dans les hautes lumières que dans les ombres, avec un bruit numérique minimal.
Par conséquent, bien que le kinect se soit avéré fiable dans les tests et ne nécessitait pas de carte de capture vidéo (autre point de défaillance), nous avons décidé de l'abandonner. Après trois jours de test de différents appareils photo, Ilya a choisi le Sony FDR-AX53 - un petit caméscope fiable, abordable à la location, mais offrant en même temps une fiabilité et des caractéristiques visuelles suffisantes.
Nous avons loué une caméra, l'avons allumée pendant une semaine en conjonction avec une carte de capture vidéo et avons réalisé qu'avec elle, nous pouvons compter sur une diffusion continue tout au long de la quête.
:
Travailler sur l'éclairage exigeait une certaine grâce, il nous fallait construire une partition lumineuse avec des moyens minimes:
1. Illumination des objets lorsqu'ils sont trouvés par les joueurs (laser, poids), ainsi qu'une lumière constante sur le broyeur. Ici, nous avons utilisé dedolight 150 - des appareils d'éclairage de cinéma fiables et compacts avec des lampes halogènes basse tension, qui vous permettent de focaliser le faisceau sur un objet spécifique, sans toucher l'arrière-plan et d'autres objets.
2. Lampe de jeu pratique - lampe de table, lampadaire, étoile, guirlande. Toute la lumière pratique était harmonieusement répartie dans le cadre pour éclairer sa zone de l'image, à l'intérieur il y avait des lampes à LED avec une température de couleur de 3200K, la lampe du lampadaire était recouverte d'un filtre en folium Rosco rouge pour créer un accent de couleur inhabituel.
Je suis ingénieur avec ma maman ou je lance demain
Comment nous avons sauvegardé Internet et l'électricité
La question de la tolérance aux pannes a été abordée presque comme dans un data center: ils ont décidé de ne pas s'écarter des principes de base et ont réservé selon le schéma N + 1 habituel.
Si la diffusion sur YouTube s'arrête, cela signifie qu'il sera impossible de se reconnecter en utilisant le même lien et de continuer le flux. C'était un moment critique et la pièce était dans un bureau ordinaire.
Pour cela, nous avons utilisé un routeur basé sur OpenWRT et le package mwan3. Il testait automatiquement la disponibilité du canal toutes les 5 secondes et, en cas de rupture, passait au modem de secours de Yota. Par conséquent, le passage au canal de secours a pris moins d'une minute.
Il était également tout aussi important d'exclure les pannes de courant, car même une surtension à court terme entraînerait le redémarrage de tous les ordinateurs.
Nous avons donc choisi l'alimentation sans coupure ippon innova g2 3000, qui aurait sauvegardé tous les appareils de jeu: la consommation totale d'énergie de notre système était d'environ 300 watts. Cela suffirait pour 75 minutes, assez pour nos besoins.
Nous avons décidé de sacrifier un éclairage supplémentaire en cas de panne d'électricité dans la pièce - elle n'était pas connectée à une alimentation sans coupure.
Remerciements
- À toute l'équipe RUVDS , qui a inventé et mis en œuvre le jeu.
- Séparément pour les administrateurs RUVDS, pour surveiller le travail des serveurs, la charge était acceptable et tout fonctionnait normalement en mode normal.
- Au meilleur patron ntsaplinpour le fait qu'en réponse à l'appel "il y a une idée: on va prendre un serveur, mettre un aquarium dessus, et accrocher un poids dessus, boum, boum, tout est inondé d'eau, court-circuit, feu!" il dit toujours avec confiance "fais-le!"
- Tilda Publishing , - , .
- S_ILya , , , , , .
- zhovner , , , , .
- samat , , .
- daniemilk .
- delfphe .
- Dodo Pizza Engineering .
Et la plus grande gratitude va aux joueurs pour toutes les émotions que nous avons vécues pendant que vous avez pris d'assaut la quête sans dormir pendant deux jours et même reporté le travail.
Autres articles sur la quête avec la destruction du serveur
- Début du jeu
- Premier indice
- Qui a arrêté le destructeur ou comment il était nécessaire de terminer la quête avec la destruction du serveur
- Backend d'un jeu de hackers