пятница, 30 мая 2025 г.

Реверс инжениринг программы Test Controller

Эта статья появилась из комментария к моему обзору Test Controller на Хабре:

VC8145 не заработал, пишет что таймаут. В конфигурационном файле для него в общем-то и менять нечего. Но, насколько я понял из конфигурационного файла, он если и заработает, то умеет читать только число с основного дисплея (это я и сам умею:)). Поскольку официальной документации протокола я не нашел, мне было бы интересно посмотреть, как читаются данные с дополнительного дисплея, но увы...

Мне стало любопытно как Test Controller работает с мультиметром VC8145. Конфигурация для VC8145 действительно "скромная":

#idString Vici,VC8145
#name Vici VC8145
#handle VC8145
#driver VC8145
#port comfixedbaud
#baudrate 9600N81Rd
#help VC8145

#interfaceType DMM
#interface readValue 0

Есть только метаданные и указание драйвера VC8145, который реализован в TestController.jar. Однако узнать как он реализован несложно - Test Controller написана на Java и если автор программы не ставил цель скрыть исходный код, то достаточно загрузить этот файл в любой декомпилятор Java. Например в Java Decompiler.

Для запуска Java Decompiler понадобится Java Runtime Environment. Установка JRE для Debian 12 выглядит так:

$ sudo apt-get update
$ sudo apt-get install openjdk-17-jre
$ java -version
openjdk version "17.0.15" 2025-04-15
OpenJDK Runtime Environment (build 17.0.15+6-Debian-1deb12u1)
OpenJDK 64-Bit Server VM (build 17.0.15+6-Debian-1deb12u1, mixed mode, sharing)

Установка Java Decompiler 1.6.6

$ JD_VERSION=1.6.6

$ mkdir ~/.local/JavaDecompiler/

$ curl -Lo ~/.local/JavaDecompiler/jd-gui-${JD_VERSION}.jar https://github.com/java-decompiler/jd-gui/releases/download/v${JD_VERSION}/jd-gui-${JD_VERSION}.jar
$ curl -Lo ~/.local/JavaDecompiler/icon.png https://raw.githubusercontent.com/java-decompiler/jd-gui/v${JD_VERSION}/app/src/main/resources/org/jd/gui/images/jd_icon_128.png

$ cat > ~/.local/share/applications/JavaDecompiler.desktop <<_EOF_
[Desktop Entry]
Name=Java Decompiler
Path=$HOME/.local/JavaDecompiler/
Exec=java -jar $HOME/.local/JavaDecompiler/jd-gui-${JD_VERSION}.jar
Icon=$HOME/.local/JavaDecompiler/icon.png
Categories=Development
Version=1.0
Type=Application
Terminal=false
_EOF_

Запускаю Java Decompiler и загружаю в него файл ~/.local/TestController/TestController.jar

В итоге в dk.hkj.devices.DeviceVC8145 находится код драйвера для нужного мультиметра.

Автору комментария этот код не даёт новых знаний, т.к. его интересовали команды чтения показаний дополнительного экрана, но в EEVBlog forum нашлось сообщение где дали ссылку (http://www.26th.net/blog/vichy-vici-vc8145-digital-multimeter-rs232-protocol/) на реверс протокола для VC8145.

На данный момент ссылка уже не открывается, но её можно посмотреть через WayBack Machine.

Попутно заметил использование библиотеки com.github.sarxos.webcam и некоторую функциональность относящуюся к камере:

  • dk.hkj.main.CameraDigits
  • dk.hkj.main.PopupCameraInput
  • dk.hkj.main.PopupCameraSelect

Поизучал dk.hkj.main.Main и нашёл скрытый параметр запуска, который активирует дополнительный пункт "Camera" в "Popups".

Если выбрать этот пункт, то открывается меню настроек

По клику на кнопку "Show" открывается предварительный просмотр камеры на котором видны цифры согласно выбранному формату. Я попробовал считывать показания индикатора, но то ли этот функционал ещё не готов, то ли его нужно как-то иначе настраивать, но у меня не получилось считывать таким образом показания.

Идея интересная - считывать показания устройств, которые не имеют связи с компьютером. Я видел что-то подобное в стендах поверки мультиметров. Там показания считывались камерой, а не через компьютерный интерфейс.

Ради интереса связался с автором программы и попросил описать эту функцию. Автор ответил что она экспериментальная и скрыта по причине её неготовности.

Комментариев нет:

Отправить комментарий