Téléchargement

MediaPad.cs

Driver du MediaPad sans SetPoint (ver. 5.92.28 du 04/03/2018)

Certaines fonctionnalités peuvent faire défaut, mais le fichier peut être mis à jour de temps à autre.


Il y a quelque temps déjà je trouvais au détour d'un marché aux puces printanier une relique de l'an de grâce 2003: j'ai nommé le Logitech Mediapad de la gamme diNovo. Croisement entre le pavé numérique, la télécommande multimédia et la calculatrice, le tout connecté en Bluetooth et mâtiné d'une horloge, celle-ci permettait de faire ses calculs hors connexion et d'avoir un aperçu de ses mails et autres conversations AIM-MSN (blast from the past) . Le tout à l'aide de son écran à cristaux liquides de trois lignes.

Bien évidement mon esprit de récupérateur a tout de suite vu le potentiel de détournement de l'objet en question, et comment il pourrait servir à des fins de notifications diverses en tant qu'écran auxiliaire. Je l'acquis donc pour une somme modeste et m'attelais à son bidouillage.

Toutefois l'intégration s'avera plus ardue que prévue car, contrairement à certains appareils comme le LiveView ou l'i-Buddy, il ne semblait pas y avoir de bibliothèque existante en .NET pour contrôler le MediaPad. C'est donc parti pour un peu de rétro-ingénierie!

Configuration

Le pavé numérique se connecte en Bluetooth (non LTE because 2003) à l'aide d'un PIN. Une fois ceci fait, il fonctionne HDLB (comprenez hors de la boîte, out of the box) pour les fonctions d'entrée basique. Afin d'utiliser ses fonctionnalités avancées il faut pour cela installer le logiciel dédié SetPoint (anciennes versions sur FileHippo) . Assez lourd (80 mo) il permet de faire sonner le MediaPad (beeper intégré), définir le message d'accueil, synchroniser l'horloge et mapper les différentes touches le composant. Certaines fonctionnalités d'affichage nécessitant Windows Media Player 9 et AIM, cela le rend assez obsolète. Peut être pourrons nous lui donner une seconde vie dès la fin de cet article.

Le logiciel Logitech SetPoint est constitué comme bien d'autres d'éxecutables et de .dll divers. ILSpy ne le valide pas en code managé (.NET), depends.exe et Nirsoft DLL Export Viewer y décèlent nombre de fonctions mais rien d'explicite comme blink_mediapad_led() que l'on pourrait exploiter en PInvoke. Des fichiers XML contiennent les messages localisés s'affichant sur le MediaPad, mais les pistes semblent s'arrêter ici.

Le bouton de test sonore : une fonctionnalité de SetPoint non négligeable

Pilier de la rétro ingénierie Bluetooth, USB ou d'appareils exploitant d'autres protocole, le sniff des données échangées avec l'hôte. Afin de procéder, nous utilisons le bon vieux WireShark, référence du milieu, avec un dongle compatible et passé sous WinPCap ou LibUSB. Il y a aussi le logiciel USBLyzer qui bien que payant (avec un mois d'essai) s'avère plus intuitif.

Nous filtrons donc les données passant par l'interface Bluetooth lors de l'appui du bouton "Tester le son" de SetPoint. Les paquets d'entrée-sortie s'affichent et nous pouvons les décortiquer.

précédé de l'octet 0xA2 annoncant une transaction d'écriture DATA pour les Périphériques d'Interface Homme-Machine (HID - claviers, souris, gamepads...), nous avons un paquet qui pourrait bien être celui faisant chanter l'appareil!

0x10, 0x00, 0x80, 0x50, 0x02, 0x00, 0x00

Nous créons un programme console C# avec SharpDevelop, IDE léger et efficace. Nous tentons une connexion Bluetooth sur le MediaPad (32Feet) avec vue sur le service Bluetooth dédié aux HID.

BluetoothAddress ba = new BluetoothAddress(0xXXXXXXXXXXXX);
BluetoothClient client = new BluetoothClient();
client.Connect(ba, BluetoothService.HumanInterfaceDevice);
client.GetStream().Write(new byte[]{ 0x10, 0x00, 0x80, 0x50, 0x02, 0x00, 0x00 });

Las, cela ne fonctionne pas, le service ne semble pas accepter de requêtes. Nous nous tournons alors vers la connexion USB HID normale, en utilisant la HidLibrary.

Afin de nous connecter à un appareil nous avons besoin du VID (ID Vendeur) et PID (ID Produit)

foreach(HidDevice mediaPadSocket in HidDevices.Enumerate(0x046D, 0xB3E1)){ //connexion par VID-PID
    Console.WriteLine(device.Attributes.ProductHexId);
    mediaPadSocket.Write(new byte[]{ 0x10, 0x00, 0x80, 0x50, 0x02, 0x00, 0x00 }); //paquet du beep
}

Et là, c'est le beep!

J'entends joyeusement sonner le pavé numérique. C'est donc un succès!

Maintenant que nous avons la base de l'édifice, nous pouvons générer une petite classe bien utile. Au cours de mes nombreux essais et recherches je suis tombé sur le projet Bluez-diNovo visant à apporter le support du MediaPad au stack Bluetooth Bluez de Linux. Bien qu'en C++, il contient la liste des paquets ainsi que les fonctions d'écriture associées. Merci donc à Tim Hentenaar pour ce travail ouvert m'ayant épargné bien du brainstorming une fois la connexion accomplie.

Une librairie, des possibilités infinies

Maintenant que je peux afficher ce qu'il me plaît sur la calculatrice améliorée, pourquoi ne pas l'intégrer à MusicPeek?

Article précédent Article suivant