metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2016-11-01 03:06 pm

Типы данных для телеметрии

В процессе пиления датчика co2 столкнулся с такой фигней: если датчик сам не передает тип данных - то каждая доработка софта на контроллере датчика вынуждает дорабатывать и парсер его сообщений, чего делать совершенно нет желания.

Поначалу данные в udp-пакетах с датчика выглядели так: 2016-10-29T21:26:40.990599,ff8601e440402eb92e
Потом вот так, чтобы сразу видеть концентрацию: 2016-10-29T23:48:35.310594,ff86027840042e305e,632

А потом я решил это дело засунуть сразу в эластик с кибаной, чтобы рисовать графики, причем у нас туда данные (мониторинг нашего софта) идут в виде json-объектов в сообщениях через mq-сервер. Наиболее прямой путь такое делать - это поля от датчика разложить в виде полей json-объекта, тогда эластик автодетектит типы полей и все становится сразу доступным для запросов и графиков.
Но прога, которая транслирует udp-пакеты в mq сообщения - вообще говоря, тестовый/отладочный клиент от моей mq-либы и впихивать в нее прибитые гвоздями имена полей от одного конкретного датчика - лютый грех, такой код должен быть универсальным, очевидно.
Поэтому формат пакета превратился в: "utc=2016-10-30T12:04:08.740605,hex=ff8602db40402e30bf,co2=731", а программа просто конвертирует это в json и добивает служебными полями от себя (уникальный идентификатор ноды, тип сообщения, и прочее такое). В таком варианте я смогу, например, добавить еще пакетов от других датчиков - давления, освещенности, влажности, радиации и температуры, не переделывая транслятор.

Фактически, это структурный тип данных - смысл данных определяется тем, какие в нем есть поля. Это очень удобно для обобщенной обработки.

При этом, когда я работаю с чужими железками, там почти всегда типы данных прибиты гвоздями - начиная от просто упакованных бинарных структур, заканчивая csv с позиционным назначением полей или бинарным массивом из кучи бинарных пакетов с CRC и прочим.
Понятно, что так сильно экономится GPRS-трафик для телеметрии и байтики в прошивке, но почему бы этим устройствам сразу после подключения по TCP не передавать метаданные протокола, которые можно было бы грузить в парсер и он автоматом бы становился совместимым с тем, что устройство будет передавать после этого.
Т.е. хотя бы передавать csv заголовок для csv-форматов, или массив "тип, имя, длина" для бинарных структур или еще что-нибудь в том же духе.

[identity profile] aamonster.livejournal.com 2016-11-01 12:35 pm (UTC)(link)
Не могу не отметить, что от изменения формата концентрация CO₂ выросла с 0.632% до 0.731%, что свидетельствует о тяжёлой работе программиста!
:-)
develop7: (dero)

[personal profile] develop7 2016-11-01 12:45 pm (UTC)(link)
ребе, а ви таки изобрели netflow v9!

[identity profile] metaclass.livejournal.com 2016-11-01 01:22 pm (UTC)(link)
По ходу, концентрация зависит от того - пинать херы или работать
Нужно проверить эту идею :)

[identity profile] juan-gandhi.livejournal.com 2016-11-01 02:51 pm (UTC)(link)
Убедительно.
Я еще всегда стараюсь уговорить передать хотя бы версию протокола. Жалко, что ли.

[identity profile] bxs5fss.livejournal.com 2016-11-01 03:48 pm (UTC)(link)
метакласcс, твои дети тупые из-за наследственности, или потому что ты бухал перед зачатием?

[identity profile] berezovsky.livejournal.com 2016-11-01 04:32 pm (UTC)(link)
А потом метаданные метаданных.

А потом метаданные метаданных метаданных.

А потом метаданные метаданных метаданных метаданных.

А потом метаданные метаданных метаданных метаданных метаданных.

А потом метаданные метаданных метаданных метаданных метаданных метаданных.

А потом метаданные метаданных метаданных метаданных метаданных метаданных метаданных.

А потом метаданные метаданных метаданных метаданных метаданных метаданных метаданных метаданных.

[identity profile] blackyblack.livejournal.com 2016-11-01 05:30 pm (UTC)(link)
А чё бы вместо того, чтобы формат с utc=X колхозить, не слать сразу в JSON? Погляди, у Рича Хикки есть лекция на тему in-band/out-band форматов передачи данных.

[identity profile] aamonster.livejournal.com 2016-11-01 05:31 pm (UTC)(link)
По моим экспериментальным данным, теин и кофеин вытесняют CO2. Особенно с булочками.
(все идут на кухню, открыв окно)

[identity profile] metaclass.livejournal.com 2016-11-01 05:43 pm (UTC)(link)
Да мне лень было питоно-либу для json вспоминать :)

[identity profile] metaclass.livejournal.com 2016-11-01 05:44 pm (UTC)(link)
Оно замыкается на метаданных метаданных уже.
Получается метациркулярный интерпретатор метаданных, это хороший кстати тест-кейс для проверки таких вещей. Если метаданные могут описать сами себя полностью - значит все сделано хорошо.

[identity profile] berezovsky.livejournal.com 2016-11-01 05:45 pm (UTC)(link)
он хикки?

[identity profile] blackyblack.livejournal.com 2016-11-01 06:30 pm (UTC)(link)
Дак там без либы можно: sprintf(buffer, "{\"%s\":\"%s\"}", key, value)

[identity profile] metaclass.livejournal.com 2016-11-01 07:41 pm (UTC)(link)
Не, так нельзя, бог накажет. Когда туда кто-нибудь при рефакторинге строки с переносами и кавычками сунет :)

[identity profile] antontsau.livejournal.com 2016-11-01 08:30 pm (UTC)(link)
а потом кто-то купит этот датчик не для прикручивания к опердени с метапротоколами и либой в два гигабайта, а чтоб с него какой-нибудь холодильник примитивную единственную величину брал и в своем мозжечке на ардуине переваривал. И свихнется.

[identity profile] metaclass.livejournal.com 2016-11-01 10:06 pm (UTC)(link)
Либа кстати 1.6 мб размером и написана на сишечьке :)
А вместо ардуины ща ставят stm32, в который я уже впихивал парсеры на конечных автоматах, сгенерированные рагелем да плюс командную строку с виртуального ком-порта :)

[identity profile] maksenov.livejournal.com 2016-11-02 03:30 am (UTC)(link)
В больших компаниях проблема с идентификацией сигнала решается достаточно просто с т.з. конечного потребителя: телемеханики конфигурируют SCADA так, чтобы данные с датчиков маркировались уникальным тегами, и потом выдавались на OPC-совместимый эндпоинт.

Проблемы начинаются когда данные:
а) не сэмплированы;
б) не фильтрованы;
в) непонятно в каких единицах измерения.

Еще хуже, когда измерения по одной и той же физической величине валятся в разных единицах измерения. Или со временем по тому же тегу UOM меняется, т.к. поменяли исходный прибор.

Т.к. мы находимся уже после OPC-сервера, то решать приходится проблемы не с самим протоколом, а с озвученными выше. Там мы просто наколхозили модель метаданных по каждому измерению и источнику данных и сопоставляем их между собой. Поначалу страшно, но когда привыкаешь - удобно.

[identity profile] b00ter.livejournal.com 2016-11-03 06:40 pm (UTC)(link)
Нет ли здесь призыва к ASN.1?