metaclass: (Default)
[personal profile] metaclass
В процессе пиления датчика 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-форматов, или массив "тип, имя, длина" для бинарных структур или еще что-нибудь в том же духе.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Profile

metaclass: (Default)
metaclass

April 2017

S M T W T F S
      1
2345678
9101112 131415
16171819202122
23242526272829
30      

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jun. 15th, 2025 07:00 am
Powered by Dreamwidth Studios