Extrai informações contínuas do cliente telnet

0

Eu tenho um sensor industrial que, por meio de um módulo de interface, fornece valores brutos por meio de telnet .

Para se conectar a ele:

  telnet 169.254.168.150 10001

Eu só consigo ver valores de lixo dele.

Informação

As informações que tenho são da folha de dados do módulo Interface.

O sensor é um analógico, portanto, Status flag não é relevante.

Eutenhoalgunssoftwaresdacompanhiaquevisualizamasinformaçõesdosensor.Estesoftwaretambémusaoprotocolotelnetmencionadoacimaparaobterinformações.Euatravesseiocheck-inviaWireShark.Otamanhodopacoteéde22byteseemlittle-endian.

Nãoépossívelobterasinformaçõesprogramaticamentecomominhas SE Query e eu estou olhando para obter o valor talvez armazenar os valores de entrada diretamente em algum lugar (no banco de dados ou arquivo).

Existe alguma maneira de extrair esta informação através da linha de comando?

    
por Shan-Desai 23.11.2018 / 16:04

2 respostas

0

Extrair do pastebin:

00000050  2e 0a 53 41 45 4d 00 00  00 00 f6 04 00 00 15 00  |..SAEM..........|
00000060  00 00 00 00 00 00 00 00  00 00 0c 00 01 00 fa 94  |................|
00000070  00 00 8c 00 00 00 8c 00  00 00 0a 23 00 00 53 41  |...........#..SA|
00000080  45 4d 00 00 00 00 f6 04  00 00 15 00 00 00 00 00  |EM..............|

Então, isso mostra que a informação está toda lá, é little endian, e você só precisa lê-los e analisá-los. Qualquer ferramenta com a qual você esteja confortável fará; um programa C, um programa perl , qualquer coisa que você gosta. Talvez seja necessário pular a saída telnet no início ou usar outra coisa em vez de telnet (por exemplo, nc , netcat , socat ).

Para demonstrar perl , para decodificar um pacote, você faria algo como

cat ... | perl -nle "print join(':',unpack 'a4 (L2 Q L S2 l4)<')"

na linha de comando para o pacote no dump, e obtenha como saída

SAEM:0:1270:21:0:12:1:38138:140:140

Isso só funciona para um determinado número de canais (e a máscara diz que um dos quatro valores de medição não deve estar presente, mas tem um valor; não entendo essa parte).

Se você tiver um número variável de canais dependendo de outras informações, precisará de uma análise mais inteligente.

    
por 26.11.2018 / 15:49
0

Então, aparentemente, pensei no contrário. Como eu estava capturando dados no Wireshark, todos os pacotes eram tcp e apenas os primeiros pacotes eram telnet (informações de iniciação da sessão).

Eu decidi criar um tcp socket usando python e ler os dados de 22 bytes (tamanho disponível no Wireshark Dump)

e usei struct module para unpack da informação. Interessante foi descobrir que a informação do sensor útil veio sempre como a carga TCP alternativa, ou seja, o primeiro pacote tinha apenas informações como preâmbulo , número do artigo , número de série etc. e a carga útil seguinte tinha todas as informações Counter , Valor do Canal 1 , Valor do Canal 2 , Valor do Canal 3

As informações obtidas aqui foram em int32 , que precisa ser convertido em valor apropriado usando uma fórmula mencionada no manual de instruções do módulo

Código

import socket
import struct

# CONSTANTS for Formula
# ....

# Create a TCP/IP socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

server_address = ('169.254.168.150', 10001)
print('connecting to %s port %s' % server_address)
sock.connect(server_address)


def value_mm(raw_val):
""" Formula for conversion """
    return (((raw_val - DRANGEMIN) * MEASRANGE) / (DRANGEMAX - DRANGEMIN) + OFFSET)


if __name__ == '__main__':
    while True:
        Laser_Value = 0
        data = sock.recv(22)
        # First frame
        preamble, article, serial, x1, x2 = struct.unpack('<4sIIQH', data)

        # if this payload is not the preamble, it must be information payload
        if not preamble == b'SAEM':
            status, bpf, mValCounter, CH1, CH2, CH3 = struct.unpack('<hIIIII',data)
            #print(CH1, CH2, CH3)
            Laser_Value = CH3
            print(str(value_mm(Laser_Value)) + " mm")

        print('\n')
    
por 26.11.2018 / 16:41

Tags