Мультиметр DT-9979 фирмы CEM и получение показаний на PC
В ходе одного из проектов, понадобился еще один мультиметр который бы показания мог на сторону компьютера отдавать.
Поскольку у DT-9979 старенького (модель 2011 года) помню анонсировался Bluetooth линк то стал искать в сети поддержку данного прибора. По большей части было интересно в TestController получить его поддержку. Но не нашел вообще ничего, кроме пожалуй таких же запросов как у меня: получить показания все его на компьютере в машино-обрабатываемом виде.
Что-бы просто увидеть показания достаточно воспользоваться его "штатным" софтом единственным что есть Bluetooth Multimeter.exe 3.1мегабайта и сопутствующим Help.chm на 2.2мегабайта.

Это работает но...вырвиглазно.
Заглянем внутрь корпуса: мультиметр производства Shenzhen Everbest Machinery Industry Co., Ltd. 
на борту имеет широкодоступный модуль HC-05 на основе Bluetooth 2.0 чипа от CSR - BC417 через который и отсылаются показания.
Модуль показывает профиль SPP (Serial port profile) и два порта - один входящий от мультиметра и другой отдельный исходящий из компьютера в сторону мультиметра.
Посмотрев в терминале что происходит при включении связи с PC стало очевидным:
- Интервал передачи фиксирован жестко: каждые 2 секунды. Чего не хватало там чтоб сделать настраиваемым это - загадка для меня.
- Протокол имеет плавающий размер кадров
- Четко прослеживаются маркеры начала (0xA0) и конца кадра (0xA1)
- Протокол бинарный но зачем-то, непонятно зачем, есть человеческие куски текста говорящие о положении переключателя режимов измерений
Поскольку тратить много времени на изучение обратное протокола совсем не хотелось (проект надо было доделывать) и ковырять приложение под Windows тоже не быстро я вспомнил что для Android существовало по меньшей мере 3 приложения для подключения различных устройств CEM к андроиду.
Вспоминаются приложения Meterbox IMM, Meterbox Classic, Meterbox Pro. Первые два приложения из Google Play "исчезли". В моменте точно помню что в 2017 году были. Ладно беру старинный андроид телефон и пробую поставить туда ту что есть в GPlay - Meterbox Pro. Увы мультиметр она не находит. хотя сам он прицепился к телефону. В комментариях отзывах приложения впринципе люди и пишут что он не цепляется к моей модели DT-9979. Что-ж - неудача :(
Не беда. можно воспользоваться всякими складами приложений APK типа apkpure и остальными где еще можно разыскать первые два приложения. Выясняется что последняя доступная версия 1.6 приложения была в 2019 году опубликована. дальше в 2020 году оно исчезло из Google Play. Возьмем именно её сразу и посмотрим на кишки под микроскопом инструмента jadx.
Забегая вперед - я скачал и Meterbox Pro APKашку. Оказалось что он впринципе не поддерживает так называемые старые мультиметры базирующиеся на других протоколах отличных от текущего. Печально.
Но дальше все-таки продолжим изучать Meterbox IMM. Визуально оно выглядит примерно следующим образом
В ней обнаружились сигнатуры сразу нескольких семейств разных мультиметров.

Причем определение какой тип мультиметра сделан довольно оригинальным методом: из имени Bluetooth устройства и для DT-99** семейства - просто классический "case else".
Имя протоколов тоже довольно оригинальны, наверное это метафоричная отсылка к принципам использованным при проектировании:
Меня интересовало DT-9979 и мой протоКал протокол DT99S оказался. Внутри класса тоже много интересного:
1. В некоторых измерениях помимо значений еще и преобразования необходимо делать в расчетах для получения финального значения. Это кажется мне любопытным потому что, кажется, нарушается принцип "единой точки правды". В классических приборах настольных с LXI протоколом и системой команд SCPI там измерения и расчеты все происходят строго внутри самого прибора. Та самая единая точка. А здесь - получается мультиметр показывая значения на своем дисплее считает по-своему, софтина android - по своему считает, компьютерная Windows-версия может еще как-то по своему считать. При этом всем данный прибор CEM DT-9979 зарегистрирован в ГРСИ РФ (номера: 97326-25 , 58550-14). функция на 276й строке меняет значение переменной из 275й строки.

2. В пределах одного типа измерений, в кадрах пойманых порядок байт гуляет от LSB до MSB.
Но и это не всё. Внимание привлекли классы с животрепещущими в памяти именами

Совсем интересно зачем приложению скромного Китайского мультиметра столько всего в нагрузку. Беглый интерес становится еще больше поковыряв по методам классов. например очевидно оно цепляется к социальным сетям Facebook, Foursquare, Gowalla, Twitter.

и вполне умеет туда сюда файлы пушить и пулить

Причем даже целые APKашки специфично.
Помимо этого оно пытается сгрести все до чего может дотянуться: Данные о телефоне, сотовых сетях окружающих, геологации, блютус встреченные устройства, wifi сети, данные о железе самого устройства (включая процессор, видеодевайс), под раздачу попадает даже микрофон. Потом формируя из этого конкатенацией строк огромный xml.

К слову - внутри есть криптография AES. ключи и IV. а так-же токены от сервисов.
очевидно это такое удобное приложение чтоб не забыли показания - оно сразу их везде с точными данными устройства пишет и геолокацией а то вдруг тоже забылось где показания снимались. Допустим.
И напомню факт - до 2020 года этот софт был спокойно доступен в Google Play. Интересно как-же так пропустила платформа такой кладезь мимо своих сканнеров? Ведь подчас люди которые пишут софт без "довесов" не могут получить внятного описания что-же не нравится платформе которая не дает опубликовать их софт!
Оставлю, пожалуй, интересующейся общественности дальнейшее доковыривание сей интересной программы, а сам вернусь к реализации взаимодействия с мультиметром через COM-порт bluetooth. Для получения MVP достаточно просто лежащего под рукой у меня Python 3.x версии.
Для быстрого получения "рыбы" было совершено танго с Claude Code и магическими нейронами Java кусок протокола был превращен в Python кусок протокола. После чего результат допиливался до более-менее состояния руками уже. В процессе допиливания и были обнаружены особенности. Например мультиметр не отсылает значение Reference омического для режима dBM/dBV измерений. хотя на дисплее позволяет его менять ступеньками от 4 до 1000ом. (600 - по умолчанию). А значение LoZ фильтра включенного бит неправильно был интерпретирован в оригинальном коде. Так-же было обнаружено масса неиспользуемых переменных, часть дублирующихся. а некоторая часть никак "наружу" не показывала своего статуса. Вообщем - полный набор приколюшек.
Итогом сейчас есть рабочий код который логгирует от нескольких моделей в CSV-файлы раздельные (в зависимости от роторного переключателя режимов измерений) данные. взять можно с github.
Помимо моего DT-9979 должны быть рабочими так-же модели DT-9989, DT99s, FI279MG. У 89го есть осцилограф. очевидно что закомментированные у меня куски кода можно докрутить чтоб получать данные с него. но в руках я его не держал поэтому проверить - не могу.
There are no published comments.
New comment