Application Mac OS X : Gestion du ‘Mir:ror’ de Violet, le lecteur RFID associé au Nabaztags.

27/02/2013
Auteur : De Emmanuel Grandadam

Création d’un package pour le déploiement de l’application de gestion du périphérique ‘Mir:ror’ de la société Violet.
Le tout est disponible dans une belle image disque… à télécharger depuis mon site Web.

A. Le principe de l’application…

Le ‘Mir:ror’ est un périphérique HID (Human Interface Device) qui ne demande pas de pilote. L’interface s’utilise en envoyant ou récupérant des chaines en Héxadécimal.

Je me base sur le projet de hidapi de signal11 pour générer la bibliothèque ‘libhidapi.0.dylib’ pour Mac ainsi que l’exécutable ‘hidtest’ modifié par mes soins.

L’exécutable génère un appel vers un script Bash (mirror_tags.sh) avec comme paramètres : l’action (show/hide) suivi de l’identifiant du tag.

Cas de la transformation en C++ de la variable int vers char :

Je suis (enfin!) arrivé à transformer en C++ la variable integer (qui contient les données héxadécimal du Mir:ror) en char de manière à générer une chaine de texte utilisable… (voir le fichier hidtest.cpp)

char response[1];
char url[256];

response[0]=buf[0];
response[1]=buf[1];

sprintf(url,"%02hhx",response[0], response[1], ...);

Le tout est lancé sur le Mac par le biais d’un service de lancement (launchd).

B. Le package Mac OS X…

Je génère deux versions du projet :

  • Une version 32bits (j’ai un vieux MacBook Pro Core Duo qui ne travaille pas en 64bits)
  • Une version 64bits.

Chaque package copie les différents composant du projet à leur place définitive :

  • Installation de la librairie ‘libhidapi’ dans /usr/local/lib/
  • Installation de l’exécutable ‘Mirror’ dans /usr/local/bin/
  • Installation du fichier de configuration ‘mirror_tags.sh’ dans « ~/Library/Application Support/Mirror By LCProd/ »
  • Installation du service de lancement ‘fr.lcprod.mirror.plist’ dans « ~/Library/LaunchAgents/ »

L’installateur exécute ensuite un le service de lancement pour démarrer l’application.

Cas de l’installateur Mac (PackageMaker) :

L’installateur ne permet pas d’installer en une fois des fichiers pour le système et pour l’utilisateur… je décide de le lancer root en vue d’une installation vers le système.

J’organise le déploiement en trois temps :

  1. Les fichiers soit copiés vers un répertoire temporaire par l’installateur.
  2. Un script Bash de post traitement Bash copie les fichiers vers leurs emplacements définitif : La commande ‘cp -aR’ permet de garder les droits originaux des fichiers 🙂
    cp -aR dossier_depart dossier_destination
  3. Le lancement du service doit être fait par l’utilisateur, j’utilise la commande ‘su’ pour activer ‘launchctl load …’
su $USER -c 'launchctl load -F $HOME/Library/LaunchAgents/fr.lcprod.mirror.plist'

Le tout est disponible dans une belle image disque… à télécharger depuis mon site Web.

C. Vos remarques, vos questions, vos améliorations… : Commentez ici ou envoyez des Tweets (@lcprod)

Un merci pour les ressources du Web :

 

Commentaires :

Utilisation d’un Mir:ror pour piloter un Mac. (LinuX / Mac)

24/02/2013
Auteur : De Emmanuel Grandadam

Comment faire revivre ce périphérique de l’âge des Nabaztag pour piloter un Mac :
Une histoire avec du C/C++, une dose de Bash et un peu d’AppleScript (osascript) et une bidouille
avec VLC

A. On commence à penser le truc sur le linuX…

L’idée : c’est de piloter le périphérique depuis un Linux mais exécuter des commandes sur d’autres machines. Pour piloter les Macs, j’utilise des scripts AppleScript lancés au travers d’un tunnel SSH.

1. Je me base sur le projet reflektor que je compile sur le linuX…
2. Ce projet écrit en C fabrique un fichier caché (.reflektor_do) dans le répertoire de l’utilisateur avec l’ID des Tags et la commande à exécuter :

     show d0021a053b453906:/home/user/mirror/actions_do.sh show d0021a053b368906 hide
     d0021a053b453906:/home/user/mirror/actions_do.sh hide d0021a053b368906 hide

