18
aout
2011

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)

Posté par Mathieu LESNIAK à 14:55 dans la catégorie Nabaztag
Tag(s) associé(s) :
Partager cet article :
Marie
Marie
25/12/2011 12:02:59
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

Ajouter un commentaire




Les champs obligatoires sont marqués d'une *

A table !



Derniers commentaires