Le Nabaztag, comment ca marche ? Partie 3 : Communiquer avec un lapin

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 :

  • 04 : Ambient block
  • 0a : Message block
  • 0b : Sleep Block
  • 09 : Reboot Block

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 :

  • 00 : Disable
  • 01 : Météo
  • 02 : Cours de la bourse
  • 03 : Trafic
  • 04 : Oreille gauche
  • 05 : Oreille droite
  • 06 : Notification email
  • 07 : Qualité de l'air
  • 08 : Clignotement du nez
  • 0b : Sleep / wake
  • 0e : Taïchi

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 :

  • CH <url> : Exécute la chorégraphie située à l'url passée en argument
  • CL 0xAABBCCDD : Défini la couleur de la LED AA (de 00 à 04) avec la couleur RVB passée en BBCCDD (en hexa)
  • PL 0x : Défini la palette de couleur utilisée, où X est compris en 0 et 7
  • MC <url> ou MU <url> : lit le MP3 situé à l'url passé en argument
  • MW : Demande au lapin d'attendre que les commandes précédentes soient terminées avant d'exécuter la suite
  • ST <url> ou SP <url> : Stream le contenu passé en argument (pour les radios notamment)

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)

Publié le :
18/08/2011
Dans la catégorie :
Auteur :
Mathieu LESNIAK
Mathieu LESNIAK
Commentaires :
Marie
Marie
Bonjour,
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
25/12/2011 12:02:59