Commander sa Freebox dans Minecraft: Inutile, donc Indispensable!

English version
Voici un article à propos de mon dernier projet annexe: commander sa Freebox dans Minecraft! Bon, ce n’est pas aussi pratique que d’utiliser la télécommande mais c’est intéressant à faire et ça fonctionne bien! 🙂
Vous pouvez le voir en action dans la vidéo, je détaille ensuite la technique.

Comment ça marche ?

Les différents composants de ce projet sont développés en Python 3, et tournent sous Linux (Ubuntu).
C’est probablement facilement portable sur d’autres plateformes avec des modifications mineures.
Voici le fonctionnement dans le détail.

Contrôler le Freebox Player

minecraft_free
J’ai d’abord développé un client qui se fait passer pour une télécommande réseau Freebox. Le protocole utilisé est basé sur l’UDP. La documentation de ce protocole est assez succinte et il est difficile de trouver des exemples fonctionnels.
J’ai pu trouver une ébauche d’implémentation en Python faite par Maxime Cheramy. Ca m’a bien aidé pour entrer dans le sujet de la programmation réseau UDP et du protocole RUDP. J’ai également utilisé l’exemple en C fourni par Free pour mieux comprendre la structure du format des paquets utilisés pour envoyer les touches. J’ai capturé les paquets UDP avec Wireshark et pris du temps pour écrire un dissecteur pour Wireshark à l’aide du plugin WSGD.
La dernière version du code Python, ainsi que le dissecteur Wireshark sont disponibles sur mon Github publique.

Contrôler le serveur Minecraft

grass
J’utilise le server Minecraft officiel (en Java). J’ai écrit une classe Python me permettant d’envoyer des commandes au serveur et d’interpréter la réponse. C’est pas spécialement très robuste mais ça suffit pour cette utilisation.
Comme j’utilise tmux, je peux facilement trouver le process du server avec tmux list-panes, envoyer des commandes avec tmux send-keys et lire la réponse du serveur avec tmux capture-pane.
La dernière version du code est disponible ici (minecraft.py).

Détecter les actions du joueur

Dans le monde Minecraft que j’ai créé pour l’occasion, chaque bouton de la télécommande virtuelle est connecté à un bloc de commande, comme vous pouvez le voir dans la capture d’écran ci-dessous.
minecraft_remote
Les commandes associées assignent un nombre à une “règle de jeu” Minecraft avec gamerule set remote <value>. Un script vérifie régulièrement l’état de cette variable et si il change, effectue les actions suivantes:

  • Conversion de la valeur de la variable en une touche (à l’aide d’un fichier de configuration .json)
  • Envoi de la touche par le réseau à la Freebox, grâce à la classe FreeboxController
  • Utilisation d’autres commandes de Minecraft pour changer le fond de la “grosse” télécommande du monde virtuel, grâce à la classe MinecraftServer

Comme toujours, le code est disponible sur Github.

voilà, j’espère que vous avez aimé cet article (le premier en Français, et le premier depuis deux ans…).
N’hésitez pas à partager, commenter ou me contacter à @Frozax!