У меня есть этот анализатор спектра с 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)
отправляет материал.
Любые идеи, в которых я ошибаюсь?
Во-первых, если вы посмотрите на текстовые строки, которые вы получили, это не просто '' \ n'', это '' \ r \ n''. Использование этого при отправке текста может стать хорошим началом. –
Это исправлено ... Я добавлю ответ, но сначала, чтобы убедиться, что правильно его понимаю и не даю неверной информации, почему отправляет что-то в клиенте, у которого есть только '\ n'? Что делает inital чтение более точным, что показывает '\ r \ n'? – testname123
Пожалуйста, [см. Мой старый ответ] (http://stackoverflow.com/a/14606871/440558), который цитирует (и ссылки) стандарты Telnet о «новых строках» в протоколе Telnet. –