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

undefined

Это работает но...вырвиглазно. Почему-то то показания замирают надолго, неудобство с кучей операций для выгрузки их в файл.

Раз уж предстоит ковырять то загляну внутрь корпуса: мультиметр производства Shenzhen Everbest Machinery Industry Co., Ltd.
undefined

на борту имеет широкодоступный модуль HC-05 на основе Bluetooth 2.0 чипа от CSR - BC417 через который и протаскивается весь обмен данными. Именно его включает меню PC Communication - OPEN / CLOSE в интерфейсе.

undefined Модуль прокидывает профиль SPP (Serial port profile) и два порта - один входящий от мультиметра и другой отдельный исходящий из компьютера в сторону мультиметра.

Посмотрев в терминале что происходит при включении связи с PC стало очевидным:

  • Интервал передачи фиксирован жестко: каждые 2 секунды. Чего не хватало там чтоб сделать настраиваемым это - загадка для меня.
  • Протокол имеет плавающий размер кадров. минимум 20 байт - максимум тяжело увидеть но точно больше 60.
  • Четко прослеживаются маркеры начала (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. Разговор ниже пойдет о ней. Визуально оно выглядит примерно следующим образом
undefined


Кнопка Share как-бы намекает что данными можно социально поделиться. Для мультиметра - крайне полезная и незаменимая функция! Продолжим далее: в исходниках обнаружились сигнатуры сразу нескольких семейств разных мультиметров.

undefined

Причем определение какой тип мультиметра сделано довольно оригинальным методом: из имени Bluetooth устройства, а для DT-99** семейства - просто классический "case else" и минимальный размер пакета с данными (21 байт).
Имя протоколов тоже довольно оригинальны, наверное это метафоричная отсылка к принципам использованным при проектировании:
undefined
Меня интересовало DT-9979 и мой протоКал протокол DT99S оказался. Внутри класса тоже много интересного:

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

undefined

2. В пределах одного типа измерений, в кадрах пойманых "гуляет" порядок байт от LSB до MSB.
undefined

3. некоторые биты не читаются. например LoZ фильтр не читался хотя по бинарному дампу видно что бит соответствующий приходит со стороны мультиметра в зависимости от включения или выключения функции.

Но и это не всё. Внимание привлекли классы с животрепещущими в памяти именами
undefinedundefined

Совсем интересно зачем приложению скромного Китайского мультиметра столько всего в нагрузку. Беглый интерес становится еще больше поковыряв по методам классов. Нет, понятно что там есть "социалочка" (кнопка share в UI) но зачем там сбор такого кол-ва данных и отливка их? В приложении мультиметра ?
например по ссылкам на бандлы кода очевидно оно цепляется к социальным сетям Facebook, Foursquare, Gowalla, Twitter.

undefined

 и вполне умеет какие-то файлы пушить и пулить.
undefined

undefined

Но вызывает дерганье глаза: а зачем целые APKашки специфично даунлоадить и исполнять.

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

undefined


К слову - внутри есть криптография AES. ключи и IV. а так-же токены от сервисов.
undefined
очевидно это такое удобное приложение чтоб не забыли показания - оно сразу их везде с точными данными устройства пишет и геолокацией а то вдруг тоже забылось где показания снимались и какие. А тут - читатели напомнят и подскажут. Допустим.
И напомню факт - до 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го есть осцилограф. очевидно что закомментированные у меня куски кода можно докрутить чтоб получать данные с него. но в руках я его не держал поэтому проверить - не могу.