Article: Un peu de reverse engineering sur MELCloud

Un peu de reverse engineering sur MELCloud

06/2015

Depuis quelques mois maintenant, les bureaux de l'entreprise dans laquelle je travaille sont équipés de blocs climatiseurs réversibles Mitsubishi (il doit s'agir de ce modèle).

Ces blocs ont trois modes de fonctionnement :

Ils sont connectés, et peuvent être commandés soit par l'intermédiaire d'une télécommande IR, via l'interface web MELCloud ou via les différentes applications mobiles proposées par Mitsubishi.

MELCloud ?

Logo MELCloud

Accessible via ce lien, MELCloud est une "webapp" (en ligne ou sur mobile, visiblement du Cordova) qui permet de commander et de surveiller des équipements Mitsubishi.

Vous pouvez trouver le manuel utilisateur ici : MELCloud_Manual_App_FR_20131112.pdf.

L'utilisation est simple et assez intuitive. Vous vous connectez avec les identifiants fournis par l'administrateur et vous arrivez sur un menu regroupant tous les périphériques auxquels vous avez accès. Vous pouvez directement interagir avec ces derniers pour modifier ses paramètres de fonctionnement.

Le lobby MELCloud Le lobby MELCloud

Paramètres d'un périphérique Paramètres d'un bloc climatiseur

Notre problème

Cette idée de reverse-engineering n'est pas venue de nulle part.

Tout à l'heure je racontais que chaque bureau était équipé d'au moins un convecteur. Selon les goûts de chacun, certains étaient en mode chauffage à 25°C, d'autres en ventilation pour stabiliser la température ambiante et certains en mode froid à 19°C.

Sauf que, la situation citée ci-dessus provoque un conflit et rends indisponible (pendant parfois une journée) certains appareils de façon aléatoire.

Malgré plusieurs notes de services et mails d'avertissement, les employés continuaient d'utiliser leur appareil comme bon leur semblait; Il nous fallait donc un outil de monitoring rapide pour avoir une vision et une possibilité de réglage sur tous les appareils à la fois.

L'inspecteur web

J'avoue que, c'est très petit sexe. L'inspecteur web est la solution la plus simple, mais aussi la plus rapide. Que ce soit Firebug ou l'inspecteur web de WebKit, écouter le trafic entre la webapp et leur serveur était donné (surtout avec des réponses JSON).

Ceci n'est pas une documentation de l'API MELCloud. Les explications ci-dessous sont issues de mes notes personnelles et ne sont en aucun cas exhaustives. Je n'ai gardé que les informations qui semblaient pertinentes pour la résolution de mon problème.

Connexion au service

La connexion se fait via une simple requête POST et quelques paramètres.

URL : https://app.melcloud.com/Mitsubishi.Wifi.Client/Login/ClientLogin
Méthode : POST
Retour : JSON

Paramètres :
    AppVersion: 1.7.1.0,
    Language: 7,
    CaptchaChallenge: null,
    CaptchaResponse: null,
    Persist: true,
    Email: votrelogin@email.com,
    Password: monmotdepasseenclair

Note: Language = 7, Français (pour recevoir directement les données en °C il me semble).

Je ne vais pas coller ici l'objet répondu en entier, cependant voici les données pertinentes à récupérer dans notre cas :

Liste des appareils

Une fois la ContextKey récupérée, vous pouvez afficher les appareils associés à votre compte :

URL : https://app.melcloud.com/Mitsubishi.Wifi.Client/User/ListDevices
Méthode : GET
Retour : JSON

En-tête : X-MitsContextKey: XXXXXXXXXXXXXX

Et paf, tout un tas de données à récupérer :

Tout d'abord, le bâtiment (building) :

Pour récupérer la température extérieure via un service externe (pour une auto-régulation des appareils par exemple) :

Puis après, l'étage (floor) :

Puis après, la zone (area) :

Puis enfin, l'appareil (device) :

Note: Ce que je nomme par [n] est une instance d'un tableau ou d'un objet.

Dans mon cas, mon compte n'a accès qu'a deux périphériques dans la même zone, sur le même étage et dans le même bâtiment.

État d'un appareil

En plus de la ContextKey, il vous faudra :

URL : https://app.melcloud.com/Mitsubishi.Wifi.Client/Device/Get
Méthode : GET
Retour: JSON
En-tête : X-MitsContextKey: XXXXXXXXXXXXXX

Paramètres :
    id: XXXX,
    buildingID: XXXX

Note: N'oubliez pas que les paramètres en GET, ça set met derrière l'URL ;)

Données pertinentes :

D'autres choses qui nous seront utiles plus tard :

On dispose aussi d'un Name (non utilisé chez moi) et de différents trucs sur la position des ailettes notamment.

Réglage d'un appareil

Pour modifier les propriétés d'un appareil, il va falloir renvoyer l'objet récupéré dans la requête précédente avec nos modifications.

Chaque propriété dispose d'un "flag", le total étant défini dans la propriété EffectiveFlags. Après quelques tests, j'ai trouvé les résultats suivants :

Exemple :

Et ainsi de suite.

Ne pas oublier d'également mettre à jour la propriété HasPendingCommand à true.

On renvoie ensuite l'objet la façon suivante :

URL : https://app.melcloud.com/Mitsubishi.Wifi.Client/Device/SetAta
Méthode : POST
Retour: JSON
En-tête : X-MitsContextKey: XXXXXXXXXXXXXX

Paramètre : L'objet récupéré dans Device/Get modifié selon nos besoins.

Le retour de cette requête nous intéresse, plus précisément la propriété NextCommunication qui contient la date et l'heure à laquelle sera appliquée notre modification.

Du C# pour notre réponse

Logo LELCloud

Rappelez-vous du problème original ! Plutôt que de refaire un outil web, j'ai décidé de poursuivre mon autoformation C# avec cette application codée un peu avec les pieds.

C'est d'ailleurs pour ça qu'il n'y aura pas de sources publiées, mais ne vous inquiétez pas, j'ai reçu ma Pebble Time et je pense qu'une petite télécommande intégrée dans la montre peut être un bon projet pour l'été.

Voici quelques captures d'écran de LELCloud :

Le formulaire de connexion Le formulaire de connexion

Le lobby Le lobby

Page de configuration d'un appareil Page de configuration d'un appareil

Conclusion

Tout peut s'analyser lorsqu'on y met un peu de bonne volonté. Je rappelle que cette application n'a pas été réalisée pour montrer une quelconque défaillance de système, mais juste pour des besoins internes.


J'ai bien lu les termes et conditions de l'application MELCloud, notamment l'extrait suivant :

3.7 Vous devrez : [...] (g) ne pas copier, adapter, modifier, désassembler, décompiler, décrypter ou créer des solutions dérivées basées sur le Système;

Je citerais comme unique réponse :

L'utilisation du reverse engineering est toléré en Europe dans le cas du fair-use, qui l'autorise lorsque l'utilisation des connaissances acquises répond à des besoins d'implémentation d'interfaces ou de correction d'erreurs (débogage).

Source : april.org/le-reverse-engineering-menace


Hebergé sur les serveurs de legtux.org - CC BY-NC-SA 2012-2015, mGeek.