Les tablettes et autres petits lecteurs multimédias qui permettent de visionner les films en DivX confortablement sur son canapé ont relégué au placard les gros Media Center qui ronronnaient bruyamment dans les salons. Si cette nouvelle solution a l'avantage d'être plus élégante et moins bruyante, elle ne règle pas tous les problèmes: il faut quand-même quelque part une vraie machine pour stocker la bibliothèque de films. Soit elle est toujours allumée, ce qui n'est pas très rationnel, soit il faut aller l'allumer et l'éteindre avant et après, ce qui tue un peu la magie. Alors, comment allumer un PC à distance depuis son canapé ?
Un ordinateur ne s'allume pas comme une ampoule, en commutant l'alimentation électrique avec un relais. L'alimentation électrique reste toujours partiellement sous tension, et le bouton d'allumage est en réalité un interrupteur "logique", géré intelligemment par le système d'exploitation pour protéger l'intégrité des disques. D'ailleurs, il y a même des mécanismes prévus pour piloter l'alimentation à distance. Petit tour d'horizon...
Les mécanismes d'allumage à distance "standards"
La méthode la plus ancienne s'appelle le "Wake-on-Lan" (WoL). L'alimentation électrique continue à fournir de l'électricité à la carte réseau, qui en échange va écouter sur le réseau pour y détecter un paquet magique qui sert à allumer le PC. Malheureusement cette méthode est très peu fiable. D'une part, la moindre irrégularité lors de la mise hors tension de la machine met la carte réseau dans un état où elle n'est plus capable d'écouter les paquets magiques. D'autre part, comme la carte réseau est purement passive, elle n'est pas capable de participer aux protocoles réseau standards comme ARP et DHCP, et après un court délai certains switchs réseau ne lui transmettent plus le moindre paquet.
Intel a introduit plus récemment une nouvelle méthode appelée AMT (Active Management Technology). Elle offre à la carte réseau un contrôle très étendu sur la machine, son alimentation, ses réglages et permet même une prise de contrôle à distance. Tout cela se fait à travers des protocoles complexes, cryptés pour assurer la sécurité nécessaire. Et naturellement, la mise en œuvre est complexe et possible que sur certaines machines, en général les modèles de marque destinés à la clientèle "entreprises". Donc pas très praticable pour une petite solution.
Une solution simple et efficace
Au final, la solution la plus générale et la plus simple, que nous retiendrons, consiste à monter en parallèle au bouton d'allumage un Yocto-Relay. Il n'est pas nécessaire d'utiliser un Yocto-PowerRelay puisque nous ne commuterons pas réellement l'alimentation du secteur, nous ne ferons que de simuler le signal "l'utilisateur à pressé le bouton Power".
On câble un Yocto-Relais piloté par un YoctoHub-Ethernet en parallèle avec le bouton du PC
Pour que nous puissions allumer le PC, nous ne pourrons pas nous contenter de brancher le relais par USB sur le PC. Il faut utiliser un YoctoHub-Ethernet, qui nous permettra de piloter le relais par le réseau de manière autonome. Au final, le montage est très simple:
YoctoHub-Ethernet + Yocto-Relay = Yocto-Relay-Ethernet
Nous allons voir maintenant comment faire une interface pour allumer le PC depuis un téléphone portable ou une tablette.
Une interface Web embarquée
Pour une tâche aussi simple que faire une impulsion sur un relais, il n'est pas nécessaire de faire une App dédiée pour Android ou iOS. Une simple interface Web en HTML/Javascript siffira. Nous allons même pouvoir l'héberger directement sur le YoctoHub-Ethernet.
Voilà le code HTML de l'interface Web. Pour pouvoir changer dynamiquement l'aspect du bouton en fonction de l'état allumé ou éteint, on a mis une image plus grande que le bouton lui-même, et on en change la position en fonction de la partie qu'on veut rendre visible. Cela peut se faire élégamment à l'aide d'un style CSS.
<head><title>Remote PC Power</title>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<meta name="viewport" content="width=320">
<script src="yoctolib.min.js"></script>
<script src="power.js"></script>
<style>
.magicButton {
background-image: url(button.gif);
background-repeat: no-repeat;
width: 160px;
height: 160px;
border: 0px;
}
.blink { background-position: 0px 0px; }
.off { background-position: -160px 0px; }
.on { background-position: -320px 0px; }
</style>
</head>
<body onload="initUI();">
<div style="text-align:center">
<button id="power" onclick="toggle()" class="magicButton blink"></button>
</div>
</body>
</html>
Et voilà maintenant le code JavaScript. Au démarrage, on veut "mesurer" si le PC est allumé pour mettre la bonne couleur au bouton. Mais pour s'éviter les frais d'un Yocto-Volt pour cette mesure, nous demandons simplement au YoctoHub-Ethernet de "pinger" le PC pour voir s'il répond.
function initUI()
{
if(YAPI.RegisterHub(location.host) != YAPI.SUCCESS) {
alert("Cannot connect to hub");
}
window.net = yFirstNetwork();
window.pwrButton = document.getElementById("power");
setTimeout(testPower,2000)
}
function setButton(str_mode)
{
window.pwrButton.className = "magicButton "+str_mode;
}
function testPower()
{
// on startup, determine the real state of the PC using a "ping"
var pingTest = net.ping(targetIP);
var is_on = (pingTest.indexOf("Round-trip") >= 0);
setButton(is_on ? "on" : "off");
}
function toggle()
{
// change the visible state of the button
var is_on = window.pwrButton.className.indexOf("off") < 0;
var newstate = (is_on ? "off" : "on");
setButton("blink");
setTimeout(function(){setButton(newstate);}, 3000);
// toggle the relay to do it for real
var relay = yFindRelay("power");
relay.pulse(500);
}
Nous pouvons maintenant héberger cette interface (fichier HTML, Js et images) directement sur le YoctoHub-Ethernet, ce qui le transforme littéralement en outil dédié. Pour ce faire, il suffit de cliquer sur le bouton manage files de l'interface de configuration du YoctoHub-Ethernet, et de charger les fichiers:
Vous pouvez charger vos propres interfaces HTML sur le YoctoHub-Ethernet
Le fichier yoctolib.min.js n'est que la concaténation de yocto_api.js, yocto_network.js et yocto_relay.js que nous avons ensuite passé à travers un optimiseur de code JavaScript pour le réduire à sa taille minimale, afin que cette page se charge aussi vite que possible.
Voilà le résultat:
La consommation du YoctoHub-Ethernet n'est que de 0,5W, ce qui rejoint les meilleures solutions de Wake-on-lan ou d'AMT. Simple et efficace...
La version présentée aujourd'hui a toutefois une limitation: comme nous avons mis l'interface Web directement sur le YoctoHub-Ethernet, elle n'est utilisable que depuis le réseau local. Si vous vouliez allumer votre PC depuis l'extérieur de chez vous, par exemple pour en prendre le contrôle ensuite avec une solution du type LogMeIn ou Ammy, il faudrait franchir la barrière du "NAT" de votre routeur DSL, qui vous protège normalement des intrusions. Avec le YoctoHub-Ethernet, c'est possible aussi. On vous donnera les détails dans un article suivant...