Стартовая страница › Форумы › Rapid SCADA на Linux-контроллерах и Raspberry Pi › JSON в MQTT сообщении
- В этой теме 5 ответов, 3 участника, последнее обновление 6 лет назад сделано Mikhail.
-
АвторСообщения
-
25.03.2018 в 02:21 #8774100hУчастник
Всем привет!
Имеется контроллер, который передает данные по протоколу MQTT. Каждой физической сущности (дискретному сигналу, измерению) соответствует свой MQTT топик.
Логика контроллера реализует опрос входных сигналов с заданной периодичностью, также существуют спонтанные сообщения по изменению состояния заранее определенных каналов.
Сообщение кодируется следующим образом в простой объект JSON (пример):
{"CH_ID:nnn", "val": "ON"|"OFF", "qual": "good"|"bad", "ts":"UNIX timestamp"}
, где
CH_ID — идентификатор сигнала в пределах контроллера,
val — ON или OFF — собственно значение дискретного канала,
qual — качество сигнала (например, при длительном дребезге качество становится bad),
ts — строка Unix time.
Можно ли каким-либо образом декодировать входящие JSON сообщения и извлекать полезную инф.? Для начала хотя бы значение дискрета?25.03.2018 в 16:13 #8777VyacheslavУчастникЕсли вы планируете данную функциональность разрабатывать самостоятельно, то можете посмотреть на функциональность JSONPath.
Эта функциональность используется в задаче для драйвера KpWorkflow, но там используется протокол HTTP. Разместить этот парсер в драйвер KpMQTT для еще одного типа топиков вполне возможно.Если у вас есть время подождать, то данная функциональность появится в одной из будущих версий драйвера KpMQTT.
Либо можем обговорить доработку индивидуальной версии драйвера для вашей задачи.
25.03.2018 в 20:28 #8778100hУчастникСпасибо за ответ.
Я в общем-то разобрался, как распарсить строку, содержащую JSON объект по заданному шаблону при помощи пакета Newtonsoft.Json.using Newtonsoft.Json; public double JsonExtractVal(string s) { public class JSONmessageObject { public string Id { get; set; } public string Val { get; set; } public string Qual { get; set; } public string Ts { get; set; } } // Console.WriteLine(s); JSONmessageObject outobj = JsonConvert.DeserializeObject<JSONmessageObject>(s); // Console.WriteLine("Id: " + outobj.Id); // Console.WriteLine("Val: " + outobj.Val); // Console.WriteLine("Qual: " + outobj.Qual); // Console.WriteLine("Ts: " + outobj.Ts); // Console.ReadKey(); return (outobj.Val == "on") ? 1.0 : 0.0; }
Но вот как это вставить в базу формул, непонятно((
26.03.2018 в 01:08 #8779100hУчастникДобавил парсер JSON в kPMQTT, пока только для нужного мне поля val.
Но в целом поддержку настраиваемых пользователем JSON строк хорошо бы иметь в скаде.26.03.2018 в 11:28 #8780VyacheslavУчастникНа сколько я помню Rapid Scada оперирует значениями типа Double, ну или данными в пределах размера Double. Появились к текущему моменту строки не знаю. А если появились то надо понимать их размер. Потому что будет ограничение на длину сообщения.
Для того чтобы код который вы привели выше заработал нужно добавить пространство имен в файл который отвечает за формулы и скомпилировать проект Rapid Scada с учетом этих изменений. Не могу точно вспомнить используется ли данный файл с формулами как встроенный в проект или подтягивается при каждом запуске как исходник для компиляции с учетом формул полученных из базы конфигурации.
На мой взгляд это не лучшее решение.Предложу решение как это вижу я.
Для драйвера KpMQTT нашел библиотеку парсера JS кода. В качестве параметра в топиках указывал бы ссылку на файл с JS кодом, который будет обрабатывать входящий JSON. На выходе из JS хендлера наполнял данными 3 массива в зависимости от логики. 1 массив содержит CnlData. 2 массив содержит значения комманд. 3 массив содержит значения событий. После выхода из хендлера эти данные можно отобразить в соответствующие классы RapidScada и далее стандартными методами отправить их. Это будет гибко и вся логика останется на уровне драйвера.26.03.2018 в 16:01 #8783MikhailМодераторНужно разбирать JSON на уровне драйвера, т.к. до сервера значения доходят уже в виде double.
-
АвторСообщения
- Вы должны авторизироваться для ответа в этой теме.