Suite de notre série sur le développement d'un serveur alternatif pour faire fonctionner les Nabaztag.
Jusque là, nous avons vu comment le lapin bootait et comment il s'identifiait sur le serveur.
Voyons à présent comment la lapin communique avec le serveur, et surtout, comment lui parler.
Toute la communication lapin <-> serveur se fait à base d'une version édulcorée du XMPP, comme nous avons pu le voir précédemment.
Dans le précédent article, un message est resté "obscur" : celui pour définir l'état par défaut du lapin à la fin du boot :
<iq from='net.violet.platform@xmpp.nabaztag.com/sources' to='0013d384535a@xmpp.nabaztag.com/boot' id='3' type='result'>
<query xmlns='violet:iq:sources'>
<packet xmlns='violet: packet' format='1.0' ttl='604800'>
fwQAAAx////+BAAFAA7/CAALAAABAP8=
</packet>
</query>
</iq>
Vous aurez surement reconnu du Base64 dans le contenu du paquet. Cependant, le décoder ne vous apportera pas grand chose en l'état, le message n'étant pas lisible tel quel.
Amusons-nous à le convertir en Hexadécimal :
7f0400000c7ffffffe040005000eff08000b00000100ff
Nous avons donc là quelque chose de plus exploitable. Si si, croyez-moi :)
Prenons un autre exemple. Un message type pour faire bouger les oreilles des lapins :
fwQAAAh////+BAsFB/8=
Une fois décodé, nous obtenons la séquence hexadécimale suivante :
7f040000087ffffffe040b0507ff
N'y a-t-il pas comme un air de ressemblance ?
En fait , tous les messages du lapin sont encodés selon le schéma suivant :
7F AA BB BB BB DATA FF
Les parties fixes sont ici l'en-tête du paquet (7F) et la fin du paquet (FF).
AA correspond au type de message envoyé, dans la liste suivante :
Les Ambient Blocks sont les paquets qui définissent l'état du lapin, au niveau de ses oreilles et de ses couleurs (sur le ventre, la couleur de la base étant définie durant le processus de boot, dans le bc-nomimal)
Les Message Block véhiculent les actions à faire effectuer au lapin (lire un MP3, etc)
Nous reviendrons sur ces deux types un peu plus tard.
Viennent ensuite les 3 octets suivants BB BB BB. Il s'agit en fait de la taille des données passées (DATA) codée sur 3 octets. Ainsi, sur le message :
>7f 04 00 00 08 7f ff ff fe 04 0b 05 07 ff
La partie DATA est identifiée comme étant codée sur 8 octets.
Ambient Blocks
Voyons à présent les Ambient Blocks.
La partie fixe, comme vu précédemment, à tous les Ambient Block est la suivante :
7f 04 XX XX XX DATA ff
Voyons la partie DATA :
Elle est toujours de la forme :
7F FF FF FE n*( AA BB ) FF
7F FF FF FE étant l'en-tête des données, et FF la fin, la partie variable étant schématisée ici par n fois AA BB, le couple AA BB étant un service et sa valeur.
Un service ? Oui en effet, les Ambient Block sont répartis en services, codés sur AA.
Voici la liste des services :
Chacun de ces services peut donc ainsi recevoir une valeur. Reprenons notre exemple de tout à l'heure :
7f040000087ffffffe040b0507ff
Le corps du message est donc : 04 0b 05 07. Ainsi, si l'on se réfère à la liste ci-dessus, nous passons la valeur 0b à l'oreille gauche, et 07 à l'oreille droite.
Ca vous semble plus clair à présent ? :)
Voici la liste des valeurs acceptables pour les différents services :
// Values for weather define('AMBIENT_WEATHER_SUNNY', '00'); define('AMBIENT_WEATHER_CLOUDY', '01'); define('AMBIENT_WEATHER_SMOG', '02'); define('AMBIENT_WEATHER_RAIN', '03'); define('AMBIENT_WEATHER_SNOW', '04'); define('AMBIENT_WEATHER_STORM', '05');
// Values for stockmarket define('AMBIENT_STOCKMARKET_HIGHDOWN', '00'); define('AMBIENT_STOCKMARKET_MEDIUMDOWN','01'); define('AMBIENT_STOCKMARKET_LITTLEDOWN','02'); define('AMBIENT_STOCKMARKET_STABLE', '03'); define('AMBIENT_STOCKMARKET_LITTLEUP', '04'); define('AMBIENT_STOCKMARKET_MEDIUMUP', '05'); define('AMBIENT_STOCKMARKET_HIGHUP', '06'); // Values for traffic define('AMBIENT_TRAFFIC_100', '00'); define('AMBIENT_TRAFFIC_75', '01'); define('AMBIENT_TRAFFIC_50', '02'); define('AMBIENT_TRAFFIC_25', '03'); define('AMBIENT_TRAFFIC_12', '04'); define('AMBIENT_TRAFFIC_8', '05'); define('AMBIENT_TRAFFIC_4', '06'); // Values for email define('AMBIENT_EMAIL_0', '00'); define('AMBIENT_EMAIL_1', '01'); define('AMBIENT_EMAIL_2', '02'); define('AMBIENT_EMAIL_3MORE', '03');
// Values for air define('AMBIENT_AIR_GOOD', '00'); define('AMBIENT_AIR_MEDIUM' '05'); define('AMBIENT_AIR_LOW', '08'); // Values for nose define('AMBIENT_NOSE_DISABLE', '00'); define('AMBIENT_NOSE_BLINK', '01'); define('AMBIENT_NOSE_DOUBLEBLINK', '02');
Pour les oreilles, les valeurs acceptables vont de 0 à 16 (à convertir en hexadécimal bien sur). Pour le Taïchi, de 0 à 255 (255 étant une fréquence élevée de Taïchi). Enfin, pour disable, il suffit de passer l'identifiant de service en paramètre pour le désactiver.
Avec ceci, vous êtes désormais en mesure d'interagir avec les différents services de notifications visuels du lapin :)
Message Blocks
La partie Message block est un tout petit peu moins triviale. En effet, les messages sont encodés selon un algorithme qui rend leur déchiffrage un peu moins évident.
Voici, par exemple, un paquet qui lira un MP3 sur votre lapin
fwoAADUA+v6Pl2ODH6nCYJ7itcUUAUc9FD9fHQnhWXl5eTLif8IonHIF3+FkEALciWmyPXTmOYB/wv8K
Décodé puis passé en hexadécimal, nous récupérons :
7f0a00003500fafe8f9763831fa9c2609ee2b5c51401473d143f5f1d09e15979797932e27fc2289c720
5dfe1641002dc8969b23d74e639807fc2ff
Nous avons donc l'entête (7F), le type Message Block (0A), la taille du message (00 00 35) et la fin de message (FF)
Il nous reste donc la séquence suivante, qui correspond aux données du message :
00fafe8f9763831fa9c2609ee2b5c51401473d143f5f1d09e15979797932e27fc2289c7205dfe164100
2dc8969b23d74e639807fc2
Le 00 du début est commun à tous les messages.
L'algorithme qui code le message le suivant :
C\[i\] = (B\[i\] - 0x2F) * (1 + 2 * C\[i-1\])
Où C\[-1\] = 35, C est le tableau d'octets crypté et B le décrypté.
Ainsi, si nous appliquons l'algorithme sur le message, nous obtenons :
MU http://192.168.100.2:2222/mp3/surprise/fr/295.mp3
C'est déjà nettement plus compréhensible.
Le Nabaztag possède une syntaxe propre pour lui passer des ordres, définie comme suit :
Avec ceci, vous avez de quoi faire faire à votre lapin à peu près ce que vous voulez ;)
Sleep Blocks
Ce type de block est beaucoup moins compliqué que les deux précédents. Il permet d'endormir et de réveiller le lapin.
Ainsi :
7f0b00000101ff
va endormir le lapin, tandis que
7f0b00000100ff
le réveillera. (Il s'agit juste d'un block type 0b, avec un octet de donnée, 0 ou 1 en fonction de l'état à passer)
Reboot Blocks
Quasiment jamais utilisé, ce type de block est le plus simple. C'est juste un type 09, sans donnée. Dès que le lapin reçoit ce paquet il se réinitialise.
Dans notre prochain article, nous verrons les différents évènements que le lapin est capable de générer (oreilles, bouton, RFID)
J'aimerais comprendre comment vous utiliser l'algorithme, j'ai essayé de l'appliquer dans tous les sens et cela ne donne rien.
J'aimerais aussi savoir comment peut-on envoyer un message au lapin (que doit-on faire une fois que l'on a créé un message ?)
Merci beaucoup