2016-06-08 1 views
0

У меня есть этот анализатор спектра с 90-х годов, на котором есть клиент telnet. Я могу подключиться к telnet с CLI Linux telnet, и это отлично работает ... управляет машиной, как ожидалось.telnetlib.write() не реплицирует telnet.interact()

Я хотел бы автоматизировать эту штуку, чтобы выполнить 100 различных измерений в настройке стиля set-it-and-forget-it, поэтому Python является естественным.

Я смотрю на модуль telnetlib, и у меня есть некоторые противоречивые результаты ... заметьте, я все еще на этапе прототипирования, поэтому я использую iPython для выполнения этой работы.

В принципе, я могу подключиться и ввести интерактивный клиент с telnetlib.interact(), и это работает примерно так же, как CLI Linux telnet. Однако, когда я копирую точный вывод отладки в метод telnetlib.write(), инструмент не отвечает. Фактически, он говорит что-то вроде: undefined header в его диагностическом выходе, поэтому сообщение не передается ему правильно.

Вот IPython выход сессии:

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> 

однако, если я посылаю то же самое с

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

ничего не происходит ... или, если я посылаю

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

ничего не было happe ns ... никаких сообщений об ошибках или что-либо на инструменте. Как будто ничего не случилось.

Я видел некоторые проблемы в stackoverflow, которые указывают на то, что время является проблемой ... Я не знаю, как исправить это, кроме как добавив tn.set_debuglevel(2) в качестве обходного пути для добавления задержки, но это, вероятно, непонимание на моем часть также.

Я действительно знаю, что эти инструменты ожидают увидеть вещи в посимвольном режиме и не говорят, поддерживает ли линейный режим, как я полагаю, tn.write(foo) отправляет материал.

Любые идеи, в которых я ошибаюсь?

+0

Во-первых, если вы посмотрите на текстовые строки, которые вы получили, это не просто '' \ n'', это '' \ r \ n''. Использование этого при отправке текста может стать хорошим началом. –

+0

Это исправлено ... Я добавлю ответ, но сначала, чтобы убедиться, что правильно его понимаю и не даю неверной информации, почему отправляет что-то в клиенте, у которого есть только '\ n'? Что делает inital чтение более точным, что показывает '\ r \ n'? – testname123

+0

Пожалуйста, [см. Мой старый ответ] (http://stackoverflow.com/a/14606871/440558), который цитирует (и ссылки) стандарты Telnet о «новых строках» в протоколе Telnet. –

ответ

0

Это дубликат this

, необходимый для добавления \r к новой строке двоичной части сообщения, так tn.write(b'freq:star 110khz\r не будет работать, но tn.write(b'freq:star 110khz\r\n будет.