Может кто-нибудь помочь с получением значений из сообщений в формате
JSON? Буду крайне признателен.
У меня прилетают сообщения по MQTT в JSON. К примеру одно из наиболее маленьких:
[{"ts":1657711987000,"ms":{"ru1":{"force":-99999,"temp":-2000,"ts":0},"ru2":{"force":-99999,"temp":-2000,"ts":0},"ru3":{"force":-99999,"temp":-2000,"ts":0},"meteo":{"airt":0.000000,"ah":0,"wd": 0,"ws":0.000000}},"hs":"ba5e11c1eacd3873e308427667 5a8d0a"}]
На входе массив структур(судя по квадратным скобкам), который состоит из: переменной ts, структуры ms и переменной hs.
Структура ms в свою очередь состоит из структур ru1-3 и структуры meteo.
Структуры ru1-3 состоят из полей: force, temp, ts.
Структура meteo состоит из полей: airt, ah, wd, ws.
Т.е. по сути получается «матрёшка» из полей, вложенных в структуры, которые в свою очередь вложены в ещё одну структуру, которая с двумя переменными составляет массив.
Я создавал все эти структуры с соответствующими полями и потом вкладывал одно в другое, как указанно в разделе справки «Соответствие элементов JSON и MasterScada 4D.
Далее чтобы было более понятно
[{"ts":1657711987000,
"ms":{
"ru1":{"force":-99999,"temp":-2000,"ts":0},
"ru2":{"force":-99999,"temp":-2000,"ts":0},
"ru3":{"force":-99999,"temp":-2000,"ts":0},
"meteo":{"airt":0.000000,"ah":0,"wd":0,"ws":0.0000 00}
},
"hs":"ba5e11c1eacd3873e3084276675a8d0a"}]
Согласно справки имена ключей и типы данных должны совпадать. Разработчики устройства, с которого летят сообщения дали мне типы данных: "[{"ts":%lld,"ms":{%s"meteo":{"airt":%f,"ah":%d,"wd" :%d,"ws":%f}},"hs":"%s"}]"
Как я понял это написано на С. Я сопоставил эти типы данных с данными в 61131-3. Сделал, как указанно в справке создал свой сложный тип данных. Структуру meteo с полями airt,ah,wd,ws, структуры ru1-3 с полями force, temp,ts. Вложил в структуру ms и конечную струтуру с полями ts, hs. И всё это в массив.
Назначал полученный тип данных параметру канала и в ответ нули. Датчиков на девайсе нет но, ts-вермя и hs- контрольный хэш должны прилетать.
Возвращаю исходный тип данных, вижу, строку в которой есть данные.
Ещё если назначить конечным типом данных массив структур( о чём говорят квадратные скобки) то, на выходе и массив, и теперь из 3-х строк.
А если назначить конечным типом данных структуру(что согласно справке будет не верно) то, всё раскладывается на отдельные параметры но, в них нули, как написано выше.
Через функцию STRING_TO_OBJECT тоже пытался. Тоже не работает.
Справка - фуфло. Написана не прозрачно и не однозначно. У ТП как всегда всё работает, всё здорово, "Не понимаем в чём у вас проблема". Способ конвертации
крайне неудобен, нужно всё сообщение до последнего ключа раскладывать, а бывают сообщения ооооооооооочень длинные.
[{"ts":1658146763000,"status":"RN","hw_version":"00 01","base": {"status":"","GSM":"Op: MegaFon RUS, RSSI: -51dBm, BER: 6.400000%","versions": {"hw_version":"0001","fw_version":"NO","fw_bckup_s table_version":"NO","fw_status":"FC"},"data":{"brd _temp":37.000000,"voltage":14.157000,"uptime":5342 31,"rf_status":""}},"cab": {"status":"DO,"},"ru1":{"status":"","b1":{"voltage ":3.410000,"value_charge":20.000000},"brd_temp":29 ,"channel_occup_attempt": 0,"sessions_nak":0,"ru_ltota":1658146756000,"ru_rs si":-66,"rf_ru_rssi":0},"anem": {"temp":0.000000,"status":"WDL"},"t_hum": {"status":"THDL"},"hs":"b7ed13745b79f42642a7eeada4 9f3c5a"}]
А мне нужен лишь один ключ. И что делать???
Прилагаю скрины то, как делал и результаты.
PS.
Ещё момент, если в сообщении прилетают ключи с именами, совподающими с зарезервированными словами 61131-3 - беда! Т.к. по справке имена полей должны совпадать с ключами. Ничего не сделать.
В TeslaScada2 это реализовано по другому, у них не используется 61131-3 и реализовано на мой взгляд удачнее. Необязательно всё сообщение до последнего ключа преобразовывать но, ручками поработать придётся тоже.
Вложение 61792Вложение 61793Вложение 61794Вложение 61795Вложение 61796Вложение 61797Вложение 61797Вложение 61798Вложение 61799Вложение 61800