{"id":1751,"date":"2015-04-29T16:44:54","date_gmt":"2015-04-29T16:44:54","guid":{"rendered":"http:\/\/www.frozax.com\/blog\/?p=1751"},"modified":"2015-04-30T13:53:41","modified_gmt":"2015-04-30T13:53:41","slug":"commander-sa-freebox-dans-minecraft-inutile-donc-indispensable","status":"publish","type":"post","link":"https:\/\/www.frozax.com\/blog\/2015\/04\/commander-sa-freebox-dans-minecraft-inutile-donc-indispensable\/","title":{"rendered":"Commander sa Freebox dans Minecraft: Inutile, donc Indispensable!"},"content":{"rendered":"<p><a href=\"http:\/\/www.frozax.com\/blog\/2015\/04\/controlling-your-tv-using-minecraft-useless-but-fun\/\">English version<\/a><br \/>\nVoici un article \u00e0 propos de mon dernier projet annexe: commander sa Freebox dans Minecraft! Bon, ce n&#8217;est pas aussi pratique que d&#8217;utiliser la t\u00e9l\u00e9commande mais c&#8217;est int\u00e9ressant \u00e0 faire et \u00e7a fonctionne bien! \ud83d\ude42<br \/>\nVous pouvez le voir en action dans la vid\u00e9o, je d\u00e9taille ensuite la technique.<\/p>\n<p><iframe loading=\"lazy\" frameborder=\"0\" height=\"360\" src=\"http:\/\/www.youtube.com\/embed\/W9VVCVh9m2g?rel=0\" width=\"640\"><\/iframe><\/p>\n<h1>Comment \u00e7a marche ?<\/h1>\n<p>Les diff\u00e9rents composants de ce projet sont d\u00e9velopp\u00e9s en Python 3, et tournent sous Linux (Ubuntu).<br \/>\nC&#8217;est probablement facilement portable sur d&#8217;autres plateformes avec des modifications mineures.<br \/>\nVoici le fonctionnement dans le d\u00e9tail.<\/p>\n<h2>Contr\u00f4ler le Freebox Player<\/h2>\n<p><a href=\"http:\/\/www.frozax.com\/blog\/wp-content\/uploads\/2015\/04\/minecraft_free.png\"><img decoding=\"async\" loading=\"lazy\" src=\"http:\/\/www.frozax.com\/blog\/wp-content\/uploads\/2015\/04\/minecraft_free-150x150.png\" alt=\"minecraft_free\" width=\"150\" height=\"150\" class=\"alignleft size-thumbnail wp-image-1731\" \/><\/a><br \/>\nJ&#8217;ai d&#8217;abord d\u00e9velopp\u00e9 un client qui se fait passer pour une t\u00e9l\u00e9commande r\u00e9seau Freebox. Le protocole utilis\u00e9 est bas\u00e9 sur l&#8217;UDP. La <a href=\"http:\/\/dev.freebox.fr\/sdk\/\">documentation de ce protocole<\/a> est assez succinte et il est difficile de trouver des exemples fonctionnels.<br \/>\nJ&#8217;ai pu trouver une \u00e9bauche d&#8217;impl\u00e9mentation en Python faite par <a href=\"https:\/\/github.com\/MaximeCheramy\/remotefreebox\">Maxime Cheramy<\/a>. Ca m&#8217;a bien aid\u00e9 pour entrer dans le sujet de la programmation r\u00e9seau UDP et du protocole RUDP. J&#8217;ai \u00e9galement utilis\u00e9 l&#8217;<a href=\"https:\/\/github.com\/fbx\/foils_hid\/\">exemple en C<\/a> fourni par Free pour mieux comprendre la structure du format des paquets utilis\u00e9s pour envoyer les touches. J&#8217;ai captur\u00e9 les paquets UDP avec Wireshark et pris du temps pour \u00e9crire un dissecteur pour Wireshark \u00e0 l&#8217;aide du plugin <a href=\"http:\/\/wsgd.free.fr\/\">WSGD<\/a>.<br \/>\nLa derni\u00e8re version du code Python, ainsi que le dissecteur Wireshark sont disponibles sur <a href=\"https:\/\/github.com\/frozax\/remotefreebox\">mon Github publique<\/a>.<\/p>\n<h2>Contr\u00f4ler le serveur Minecraft<\/h2>\n<p><a href=\"http:\/\/www.frozax.com\/blog\/wp-content\/uploads\/2015\/04\/grass.png\"><img decoding=\"async\" loading=\"lazy\" src=\"http:\/\/www.frozax.com\/blog\/wp-content\/uploads\/2015\/04\/grass-150x150.png\" alt=\"grass\" width=\"150\" height=\"150\" class=\"alignleft size-thumbnail wp-image-1733\" \/><\/a><br \/>\nJ&#8217;utilise le server Minecraft officiel (en Java). J&#8217;ai \u00e9crit une classe Python me permettant d&#8217;envoyer des commandes au serveur et d&#8217;interpr\u00e9ter la r\u00e9ponse. C&#8217;est pas sp\u00e9cialement tr\u00e8s robuste mais \u00e7a suffit pour cette utilisation.<br \/>\nComme j&#8217;utilise <a href=\"http:\/\/fr.wikipedia.org\/wiki\/Tmux\">tmux<\/a>, je peux facilement trouver le process du server avec <code>tmux list-panes<\/code>, envoyer des commandes avec <code>tmux send-keys<\/code> et lire la r\u00e9ponse du serveur avec <code>tmux capture-pane<\/code>.<br \/>\nLa derni\u00e8re version du code est <a href=\"https:\/\/github.com\/frozax\/my-python-packages\/blob\/master\/minecraft.py\">disponible ici (minecraft.py)<\/a>.<\/p>\n<h2>D\u00e9tecter les actions du joueur<\/h2>\n<p>Dans le monde Minecraft que j&#8217;ai cr\u00e9\u00e9 pour l&#8217;occasion, chaque bouton de la t\u00e9l\u00e9commande virtuelle est connect\u00e9 \u00e0 un <a href=\"http:\/\/minecraft.gamepedia.com\/Command_Block\">bloc de commande<\/a>, comme vous pouvez le voir dans la capture d&#8217;\u00e9cran ci-dessous.<br \/>\n<a href=\"http:\/\/www.frozax.com\/blog\/wp-content\/uploads\/2015\/04\/minecraft_remote.png\"><img decoding=\"async\" loading=\"lazy\" src=\"http:\/\/www.frozax.com\/blog\/wp-content\/uploads\/2015\/04\/minecraft_remote-300x169.png\" alt=\"minecraft_remote\" width=\"300\" height=\"169\" class=\"aligncenter size-medium wp-image-1729\" srcset=\"https:\/\/www.frozax.com\/blog\/wp-content\/uploads\/2015\/04\/minecraft_remote-300x169.png 300w, https:\/\/www.frozax.com\/blog\/wp-content\/uploads\/2015\/04\/minecraft_remote.png 852w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><br \/>\nLes commandes associ\u00e9es assignent un nombre \u00e0 une &#8220;r\u00e8gle de jeu&#8221; Minecraft avec <code>gamerule set remote &lt;value&gt;<\/code>. Un script v\u00e9rifie r\u00e9guli\u00e8rement l&#8217;\u00e9tat de cette variable et si il change, effectue les actions suivantes:<\/p>\n<ul>\n<li>Conversion de la valeur de la variable en une touche (\u00e0 l&#8217;aide d&#8217;un fichier de configuration .json)<\/li>\n<li>Envoi de la touche par le r\u00e9seau \u00e0 la Freebox, gr\u00e2ce \u00e0 la classe <code>FreeboxController<\/code><\/li>\n<li>Utilisation d&#8217;autres commandes de Minecraft pour changer le fond de la &#8220;grosse&#8221; t\u00e9l\u00e9commande du monde virtuel, gr\u00e2ce \u00e0 la classe <code>MinecraftServer<\/code><\/li>\n<\/ul>\n<p>Comme toujours, le code est disponible <a href=\"https:\/\/github.com\/frozax\/fbx-minecraft\">sur Github<\/a>.<\/p>\n<p>voil\u00e0, j&#8217;esp\u00e8re que vous avez aim\u00e9 cet article (le premier en Fran\u00e7ais, et le premier depuis deux ans&#8230;).<br \/>\nN&#8217;h\u00e9sitez pas \u00e0 partager, commenter ou me contacter \u00e0 <a href=\"http:\/\/twitter.com\/Frozax\">@Frozax<\/a>!<\/p>\n<div class=\"addtoany_share_save_container addtoany_content_bottom\"><div class=\"a2a_kit a2a_kit_size_32 addtoany_list a2a_target\" id=\"wpa2a_1\"><a class=\"a2a_button_twitter\" href=\"http:\/\/www.addtoany.com\/add_to\/twitter?linkurl=https%3A%2F%2Fwww.frozax.com%2Fblog%2F2015%2F04%2Fcommander-sa-freebox-dans-minecraft-inutile-donc-indispensable%2F&amp;linkname=Commander%20sa%20Freebox%20dans%20Minecraft%3A%20Inutile%2C%20donc%20Indispensable%21\" title=\"Twitter\" rel=\"nofollow\" target=\"_blank\"><\/a><a class=\"a2a_button_facebook\" href=\"http:\/\/www.addtoany.com\/add_to\/facebook?linkurl=https%3A%2F%2Fwww.frozax.com%2Fblog%2F2015%2F04%2Fcommander-sa-freebox-dans-minecraft-inutile-donc-indispensable%2F&amp;linkname=Commander%20sa%20Freebox%20dans%20Minecraft%3A%20Inutile%2C%20donc%20Indispensable%21\" title=\"Facebook\" rel=\"nofollow\" target=\"_blank\"><\/a><a class=\"a2a_button_google_plus\" href=\"http:\/\/www.addtoany.com\/add_to\/google_plus?linkurl=https%3A%2F%2Fwww.frozax.com%2Fblog%2F2015%2F04%2Fcommander-sa-freebox-dans-minecraft-inutile-donc-indispensable%2F&amp;linkname=Commander%20sa%20Freebox%20dans%20Minecraft%3A%20Inutile%2C%20donc%20Indispensable%21\" title=\"Google+\" rel=\"nofollow\" target=\"_blank\"><\/a><a class=\"a2a_button_reddit\" href=\"http:\/\/www.addtoany.com\/add_to\/reddit?linkurl=https%3A%2F%2Fwww.frozax.com%2Fblog%2F2015%2F04%2Fcommander-sa-freebox-dans-minecraft-inutile-donc-indispensable%2F&amp;linkname=Commander%20sa%20Freebox%20dans%20Minecraft%3A%20Inutile%2C%20donc%20Indispensable%21\" title=\"Reddit\" rel=\"nofollow\" target=\"_blank\"><\/a>\n<script type=\"text\/javascript\"><!--\nwpa2a.script_load();\n\/\/--><\/script>\n<\/div><\/div>","protected":false},"excerpt":{"rendered":"<p>English version Voici un article \u00e0 propos de mon dernier projet annexe: commander sa Freebox dans Minecraft! Bon, ce n&#8217;est pas aussi pratique que d&#8217;utiliser la t\u00e9l\u00e9commande mais c&#8217;est int\u00e9ressant \u00e0 faire et \u00e7a fonctionne bien! \ud83d\ude42 Vous pouvez le voir en action dans la vid\u00e9o, je d\u00e9taille ensuite la technique. Comment \u00e7a marche ?&hellip; <a class=\"more-link\" href=\"https:\/\/www.frozax.com\/blog\/2015\/04\/commander-sa-freebox-dans-minecraft-inutile-donc-indispensable\/\">Continue reading <span class=\"screen-reader-text\">Commander sa Freebox dans Minecraft: Inutile, donc Indispensable!<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[12],"tags":[148,147,146],"_links":{"self":[{"href":"https:\/\/www.frozax.com\/blog\/wp-json\/wp\/v2\/posts\/1751"}],"collection":[{"href":"https:\/\/www.frozax.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.frozax.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.frozax.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.frozax.com\/blog\/wp-json\/wp\/v2\/comments?post=1751"}],"version-history":[{"count":3,"href":"https:\/\/www.frozax.com\/blog\/wp-json\/wp\/v2\/posts\/1751\/revisions"}],"predecessor-version":[{"id":1754,"href":"https:\/\/www.frozax.com\/blog\/wp-json\/wp\/v2\/posts\/1751\/revisions\/1754"}],"wp:attachment":[{"href":"https:\/\/www.frozax.com\/blog\/wp-json\/wp\/v2\/media?parent=1751"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.frozax.com\/blog\/wp-json\/wp\/v2\/categories?post=1751"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.frozax.com\/blog\/wp-json\/wp\/v2\/tags?post=1751"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}