Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

Lenovo ThinkPad Stack Assistant

refuge.coop
GPC.solutions SAS
EMA Tech.

Analyse et rétro-ingénierie du protocole vers le routeur et le projecteur en vue d’un éventuel portage Linux.

Lenovo ThinkPad Stack Assistant splash screen

Splash screen de la version Microsoft Windows.

Logiciel

Configuration et mise à jour du routeur et/ou du projecteur.

OS pris en charge

Dernière(s) version(s)

2.0.6 (Mai/Juin 2017).

Surface de rétro-ingénierie

Protocole

(résolu par désassemblage Android apk v2.0.6)

Découverte : mDNS/DNS-SD, browse _http._tcp., filtre serviceName ∋ “StackProjector”, resolveService → host:port dynamique. IP projecteur statique connue : 192.168.33.100.

JSON

Clés du ReceivingThread (v2.0.6)

Affichage / Projection

CléType (déduit)Rôle
keystone_statusStringÉtat correction trapèze
keystone_levelStringNiveau correction trapèze
brightStringLuminosité (ancienne ?)
brightnessStringLuminosité (nouvelle ?)
input-sourceStringSource active (hdmi/usb/miracast…)
hdmiStringÉtat/port HDMI
hdmi_audioStringAudio sur HDMI

Audio

CléTypeRôle
speakerStringVolume/haut-parleur interne
volumnString⚠️ typo Lenovo — volume (à reproduire à l’identique)

Batterie / Powerbank

CléTypeRôle
powerbankStringMode batterie externe
battery-level / battery_levelStringNiveau (%) — deux variantes de séparateur
battery-status / battery_statusStringÉtat (charging/discharging/full)
lowpowerStringAlerte batterie faible

Stockage / HDD

CléTypeRôle
hddStringPrésence HDD interne
hddnameStringNom/volume
hddnumStringNombre partitions/disks
hddtotalcapacityStringCapacité totale
hddtypeStringType (SSD/HDD/…)
usbhddStringPrésence USB
usbhddpathStringMountpoint
usbhddsizeStringTaille

Cast / Média

CléTypeRôle
isMiracastStringMiracast actif
isPlayerStringLecteur multimédia actif
multiCastStringMode multi-écran
pathStringChemin fichier en cours

Réseau / Connectivité

CléTypeRôle
bluetoothStringÉtat BT
isAPStateStringMode point d’accès
routerStringÉtat/rôle routeur

Système / Device

CléTypeRôle
agent_versionStringVersion agent embarqué
versionStringVersion firmware
nameStringNom de l’appareil
languageStringLangue UI
locale / localeidStringLocale
countryStringPays
accessbilityString⚠️ typo — accessibilité
allowNonMarketStringSideloading autorisé

Horloge

CléTypeRôle
year month day hour minuteStringDate/heure (probablement en réponse à un check)

Protocole / Contrôle

CléTypeRôle
checkStringRequête de synchronisation d’état
resultStringRéponse générique
retStringCode retour
FullString⚠️ majuscule — réponse complète ?

Observations critiques pour le portage

  1. Typos à préserver : volumn (pas volume), accessbility (pas accessibility). Le projecteur attend ces chaînes exactes.

  2. Doublons de séparateur : battery-level / battery_level, battery-status / battery_status, bright / brightness. Deux générations de firmware coexistent dans le parser — le port doit accepter les deux ou trancher.

  3. Tout est String (y compris ce qui devrait être Int/Boolean). Le getInt/getBoolean du grep lit probablement une autre classe (le SendingThread ou un handler séparé). Le ReceivingThread parse tout en String.

  4. Full avec majuscule : probablement un flag de réponse complète vs incrémentale. À confirmer en écoutant le flux.

  5. Pas de clé power / on / off : l’extinction passe peut-être par result ou par fermeture de socket. À vérifier.