Ich habe mich daher darangemacht, eine eigene Software zu schreiben, um die Lüfter- und Temperaturdaten auszulesen und die Systemdaten an das Panel zu schicken. Dabei wollte ich auch gleich gucken, ob statt der Bildschirmauflösung (die bei 'nem Server uninteressant ist) evtl. die IP-Adresse oder ähnliches angezeigt werden kann.
Dekompilieren der Original-Software (IndicatorSystem.exe)
Die mitgelieferte Software ist in Visual Basic geschrieben, dekompilieren hat aber nicht wirklich funktioniert - entweder ich hab keinen gescheiten Dekompiler gefunden, oder es ist bei VB einfach so, dass da viel Assembler rauskommt.Mitsniffen der USB-Daten
Vielversprechender war dann das Mitsniffen der per USB übertragenen Daten vom und zum Panel. Das Panel meldet sich als Human Interface Device (HID) an, dadurch ist schon mal kein gesonderter Treiber notwendig.Mit USBTrace von SysNucleus hab ich dann schnell gesehen, dass jeweils 8 Bytes an das Panel geschickt werden und dieses mit 8 Bytes antwortet. Recht einfach ist dies bei Datum und Uhrzeit zu erkennen:
24 ist dabei der Code für Datum/Uhrzeit, danach folgen Jahr, Monat, Tag, Stunde, Minute als einzelne Bytes (lustigerweise ist das eine Hex-Darstellung; da es 16:43 ist, müsste da eigentlich 10 und 2B stehen), eine 0 als Füllzeichen und eine Checksumme.
Das Panel antwortet dann mit 24 0 0 0 0 0 0 und ner Checksumme, falls es geklappt hat.
Ähnlich einfach sind die anderen Übertragungen für Bildschirm-Auflösung, CPU-Frequenz, RAM und Festplatte zu erkennen.
Messwerte werden vom Panel mit einer leeren Übertragung (18 0 0 0 0 0 0 für Temp1 und Temp2) angefordert, dieses antwortet dann mit einer Nachricht, die die Temperaturen bzw. Lüftergeschwindigkeiten enthält.
Checksumme
Getüftelt habe ich am Algorithmus für die Checksumme. Die hängt von der Summe der ersten 7 Bytes ab, soviel war klar. Ein bisschen Gebastel mit Excel und nem Taschenrechner später bin ich dann draufgekommen, dass die mittleren 4 Bits invertiert werden, sprich "Summe XOR 00111100" liefert die Checksumme.Ansteuern des Panels mit C#
Obwohl ein HID angeblich das am Einfachsten anzusteuernde USB-Gerät ist, gibt es kaum verständliche Beispiele mit C#-Code dafür im Netz.Viele funktionieren noch dazu nicht mit x64, weil irgendwelche dubiosen Strukturen in den DLL-Aufrufen da eine andere Größe haben und man da erst mühsam die richtigen Größen reinpatchen muss, das Schreiben hat dann allerdings mit einigen Beispiel-Bibiotheken funktioniert. Nur die Antwort des Panels habe ich nie zurückbekommen.
Funktioniert hat es dann schließlich mit einer stark vereinfachten Klasse auf Basis von Jan Axelsons Code, die einen Report an das Gerät schickt und endlich auch einen Report als Antwort zurückbekommt.
Nun schnell noch über WMI die notwendigen Daten abfragen und umrechnen, fertig ist der erste Prototyp:
Es werden hier noch keine Temperaturen / Lüfterdaten ausgelesen, und es wird auch noch die Bildschirmauflösung genommen (die krummen Werte kommen von der Remote Desktop-Verbindung), aber es funktioniert:
Die Performance des Prototyps ist (selbst bei sekündlicher Aktualisierung des Panels, was völliger Overkill ist) deutlich besser:
Der Speicherverbrauch ist allerdings etwas höher (23 MB statt 4 MB), das liegt aber an der .NET-Umgebung, dafür kann ich nichts :)
Update (2009-01-24):
Inzwischen habe ich einen Windows-Forms-Prototypen fertig, der schon mal die Messwerte anzeigt:
Downloads
Das Microsoft .NET Framework 3.5 oder besser wird benötigt.- Prototyp (hässliche Konsolenanwendung, nichts einstellbar, keine Messwerte): hidtest.zip
- zweiter Prototyp (hässliche Windows-Anwendung, nichts einstellbar, aber Messwerte): cDigiWin.zip
ToDo
- Test auf x86
Windows-Forms-Anwendung daraus machen, die im Hintergrund läuft und auch Messwerte anzeigt- Konfigurierbar machen, welches Laufwerk für die Festplatten-Platz-Anzeige verwendet wird
IP statt Auflösung darstellen(noch nicht wahlweise)- Benachrichtigung per E-Mail, wenn Temperatur zu hoch oder Lüfter zu langsam