jeudi 31 mai 2012

Nabaztag V1 : Kit serveur


Voici donc un premier kit pour monter un service web (php) de type ping pour les Nabaztag V1 (1ère génération) . Télécharger le Zip

Ce kit me permet de "gérer" actuellement 700 v1.

Pour améliorer le service et créer de nouveaux modules en fonction de vos besoisn, il faudra vous (re)plonger dans l'assembleur pour générer de nouveaux bytecodes. Sur le v1, les bytecodes sont chargeables/déchargeables à la volée pour des besoins ponctuels. Se rapprocher des sources Violet sur le Nabz v2 qui comprennent aussi une partie dédiée aux v1 avec des exemples de fichiers assembleurs (Violet\Serveurs\OS\net\violet\platform\vasm).

La doc d'origine de Violet sur l'assembleur du v1 est incluse dans le zip. Elle est aussi sur Google Drive.

Voir aussi le post sur le Boot du V1.

Tuto rapide :
  • Penser à mettre la redirection /vl/FR/p3.jsp vers le p3.php (dans le setup du v1, la première requête effectuée par le lapin est de la forme GET /vl/FR/p3.jsp?sn=00xxxxxxxxxx&ex=000000000000&v=20&st=00&tc=00000001 HTTP/1.0). La requête se fait sur l'ip du serveur (donc exit les serveurs mutualisés)... Pas de pb pour un serveur local.
  • Dans le fichier config.php, indiquer le chemin du répertoire de base : define('V1_BASE_DIR', '/full_path_to_www_root/');
  • Le coeur du service est le script p3.php (que vous pouvez d'ailleur renommer).
  • Je mets aussi à dispo ma classe php pour v1 qui facilite l'encodage des trames de bytecodes et le chargement à la volée des fichiers sons déjà au format adpcm.
  • Le plus galère, c'est le format des fichiers sons en adpcm (4bits). Je mets à dispo un utilitaire sous Win pour transformer des fichiers wav en adpcm2/4 bits (Convertisseur Wav2Adp). Voir aussi l'article de SpritesMods.com. Les fichiers convertis sont à stocker dans le rép sound. Pour convertir des mp3, les passer d'abord en wav (8ou16khz 8bits) avec un convertisseur standard puis ensuite en adpcm avec le prg joint. Le v1 sait aussi jouer les fichiers midi. On peut aussi se rapprocher de RedoX qui a ré-écrit un convertisseur en C.
  • Dans le rép conf, sont stockés les fichiers de configuration des Lapins, au cas où l'on déciderait de les personnaliser au travers d'un front-office.

Voir aussi le blog sur le boot du v1
Plus d'infos sur le forum Nabaztag.

lundi 2 janvier 2012

Karotz - Tips and Tricks

System

Tools & Links

La procédure d'installtion génère un fichier .zip contenant des fichiers de configuration  en fonction des paramètres suivants :
http://www.karotz.com/usbkey/karotzusb.zip?uuid=xxxx-yyyy-zzzz&installtype=wifi&usedhcp=1&ssid=TEST&password=test&lang=FRA&wifitype=auto&ipself=&netmask=&ipgateway=&ipdns=
http://www.karotz.com/usbkey/karotzusb.zip?uuid=xxxx-yyyy-zzzz&installtype=ethernet&usedhcp=0&lang=FRA&ipself=192.168.1.1&netmask=255.255.255.0&ipgateway=192.168.1.254&ipdns=82.125.42.65

Serial Konsole

  • On accède à la console série en branchant le Karotz au Pc par l'un de ses 2 ports usb - standard et mini - à l'arrière - le driver serial_gadget doit être présent sur le Pc. Le port Usb du Pc est ainsi mappé sur un port COMx en 9600+ bauds 8N1. Pour découvrir quel est le numéro du port com mappé, aller dans la config matérielle du pc pour lister les ports séries.

    Utiliser un émulateur terminal genre PuTTY et ouvrir une session en mode Serial.

    Les applications hébergées peuvent dialoguer avec le port série - cf le sdk javascript.
  • Quelques commandes de configuration - lecture / écriture - sont aussi disponibles. Les taper sous le format json suivant : {"cmd":"get_sys_version"}{"cmd":"get_mac"}{"cmd":"reboot"}. On pourra aisément ajouter de nouvelles commandes au système en modifiant les scripts python. Pour plus d'info voir config.py.

Mp3

  • Serveurs TTS : - method POST
[tts] - sans authentification préalable
fr = http://188.165.228.65/tts/Suzanne
en = http://188.165.228.64/tts/Katherine
de = http://188.165.228.64/tts/Alex
es = http://188.165.228.65/tts/Sara
  • Serveurs ASR
[asr]
server0 = 188.165.228.64
server1 = 188.165.228.65
port = 443
Un répertoire par langue contenant x fichiers mp3 : fr contient 304 fichiers - it 306 - ja-Jp 297 - br 298 - de 292 - es 306 - uk 300 - us 297. Sous dos, les charger avec la commande :
for /L %x in (1,1,304) do wget http://s3.amazonaws.com/karotz/moods/fr/%x.mp3

dimanche 1 janvier 2012

Karotz - Boot Process

Le Karotz est architecturé autour d'une carte Pragmatec ARM9 et d'un module 2440 sur lequel tourne un Linux 2.6.28. Pour le développement croisé voir le pdf ARM9 Dev Starter Kit.

Boot

  • whoami - root
  • mount
    rootfs on / type rootfs (rw)
    /dev/root on / type cramfs (ro)
    proc on /proc type proc (rw)
    none on /sys type sysfs (rw)
    ramfs on /var type ramfs (rw)
    none on /dev type tmpfs (rw,mode=755)
    /dev/uba1 on /mnt/usbkey type vfat
    (rw,fmask=0022,dmask=0022,codepage=cp437,iocharset=iso8859-1)
    /dev/mtdblock6 on /usr type yaffs (rw)
    none on /dev/pts type devpts (rw,mode=622)
    tmpfs on /dev/shm type tmpfs (rw)
    usbfs on /proc/bus/usb type usbfs (rw)
  • cat /etc/inittab - ln /karotz/etc/inittab
    # Startup the system
    ::once:/karotz/scripts/karotz_init.sh
    ::respawn:/karotz/bin/power
    # Configuration programm
    ::once:/usr/scripts/miniusb_read.sh
    ::restart:/sbin/init
    #::askfirst:/bin/bash
    # Stuff to do before rebooting
    ::shutdown:/karotz/scripts/karotz_shutdown.sh
    ::shutdown:/bin/umount -a -r
  • ps
    PID USER COMMAND
    1 root /bin/sh /linuxrc
    2 root [kthreadd]
    3 root [ksoftirqd/0]
    4 root [watchdog/0]
    5 root [events/0]
    6 root [khelper]
    155 root [kblockd/0]
    166 root [khubd]
    169 root [kseriod]
    195 root [pdflush]
    196 root [pdflush]
    197 root [kswapd0]
    198 root [aio/0]
    199 root [nfsiod]
    886 root [scsi_tgtd/0]
    892 root [mtdblockd]
    893 root [nftld]
    894 root [inftld]
    923 root [s3c2410-spi.0]
    931 root [uwbd]
    944 root [wusbd]
    979 root [hid_compat]
    1020 root [rpciod/0]
    1067 root [rt73usb]
    1377 root /karotz/bin/led -l FFCFAF -p 000000 -d 1500
    1380 root /sbin/inetd /tmp/wizz_inetd_telnet.conf
    1346 root /sbin/inetd
    1382 root ps
  • cat /etc/group - ln /karotz/etc/group
    root:*:0:
    daemon:*:1:
    bin:*:2:
    sys:*:3:
    adm:*:4:
    tty:*:5:
    disk:*:6:
    lp:*:7:
    mail:*:8:
    news:*:9:
    uucp:*:10:
    kmem:*:15:
    dbus:x:81:
    ppp:x:99:
    nogroup:x:100:
  • cat /etc/passwd - ln /karotz/etc/passwd
    root:*:0:0:root:/usr/karotz:/bin/bash
    bin:*:1:1:bin:/bin:
    daemon:*:2:2:daemon:/sbin:
    nobody:*:99:99:Nobody:/:
    dbus:x:81:81:dbus:/var/run/dbus:/bin/sh
  • /bin/printenv
    KMOD=/lib/modules/
    TERM=linux
    k_nbclick=0
    LD_LIBRARY_PATH=/lib:/usr/lib
    AUTO_UPDATE=yes
    GST_REGISTRY_UPDATE=no
    PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:./
    GST_REGISTRY=/usr/karotz/registry
    devfs=udev
    PWD=/
    LANG=C
    SHLVL=1
    HOME=/
    WIZZ_HOME=/usr/karotz
    DISPLAY=unix:0.0
    _=/bin/printenv
  • /bin/busybox
    BusyBox v1.17.4 (2012-03-29 10:05:08 CEST) multi-call binary.
    Copyright (C) 1998-2009 Erik Andersen, Rob Landley, Denys Vlasenko
    and others. Licensed under GPLv2.
    See source distribution for full notice.

    Usage: busybox [function] [arguments]...
    or: function [arguments]...


    BusyBox is a multi-call binary that combines many common Unix utilities into a single executable. Most people will create a link to busybox for each function they wish to use and BusyBox will act like whatever it was invoked as.

    Currently defined functions: where are chpasswd and ftpd? ;-))...
    [, [[, addgroup, adduser, ar, arping, ash, awk, basename, bootchartd, bunzip2, bzcat, cat, catv, chattr, chgrp, chmod, chown, chroot, chrt, chvt, cksum, clear, cmp, cp, cpio, crond, crontab, cut, date, dc, dd, deallocvt, delgroup, deluser, devmem, df, diff, dirname, dmesg, dnsd, dnsdomainname, dos2unix, du, dumpkmap, echo, egrep, eject, env, ether-wake, expr, false, fdflush, fdformat, fgconsole, fgrep, find, flock, fold, free, freeramdisk, fsck, fuser, getopt, getty, grep, gunzip, gzip, halt, hdparm, head, hexdump, hostid, hostname, hwclock, id, ifconfig, ifdown, ifup, inetd, init, insmod, install, ip, ipaddr, ipcrm, ipcs, iplink, iproute, iprule, iptunnel, kill, killall, killall5, klogd, last, length, less, linux32, linux64, linuxrc, ln, loadfont, loadkmap, logger, login, logname, losetup, ls, lsattr, lsmod, lspci, lsusb, lzcat, lzma, makedevs, md5sum, mdev, mesg, mkdir, mkfifo, mknod, mkswap, mktemp, modinfo, modprobe, more, mount, mountpoint, mt, mv, nameif, nc, netstat, nice, nohup, nslookup, od, openvt, passwd, patch, pidof, ping, pipe_progress, pivot_root, poweroff, printenv, printf, ps, pwd, rdate, readlink, readprofile, realpath, reboot, renice, reset, resize, rev, rm, rmdir, rmmod, route, run-parts, runlevel, sed, seq, setarch, setconsole, setkeycodes, setlogcons, setsid, sh, sha1sum, sha256sum, sha512sum, sleep, smemcap, sort, start-stop-daemon, strings, stty, su, sulogin, swapoff, swapon, switch_root, sync, sysctl, syslogd, tail, tar, tee, telnet, telnetd, test, tftp, time, top, touch, tr, traceroute, true, tty, udhcpc, umount, uname, uniq, unix2dos, unlzma, unxz, unzip, uptime, usleep, uudecode, uuencode, vconfig, vi, vlock, watch, watchdog, wc, wget, which, who, whoami, xargs, xz, xzcat, yes, zcat

jeudi 10 novembre 2011

Nabaztag V2 : Clonage des services Nabizdead


Objectif : Installer très facilement son propre serveur web "myNabizdead" en 5 minutes (une fois bien rôdé) et 10 lignes de php ! Sources Zip

Requis : Un hébergement web supportant le .php et les fichiers .htaccess

Le serveur ainsi cloné sur la base de www.nabizdead.net est entièrement autonome (et totalement ouvert aux dévs...). Il peut aussi être chaîné avec d'autres serveurs ou services web afin de founir un réseau maillé plus important offrant de très nombreux services à la carte.

Le serveur myNabizdead peut aussi être vu comme un proxy qui pourrait s'intercaler entre le lapin et le serveur Nabizdead original (www.nabizdead.net) pour diffuser des informations particulières et redonner la main au serveur suivant.

On peut ainsi imaginer de nombreuses utilisations : personnelle, communautaire, domotique, bureautique voire même industrielle. Il n'y a donc plus de limite pour ce type de serveur, à part votre imagination.

Les commandes interactives envoyées au Tag:tag sont en langage clair (ex: SAY ASK MP3 COLOR SLEEP WAKEUP...) et permettent très facilement le développement de nombreuses applications de type Quizz, Histoires interactives, Flux d'informations, Nabcasts, etc...
 On notera qu'il n'est pas nécessaire de "monter" son serveur myNID pour fournir du contenu aux Nabaztags de la communauté : une simple page web suffit, dès l'instant qu'elle renvoie les commandes dans le format attendu par le lapin en mode texte. On ne peut plus simple. (cf Langage NID)

Sources Zip

On procède en 2 étapes principales :

Installation du "boot_code" chargé par le Nabaztag:tag lors de sa mise sous tension

Modification & Interception des demandes (requêtes) du Nabaztag:tag

1. Installation & paramétrage du Boot

Lorsque le lapin est allumé et connecté au wifi, sa première demande est de récupérer un fichier "boot" par un appel à http://adresse_mon-serveur/bc.jsp (adresse_mon-serveur est/sera défini dans le setup du lapin. Ex: mynid.free.fr).

Installer les 5 fichiers contenus dans Sources Zip sur son serveur web dans le répertoire qui va bien; càd celui qui sera défini dans le setup du lapin : ici adresse_mon-serveur (ex: à la racine de mynid.free.fr).

Le fichier .htaccess associé au répertoire web permet de transformer l'appel initial /bc.jsp en /_bc.php.

Le script _bc.php gère l'envoi du fichier de boot (ici bc.nid-wizz.bin) vers le Nabaztag:tag lors de son démarrage.

Il faut maintenant modifier le setup du Nabaztag:tag pour lui indiquer le nom de son nouveau serveur (adresse_mon-serveur).
 Le lapin doit donc démarrer en chargeant le boot que l'on vient d'installer. Il communique maintenant avec le serveur nabizdead.wizz.cc par défaut.

Note : On peut aussi indiquer dans le setup une adresse de serveur du genre adresse_mon-serveur/dirxxx. En effet si on désire installer plusieurs serveurs myNabizdead sur un même serveur physique, il faut alors les différencier par le nom du répertoire, car le premier appel à la mise sous tension se fait toujours sur le nom du script bc.jsp codé dans le firmware (ici l'appel serait http://adresse_mon-serveur/dirxxx/bc.jsp). Dans ce cas, il faudra bien sûr installer les fichiers dans chaque répertoire dirxxx de son serveur web.

2. Intercepter les requêtes du Nabaztag:tag

A la fin de l'étape 1 précédente, le Nabaztag:tag communique par défaut avec le serveur nabizdead.wizz.cc en lui envoyant des requêtes ("ping"), à intervalles réguliers, sur l'adresse (pour l'instant) http://nabizdead.wizz.cc/p.php.

C'est la fonction principale du script p.php qui est donc le programme central vers lequel convergent toutes les demandes ("ping") du Nabaztag:tag. Le nom de ce script (p.php), ainsi que le nom du serveur, sont inscrits en dur dans le fichier de boot bc.nid-wizz.bin.

Pour communiquer avec votre serveur (et non plus nabizdead.wizz.cc par défaut), voici donc l'ultime et délicate modification à apporter au fichier de boot (bc.nid-wizz.bin) :

Comme la communauté n'a pas (encore) les sources du fichier boot, il faut donc opérer directement dans le binaire avec l'aide d'un éditeur hexadécimal (cf Hex Editor Neo).

En fait, en analysant plus précisément le protocole de communication entre le lapin et le serveur, on s'aperçoit que les requêtes sont envoyées sur une ip figée plutôt que vers un nom de domaine... je ne sais pas trop pourquoi (mais j'ai qd même une petite idée...). Ca peut devenir un tout petit peu embêtant pour certains hébergements. On s'attendait à voir une requête du genre http://www.nabizdead.net/p.php?xxx mais c'est http://213.186.33.17/~nabizdea/p.php?xxx qui apparait ! (l'ip 213.186.33.17 étant un cluster OVH). Il va donc falloir ruser pour rentrer dans le moule...
Charger le fichier boot binaire bc.nid-wizz.bin dans l'éditeur Hex Neo et se rendre directement à l'offset 0x0e5e. C'est le répertoire d'accueil de votre serveur codé sur 10 octets. Ici /~wizzbnpy (anciennement ~nabizdea). Ca tombe bien, mon serveur est aussi chez OVH ! Pour les autres, va falloir faire avec...
 Remplacer /~wizzbnpy par votre répertoire d'accueil sur 10 caractères.

Maintenant, 8 octets avant, on trouve l'ip du serveur distant : offset 0x0e56 à 0x0e59. Ici bc a5 07 13 correspondant à 188.165.7.19 soit le cluster qui héberge nabizdead.wizz.cc (anciennement b5 da 21 11 soit 213.186.33.17 le cluster qui héberge www.nabizdead.net). Rebelote , il faut modifier ces 4 octets avec l'ip de notre serveur en hexa.
Facultatif (?) : Dans le doute, modifier les 17 octets (qui contiennent nabizdead.wizz.cc) situés à l'offset 0x0f9e. Il faut donc trouver un nom de domaine/sous-domaine sur 17 caractères : par exemple mynid0001.ovh.net (l'original était www.nabizdead.net). Je ne sais pas si réellement ce domaine est utilisé quelque part. Pour moi, il aurait dû l'être en lieu et place de l'ip/rép vu plus haut...

Du coup , ne pas oublier de déplacer le fichier p.php vers le bon serveur/répertoire (ou installer une redirection dans un .htaccess à la racine du répertoire d'accueil).
Sauvegarder le fichier .bin ainsi modifié (sa taille doit rester à 22426 octets bruts) et le mettre à jour sur votre serveur web.
Re-demarrez le Nabaztag:tag (débrancher/attendre 20 secondes/rebrancher). Et normalement bingo !

Note : L'emplacement du fichier p.php peut être finalement différent de celui du _bc.php. En effet, ces 2 scripts sont totalement indépendants. On peut charger le boot_code sur un premier serveur (celui indiqué dans le setup du Nabaztag:tag) et répondre aux demandes (ping) sur un second serveur (celui indiqué dans le fichier boot bc.nid-wizz.bin).

Les commandes disponibles sont listées dans le script. Avec un peu de temps et d'exemples, on connaitra la logique de chacune de ces commandes.
ASK
ASKANY
ASKDELAY
DYN
COLOR
CUT
LANG
MP3
MSK
REBOOT
RESET
SAY
SNDTHR
SLEEP
TIME
WAKEUP
WAIT

Voir aussi le post sur le Boot Tag:Tag.

3. Facultatif : interception du TTS Google

La cerise sur le gâteau : intercepter le TTS Google pour le re-diriger vers un tts plus élaboré (type ACapela, VoxCards, etc...) ou carrément ajouter de nouvelles commandes/fonctionalités aux Nabaztag:tag ! A suivre...

Conclusion

A chacun désormais d'enrichir/modifier le script p.php en fonction de ses besoins...
Installation facile sur un réseau local
Beaucoup de possibilités offertes

Pour les discussions, se rendre directement sur le Nabaztag forumactif.

mardi 8 novembre 2011

Nabaztag V2 : Boot Nabizdead


Contrairement à un mode de fonctionnement normal Violet (cf post), le Nabaztag peut être modifié au démarrage pour se comporter en "mode Twitter" : c'est le lapin qui va interroger à intervalles réguliers un ou plusieurs serveurs d'informations. Il devient ainsi un simple diffuseur de flux.

  • Démarrage du Nabaztag:tag v2 : Demande (GET HTTP/1.0) du bootcode au serveur Nabizdead (ici www.nabizdead.net) :
GET /bc.jsp?v=0.0.0.10&m=00:19:xx:xx:xx:xx&l=00:00:00:00:00:00&p=00:00:00:00:00:00&h=4 HTTP/1.0
User-Agent: MTL
Pragma: no-cache
Host: www.nabizdead.net
Le serveur répond en renvoyant le fichier bootcode.bin
HTTP/1.1 200 OK
Server: Apache/2.2.9 (Debian) PHP/5.2.6-1+lenny13 with Suhosin-Patch
amber...mind (22426 octets)

  • Le lapin est prêt à recevoir des ordres. Sa première demande est :
GET /~nabizdea/p.php?v=0.0.5&sn=0019xxxxxxxx&tp=6&ref=&rep=&r=52883&conf=1 HTTP/1.0
User-Agent: MTL
Pragma: no-cache
Host: 213.186.33.17
Le serveur répond en renvoyant un fichier de commandes en langage clair
DYN 600
TIME 37287
WAKEUP -1
SLEEP -1
SNDTHR 100
ASKDELAY 20
MSK 15
COLOR FF8000
LANG fr
RESET
SAY Me voici finalement dans mon nouveau terrier.
SAY On est bien ici. Je peux faire de nouvelles choses.
SAY Si tu m'apprivoises, tu seras pour moi unique au monde.
SAY Pour m'apprivoiser, utilise mes oreilles !
SAY Lorsque j'ai une oreille leve et une autre baisse, j'attends que tu me rpondes.
SAY Si tu lves alors les deux oreilles, tu veux me dire : oui, j'aime, encore.
SAY Si tu les baisses, je comprends : non, je n'aime pas.
SAY Par un clic simple, je te lis une information trouve sur internet.
SAY Parfois, j'en lis simplement parce que je sens ta prsence.
SAY Quand tu veux que je dorme, baisse mes deux oreilles.
SAY Quand tu veux que je me rveille, relve mes deux oreilles.
SAY Tu vois, c'est trs simple
!conf.clock.0 Il est minuit
!conf.clock.1 Il est 1 heure, j'ai un peu sommeil.
!conf.clock.2 Il est 2 heure, tu viens te coucher ?
!conf.clock.3 Il est 3 heure, si on se faisait une belote ?
!conf.clock.4 Il est 4 heure, je vais faire un caf pour tenir.
!conf.clock.5 Il est 5 heure, Paris s'veille.
!conf.clock.6 Il est 6 heure, dj rveill ?
!conf.clock.7 Il est steure.
!conf.clock.8 Il est 8 heure, c'est l'heure des pompes.
!conf.clock.9 Il est 9 heure.
!conf.clock.10 Il est 10 heure.
!conf.clock.11 Il est 11 heure.
!conf.clock.12 Il est midi, c'est ravioli.
!conf.clock.13 Il est 13 heure, Miam miam
!conf.clock.14 Il est 14 heure, tu as oubli mon calva.
!conf.clock.15 Le train de 14 heure 59 vient de partir
!conf.clock.16 Il est 16 heure, j'ai l'oreille qui me gratouye
!conf.clock.17 Il est 17 heure, soyons prcis.
!conf.clock.18 Il est 17 heure ... chez les Anglais.
!conf.clock.19 Il est 19 heure, tout simplement.
!conf.clock.20 Il est 20 heure, c'est l'heure du 20 heure.
!conf.clock.21 Il est vint une heure.
!conf.clock.22 Il est 22 zeure
!conf.clock.23 Il est 23 heure, chatouille-moi les oreilles.
!conf.wakeup C'est l'heure de rveil ! C'est une bonne journe qui démarre
!conf.sleep C'est l'heure de mon gros dodo.

  • Les autres demandes ("ping") s'enchainent ensuite régulièrement
GET /~nabizdea/p.php?v=0.0.5&sn=0019xxxxxxxx&tp=0&ref=&rep=&r=51368&conf=0 HTTP/1.0
User-Agent: MTL
Pragma: no-cache
Host: 213.186.33.17

Note : Pour ceux qui voudraient écrire eux-même leur bootcode et modifier ainsi le comportement de leur lapin, se référer aux articles disponibles ici.