2017-05-06 11 views
0

IP 장치를 통한 비디오의 텔넷 데이터에 RS232 명령을 전송하려고합니다. 그것은 테라 기간 및 창 프롬프트 텔넷 명령 사용하여 완벽하게 작동하지만 (telnetlib) 파이썬을 사용하여 작동하지 않습니다 내가 파이썬의 텔넷 라이브러리 사용` r` 또는` n`을 파이썬에서 텔넷을 통해 전송할 수있는 방법이 있나요?

Using Tera Term, it works fine:

그러나 Correct Result (Fan status of 3 fans) MCU responds Correctly

:

tn = telnetlib.Telnet(HOST,PORT,timeout = 3) 
tn.write('send '+ DEVICE_MAC + ' rs232:1 get_fan ?\r') 

을 HOST, PORT 및 DEVICE_MAC는 모두 원래 코드로 정의됩니다. 무엇인가의 이유로 \ r은 (는) 호스트로 보내지지 않습니다.

get_fan ?\r 

\r\r없이 get_fan ?를 전송 위에 제대로 get_fan ? 명령하지만, 파이썬 코드를 처리 할 수있는 호스트 MCU 필요합니다.

\r 또는 \n을 텔넷을 통해 전송하는 방법이 있습니까? telnetlib.py에서 단서를 찾고 있는데 아마도 해결책이 더 간단 할 것입니다. 가능하면 귀하의 의견에 감사드립니다. 감사!

+0

만약'get_fan? \ r'을'send rs232 : 1' 명령에 보내거나 보내길 원한다면, 작은 따옴표로 둘러 싸서 고려해야합니다. '\ r '에서'\ r'을 탈출하십시오. "을 입력하면"을 입력하고 "\ n"을 사용해보십시오. 라우터의 몇 가지 모델을 제외한 거의 모든 텔넷 서버는 "기본"텔넷 뉴 라인 "\ n"을 사용했습니다. –

+0

안녕하세요 Lohmar. 당신의 의견에 감사드립니다. 나는 당신의 요점을보고 완전히 당신의 요점을 이해합니다. 문제는 telnetlib.py가 전송할 데이터에서 "\ n"을 발견하면 텔넷 데이터를 보내거나 소켓을 플러시()한다고 보냅니다. 나는 맹세한다, 나는 이것을 며칠 동안 강조하고 있었고 방금 해결책을 찾았다. 나는 대답을 게시 할 것이다. – bluesclues

답변

0

그래서이 문제에 대한 해결책은 "문자열 리터럴"개념을 사용하는 것입니다. 난 그냥이 링크를 단서로 실행 https://docs.python.org/2.0/ref/strings.html

나는 처음부터 사용해야 올바른 코드는 다음과 같습니다

tn = telnetlib.Telnet(HOST,PORT,timeout = 3) 
tn.write('send '+ DEVICE_MAC + ' rs232:1 get_fan ?' + r'\r' + '\r\n') 

난 단지 명확성을 위해 + 연결을 사용하지만, '\r' 전에 r를 추가하면 캐리지 리턴을 방지 텔넷 이스케이프 문자열로 해석되지 않으므로 텔넷 데이터에서 문자열로 전송됩니다. 두 번째 캐리지 리턴과 줄 바꿈 \r\n은 확실히 소켓을 플러시하고 텔넷 데이터를 보내는 이스케이프 시퀀스로 해석되어야합니다.