JSON в MQTT сообщении

Помечено: ,

  • В этой теме 5 ответов, 3 участника, последнее обновление 6 лет назад сделано Mikhail.
Просмотр 6 сообщений - с 1 по 6 (из 6 всего)
  • Автор
    Сообщения
  • #8774
    100h
    Участник

    Всем привет!

    Имеется контроллер, который передает данные по протоколу 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 сообщения и извлекать полезную инф.? Для начала хотя бы значение дискрета?

    • Эта тема была изменена 6 лет назад от 100h.
    • Эта тема была изменена 6 лет назад от 100h.
    #8777
    Vyacheslav
    Участник

    Если вы планируете данную функциональность разрабатывать самостоятельно, то можете посмотреть на функциональность JSONPath.
    Эта функциональность используется в задаче для драйвера KpWorkflow, но там используется протокол HTTP. Разместить этот парсер в драйвер KpMQTT для еще одного типа топиков вполне возможно.

    Если у вас есть время подождать, то данная функциональность появится в одной из будущих версий драйвера KpMQTT.

    Либо можем обговорить доработку индивидуальной версии драйвера для вашей задачи.

    #8778
    100h
    Участник

    Спасибо за ответ.
    Я в общем-то разобрался, как распарсить строку, содержащую 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;
    }
    
    

    Но вот как это вставить в базу формул, непонятно((

    #8779
    100h
    Участник

    Добавил парсер JSON в kPMQTT, пока только для нужного мне поля val.
    Но в целом поддержку настраиваемых пользователем JSON строк хорошо бы иметь в скаде.

    #8780
    Vyacheslav
    Участник

    На сколько я помню Rapid Scada оперирует значениями типа Double, ну или данными в пределах размера Double. Появились к текущему моменту строки не знаю. А если появились то надо понимать их размер. Потому что будет ограничение на длину сообщения.

    Для того чтобы код который вы привели выше заработал нужно добавить пространство имен в файл который отвечает за формулы и скомпилировать проект Rapid Scada с учетом этих изменений. Не могу точно вспомнить используется ли данный файл с формулами как встроенный в проект или подтягивается при каждом запуске как исходник для компиляции с учетом формул полученных из базы конфигурации.
    На мой взгляд это не лучшее решение.

    Предложу решение как это вижу я.
    Для драйвера KpMQTT нашел библиотеку парсера JS кода. В качестве параметра в топиках указывал бы ссылку на файл с JS кодом, который будет обрабатывать входящий JSON. На выходе из JS хендлера наполнял данными 3 массива в зависимости от логики. 1 массив содержит CnlData. 2 массив содержит значения комманд. 3 массив содержит значения событий. После выхода из хендлера эти данные можно отобразить в соответствующие классы RapidScada и далее стандартными методами отправить их. Это будет гибко и вся логика останется на уровне драйвера.

    #8783
    Mikhail
    Модератор

    Нужно разбирать JSON на уровне драйвера, т.к. до сервера значения доходят уже в виде double.

Просмотр 6 сообщений - с 1 по 6 (из 6 всего)
  • Вы должны авторизироваться для ответа в этой теме.