2016-06-08 12 views
0

Ich habe diesen Spektrumanalysator aus den 90ern, der einen Telnet-Client hat. Ich kann mit der Linux Telnet CLI telnet, und das funktioniert großartig ... steuert die Maschine wie erwartet.telnetlib.write() repliziert nicht telnet.interact()

Ich möchte dieses Ding automatisieren, um 100 verschiedene Messungen in einem Set-It-and-Forget-It-Stil-Setup zu machen, also ist Python natürlich.

Ich betrachte das Telnetlib-Modul und habe einige widersprüchliche Ergebnisse ... wohlgemerkt, ich bin immer noch in der Prototyping-Phase, also verwende ich iPython, um diese Arbeit zu erledigen.

Grundsätzlich kann ich verbinden und geben Sie einen interaktiven Client mit telnetlib.interact(), und das funktioniert so gut wie die Linux-Telnet-CLI. Wenn ich jedoch die genaue Debugausgabe nach der Methode telnetlib.write() kopiere, reagiert das Gerät nicht. Eigentlich sagt es so etwas wie undefined header in seiner Diagnoseausgabe, also wird die Nachricht nicht richtig zu ihm übertragen.

Hier ist eine ipython Sitzung Ausgabe:

In [2]: import telnetlib 

In [3]: HOST = "192.168.0.118" 

In [4]: tn = telnetlib.Telnet(HOST, "5024") 

In [5]: tn.set 
tn.set_debuglevel     tn.set_option_negotiation_callback 

In [5]: tn.set_debuglevel(2) 

In [6]: tn.interact() 
Telnet(192.168.0.118,5024): recv b'Welcome to Telnet SCPI Server: agilent\r\nAgilent Te' 
Welcome to Telnet SCPI Server: agilent 
Agilent TeTelnet(192.168.0.118,5024): recv b'chnologies, N1996A, US45310134, A.02.03\r\n\r\nSCPI>\xff\xfb' 
chnologies, N1996A, US45310134, A.02.03 

SCPI>Telnet(192.168.0.118,5024): recv b'\x01\xff\xfb\x03' 
Telnet(192.168.0.118,5024): IAC WILL 1 
Telnet(192.168.0.118,5024): IAC WILL 3 
Telnet(192.168.0.118,5024): recv b'\xff\xfc\x01' 
Telnet(192.168.0.118,5024): IAC WONT 1 
Telnet(192.168.0.118,5024): recv b'\xff\xfc\x03' 
Telnet(192.168.0.118,5024): IAC WONT 3 
freq:star 110khz 
Telnet(192.168.0.118,5024): send b'freq:star 110khz\n' 
Telnet(192.168.0.118,5024): recv b'SCPI>` 
SCPI> 

jedoch, wenn ich sende die gleiche Sache mit

tn.write(b'freq:star 110khz\n'),

nichts passiert ... oder, wenn ich

senden tn.write(b'freq:star 110khz\n\n'),

nichts passiert ns ... keine Fehlermeldungen oder irgendetwas auf dem Gerät. Es ist wie nichts passiert ist.

Ich habe einige Probleme bei Stackoverflow gesehen, die darauf hindeuten, dass das Timing ein Problem ist ... Ich habe keine Ahnung, wie man das beheben kann, indem ich die tn.set_debuglevel(2) als Workaround hinzufüge, um Verzögerung hinzuzufügen, aber das ist wahrscheinlich Missverständnis auf meinem Teil auch.

Ich weiß, dass dieses Instrument erwartet, Dinge im Zeichen-für-Zeichen-Modus zu sehen und nicht sagen, ob der Zeile-für-Zeile-Modus unterstützt wird, wie ich annehme tn.write(foo) sendet Zeug.

Irgendwelche Ideen, wo ich falsch liege?

+0

Wenn man sich zunächst die Textzeilen anschaut, die man erhält, ist das Newline nicht einfach '' n '', sondern '' \ r \ n''. Das zu verwenden, wenn Sie Text senden, könnte ein guter Anfang sein. –

+0

Das hat es behoben ... Ich werde eine Antwort hinzufügen, aber zuerst, um sicherzustellen, dass ich es richtig verstehe und keine falschen Informationen gebe, warum funktioniert das Senden von etwas im Client, der nur ein '\ n' hat? Was macht das erste Lesen genauer, das zeigt '\ r \ n'? – testname123

+0

Bitte [siehe diese alte Antwort von mir] (http://stackoverflow.com/a/14606871/440558), die die Telnet-Standards über "newlines" im Telnet-Protokoll zitiert (und verlinkt). –

Antwort

0

Dies ist ein Duplikat this

benötigt eine \r zum Newline binären Teil der Nachricht hinzuzufügen, so tn.write(b'freq:star 110khz\r wird nicht funktionieren, aber tn.write(b'freq:star 110khz\r\n Willen.

Verwandte Themen