2017-09-09 3 views
0

집단 인터넷,Python에서 TCP 통신 문자열 인코딩 문제

저는 코딩을 가르치는 특정 프로젝트를 맡은 아주 새로운 프로그래머입니다. TCP 명령을 사용할 수있는 많은 장비로 작업하므로 각 단추마다 다른 명령을 보내는 단추 시스템을 구축하려고합니다. 나는 라즈베리 파이 3b를 가지고 파이썬에서 온라인 수업을 들었다. 내가 합리적으로 멀리 내 자신에있어 (내가 원하는 방식으로 작동하는 버튼을 가지고있어!)하지만 내가 붙어 있었는지 TCP 명령을 보내는 것입니다.

구체적으로 말하면 : 데이터를 보내고 있지만 수신되고 있지만 문자열 명령이 제대로 인코딩되지 않았습니다. 명령은 텔넷 세션에서 실행할 때 작동하지만 분명히 스크립트의 일부로 실행되도록합니다. 명령은 텔넷 세션을 통해 수신해야한다고 지정하지 않으며, 다른 방법으로이 명령을 텔넷 세션의 외부 TCP 명령으로 작동 시켰습니다. 파이썬 용 텔넷 모듈에 대해 읽었지만 필자는 필자가 필요하다고 생각하지 않는다.

wireshark를 통한 패킷 전달을 확인했습니다. 내 스크립트에서 보낸 패킷과 텔넷 세션에서 보낸 패킷을 캡처했는데 비슷하지만 비슷하지는 않습니다. 말굽과 수류탄, 맞지? 내 현재의 방법은 문자열 ('안에)을 소문자로 시작하는 것입니다. b. 나는 문자열 뒤에 .encode()를 넣으려고했다. (그 상황에서 b를 생략했다.)

문자열 명령 형식은 다음과 같습니다

내 사용 사례에 대한 그래서
setInput "InputName" Value 

, 나는 값을 1로 "하나"라는 입력을하고 있어요 : 당신이 그래서

setInput "One" 1 

내 스크립트 (아래에 삽입 됨)에서 볼 수 있습니다.

s.sendall(b'setInput "One" 1') 

그러나 위 정보가 아니기 때문에 올바른 정보를 전송하지 못합니다. rking과 wireshark에서 똑같이 보지 않습니다.

TL : DR : TCP를 통해 패킷을 보내려고하지만 제대로 인코딩되지 않았습니다. 나는 심지어 이러한 명령을 사용하여 올바른 방향으로 가고 그냥 내가 완전히 다른 방향을 모색해야하는 경우 다른 수단이 문자열을 인코딩 또는 필요하고 경우

는 궁극적으로, 내 질문은 (아마도 텔넷 모듈?)

import socket 
import time 

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.connect(('192.168.100.40', 3040)) 
print('connected') 
time.sleep(2) 
s.sendall(b'setInput "One" 1') 
print('sent increase') 
time.sleep(2) 
s.sendall(b'setInput "One" 0') 
print('sent decrease') 
다음

Wireshark log of my script

는 와이어 샤크의 outpu입니다 : 여기

내가 테스트 사용하고 스크립트 내 스크립트의 와이어 샤크의 출력 성공 텔넷 세션의 t :

Wireshark log of the telnet session

일체의 도움이 감사합니다. 나는 멀리서 보았고 내 사건과 비슷한 사건을 찾을 수없는 것 같습니다.

편집 : 잘못된 형식의 경우 죄송합니다. 게시물을 더 잘 표현하는 방법에 대한 조언에 감사드립니다. 이것은 여기에 내 첫 게시물이며 나는 단지 그것의 매달려 있어요. 저의 특전이 없기 때문에 내 사진은 여전히 ​​링크입니다.죄송합니다. 너무 어리 석다면 가능한 한 많은 정보를 제공하여 사람들이 내 문제를 이해하고 해결 방법이 발견 된 경우 비슷한 문제를 가진 사람들이이를 찾을 수 있도록 돕고 싶었습니다.

+2

으로 변경하십시오. 그림이 아닌 실제 코드를 게시하십시오. –

+0

스크립트 링크가있는 곳에서 실제 코드를 복사하여 붙여 넣으십시오. – KingMak

+0

사람들이 불필요한 정보를 소중히하기 위해 시간을 허비하지 않고 도울 수 있도록 더 종합적으로 선택하고 특정 질문을 강조 표시하십시오. 이러한 [mcve 지침] (https://stackoverflow.com/help/mcve)은 유용 할 수 있습니다 ... – FabienP

답변

1

텔넷 TCP 데이터에는 캐리지 리턴과 줄 바꿈 및 데이터 끝이 포함됩니다. 분명히받는 부분은 일을 진행시키기 위해 이것을 포함시켜야합니다. 따라서 파이썬 문자열을 b'setInput "One" 1\r\n'

+0

정말 고마워요, 톤! 캐리지 리턴을 시도했지만 줄 바꿈을 잊어 버렸습니다! 그 100 % 내 문제가 해결되었습니다. –