Como extrair um campo específico de uma estrutura JSON recebida via MQTT?

Boa tarde,

Estou usando o Scada-LTS v2.7.6.1 build 6640531928 via MQTT para receber a seguinte estrutura em JSON:

{“params”: {“payload”: “MjguNTc=”, “port”: 50, “duplicate”: false, “counter_up”: 42, “rx_time”: 1725979221.3944535, “encrypted_payload”: “5Cwy32U=”}, “meta”: {“network”: “358b679dd88d47948f6e108677b4b79a”, “packet_hash”: “cae399152704ba4474220e07935d3faf”, “application”: “0101010101010101”, “device_addr”: “01b44e33”, “time”: 1725979221.447, “device”: “0005168000135e08”, “packet_id”: “a892a1cb3a80ced29a5010748a77b4cc”, “gateway”: “b0fd0b7003d60000”}, “type”: “uplink”}

Preciso extrair somente o valor da chave “payload” (o valor para essa chave vai mudar conforme recebo novos pacotes de dados) e converter a informação (alfanumérica) que está em base64 para apresentar na watch list, não tenho conhecimento em programação, alguém poderia me indicar se é possível ser feito e o que eu devo estudar para conseguir executar?

Você pode usar um point link para converter a informação via script. Como os scripts do ScadaBR/-LTS usam Javascript, é possível chamar um JSON.parse().

Exemplo hipotético de point link:

// Analisa o código JSON
var objeto = JSON.parse(source.value);
// Payload em Base64
var payloadB64 = objeto.params.payload;

// Pseudocódigo de conversão base64
var payload = converteParaString(payloadB64);
// Fim do pseudocódigo

// Retorna o valor convertido (obrigatório)
return payload;
1 curtida

Vou tentar implementar a sugestão e retorno aqui o resultado.
Obrigado pela ajuda.

Caro Celso,

O código apresentou o objeto separando o valor da chave “payload” com sucesso, porem na conversão apresenta a mensagem “ReferenceError: “converteParaString” is not defined. (#7)”
image

Na linha 7 tentei substituir o método por outros como ** atob() sem sucesso **, base64Decode() sem sucesso ou .toString(); sem sucesso, mas esse ultimo o script mostra corretamente o valor da chave payload que no momento recebe MjcuMjksMzI1 = 27.29,325

Boa noite,

A função “converteParaString()” do meu exemplo na verdade não existe, é só um pseudocódigo para exemplificar como seria a utilização. Quanto a atob(), infelizmente ela não faz parte do “núcleo” da linguagem Javascript mas sim ao DOM, que é um conjunto de recursos separado que não existe nos point links do ScadaBR.

Entretanto, os scripts do ScadaBR podem acessar qualquer classe do Java 8, e a JVM tem recursos para lidar com Base64: https://www.baeldung.com/java-base64-encode-and-decode

Com base nisso, você poderia implementar uma função de decodificação de Base64 usando classes Java. Exemplo:

// Implementação da função de decodificação de Base64
function converteParaString(textoB64) {
    var decoder = java.util.Base64.getDecoder();
    return String(new java.lang.String(decoder.decode(textoB64)));
}

EDIT: corrigido o código da função. Por alguma razão você precisa forçar uma conversão para String Java com new java.lang.String().

Ok ótimo, agradeço mais uma vez pelo grande auxílio e explicações, vou implementar por aqui e retorno com o resultado.

Muito obrigado!!

Boa noite, Celso.

Inseri o código abaixo no point link:

// Analisa o código JSON
var objeto = JSON.parse(source.value);
// Payload em Base64
var payloadB64 = objeto.params.payload;

// Implementação da função de decodificação de Base64
function converteParaString(payloadB64) {
var decoder = java.util.Base64.getDecoder();
return String(new java.lang.String(decoder.decode(payloadB64)));
}

Que apresentou a mensagem:

Resultado do script: org.mozilla.javascript.Undefined@0

Atualmente o valor para a chave payload é o seguinte: MjcuMTAsOTQzNDguODMsLTIzLjIwOTYwNCwtNDUuOTAwNTY2MjcuMTAsOTQzNDguODMsLTIzLjIwOTYwNCwtNDUuOTAwNTY2

Representado quatro números decimais com ponto e separados por vírgula: 27.10,94348.83,-23.209604,-45.900566
image

Você adicionou a implementação da função no código, está retornando undefined porque você esqueceu de invocar a função implementada e fazer o script retornar um valor final. Adicione isto aqui na última linha do seu script e vai funcionar:

return converteParaString(payloadB64);

image
Agora deu certo.
Muito obrigado!!!