3. Je monte un script Bash qui récupère les appels et obtient les actions ainsi que les ID des Tags :

     #!/bin/bash
     action=$1
     tagid=$2

     # Tag Blue
     if [ "$action" == "show" ] && [ "$tagid" == "d0021a053b368906" ]; then
          ssh user@mac "osascript -e 'tell application \"iTunes\" to play'"
     fi

Cela fonctionne parfaitement ! les appels SSH sont rapides.
Un problème tout de même : le Mir:ror reste allumé !! Je peux le désactiver dans le code C du software mais c’est fixe 🙁 et le retourner tous les soirs… c’est pas gagné…
A faire par la suite :
• Soit : Apprendre à éteindre un port USB sur le LinuX,
• Soit : Utiliser node.js pour envoyer des commandes au Mir:ror avec la bibliothèque node-hid.

B. On repense le truc mais cette fois sur le Mac…

En plaçant le système dans le mac, je pilote mieux les actions et peux couper le Mir:ror en éteignant le Mac.

1. J’utilise cette fois ci le projet hdiapi ainsi qu’une partie des modifications trouvés sur ce site .
2. Cette fois ci, le projet en C++ permet de fabriquer l’exécutable hidtest.
3. J’apporte quelques modification au fichier hidtest avant de compiler :

# buf[1] Permet d'avoir l'action
# buf[8] Permet de récupérer une une partie de l'ID du TAG pour l'identifier

if (buf[1] == 1 && buf[8] == 5) {
     printf(" IN 5");
     system("~/Library/\"Application Support\"/Mirror/actions_do.sh show blue");
}
...

4. Je garde presque le script précédent pour récupérer les appels et obtientir les actions ainsi que les ID des Tags :

#!/bin/bash
action=$1
tagname=$2

# Lancer une radio dans un VLC sans interface, récupérer le PID pour
#      pouvoir détruire l'instance lorsque le Tag est caché.
# VLC -I http  => Pas d'interface graphique, juste l'interface http.
# VLC --http-host 127.0.0.1:8085   => Permet de router le port de ce VLC du 8080 par
#      défaut vers le 8085 de manière à ne pas la voir dans l'appli Mobile.

if [ "$action" == "show" ] && [ "$tagname" == "blue" ]; then
     PROGRAM="/Application/VLC.app/Contents/MacOS/VLC -I http --http-host 127.0.0.1:8085 http://...mp3"
     $PROGRAM &
     echo $! > /tmp/vlc.pid
fi

if [ "$action" == "hide" ] && [ "$tagname" == "blue" ]; then
     PID=$(cat /tmp/vlc.pid)
     kill -15 $PID
fi

5. Je fabrique un service de lancement pour le mac avec Lingon. A placer dans Library/LaunchAgents de l’utilisateur :

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
     <key>KeepAlive</key>
     <true/>
     <key>Label</key>
     <string>fr.lcprod.mirror</string>
     <key>ProgramArguments</key>
          <array>
               <string>__chemin_vers_hidtest</string>
          </array>
     <key>QueueDirectories</key>
          <array/>
     <key>RunAtLoad</key>
          <true/>
     <key>StartOnMount</key>
          <false/>
     <key>WatchPaths</key>
          <array/>
</dict>
</plist>

Cela fonctionne aussi très bien !
J’aurais tout de même aimé pouvoir récupérer à partir de hditest l’ID complet du Tag !
(Je me base sur une extraction d’un bit de la chaîne.)
Problème en C++ : Impossible de récupérer dynamiquement d’ID pour le transmettre au script Shell : Comment convertir un int en char en C++ ……….

Commentaires :

La Freebox comme disque de sauvegarde en AFP pour mon LinuX

30/01/2013
Auteur : De Emmanuel Grandadam

Utilisation du protocole AFP depuis LinuX pour accrocher la Freebox…

La recette :

  1. Utiliser le projet afpfs-ng pour avoir un client AFP sur le linux. (Basé sur Fuse)
  2. Monter un script bash pour envoyer des fichiers.
    • Attention : la commande  mount_afp est pratique sous root, mais pas sous un utilisateur. Les droits appliqués au dossier du point de montage ne sont pas définis correctement : le dossier devient invisible…
    • Je préfère utiliser afpcmd qui permet une utilisation du protocole AFP en mode interactif.
  3. #!/bin/sh
    afpcmd "afp://user:password@mafreebox.freebox.fr/Disque dur" << EOF
         cd /dossier_distant
         lcd /dossier_local
         put fichier
         quit
    EOF
  4. Le tout dans une tâche cron et le tour est joué !
Commentaires :