2012-09-06 2 views
2

gps-tracker에서 데이터를 수신하고 싶습니다. 그것은 tcp에 의해 데이터를 전송하기 때문에 xinetd를 사용하여 데이터를 처리하기 위해 일부 TCP 포트와 Python 스크립트를 수신합니다. 이것은 xinetd를 설정입니다 :/등의개행이나 EOF없이 sys.stdin에서 읽음

service gps-gprs 
{ 
    disable  = no 
    flags  = REUSE 
    socket_type = stream 
    protocol = tcp 
    port = 57003 
    user  = root 
    wait  = no 
    server  = /path/to/gps.py 
    server_args  = 3 
} 

구성/서비스

gps-gprs  57003/tcp   # Tracking system 

그리고 파이썬 스크립트 gps.py

#!/usr/bin/python 
import sys 

def main(): 
    data = sys.stdin.readline().strip() 
    #do something with data 
    print 'ok' 

if __name__ =='__main__': 
    main() 

추적기는

같은 원시 텍스트 데이터 문자열을 전송
$GPRMC,132017.000,A,8251.5039,N,01040.0065,E,0.00,,010111,0,,A*75+79161234567# 

문제는 파이썬 스크립트의 sys.stdin은 줄 끝이나 파일 끝 문자를받지 않으며 sys.stdin.readline()은 영원히 계속됩니다. 나는 파이썬 스크립트

import socket 
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.connect(('', 57003)) 
s.sendall(u'hello' ) 
data = s.recv(4024) 
s.close() 
print 'Received', data 

와 메시지는 '안녕하세요', 실패하면 다른 PC에서 데이터를 보내려고하지만, 메시지는 '안녕하세요 \ n을'일 경우, 괜찮아요 모든 것이 괜찮습니다. 하지만 추적기 나 xinetd에게 메시지 끝에이 '\ n'을 추가하라고 명령하는 것을 모르겠습니다. EOF 나 EOL없이 sys.stdin에서 데이터를 읽으려면 어떻게해야합니까?

+0

이 왜'.readline을()'를 사용해야합니까 없음 줄 바꿈? '.read()'하지 않습니까? –

+0

"break here"라는 특정 시그널을 만나기 전까지 반드시'.read()'가 필요합니다. 반드시 newline이 아니어야합니다. 결국'#'과 같을 것입니다. 처음. – jadkik94

답변

4

sys.stdin.readline()은 개행을 수신 할 때까지 영원히 기다립니다. 그런 다음 현재 행이 완료된 것으로 간주하고 전 체를 리턴합니다. 개행을 포함하지 않는 데이터를 읽거나 데이터를 처리 (일부)하기 전에 개행이 수신 될 때까지 기다리지 않으려는 경우 readline 이외의 것을 사용해야 할 것입니다. 대부분의 경우 임의의 데이터를 주어진 크기까지 읽는 read으로 전화해야합니다.

그러나 GPS가 잘 알려진 NEMA 형식으로 데이터를 전송하고있는 것으로 보입니다.이 형식은 개행으로 각 행을 종료합니다. 사실, 아마도 각 줄을 CRLF (\r\n)로 끝내지 만, \r이 TCP 소켓에 도착하기 전에 어딘가에 수렁에 빠졌을 가능성이 있습니다. 어느 쪽이든 각 줄의 vert 끝 부분에 '\ n'이 있습니다.

readline 전화가 회선을 반환하지 않고 걸려 있다면, 대부분 발신자가 회선을 버퍼링 할 때까지 회선을 버퍼링하기 때문일 수 있습니다. 송신자의 버퍼가 가득 채워질 때까지 기다렸다가 한꺼번에 많은 줄을 얻을 수 있습니다. 그게 무슨 일이 일어나면, 각 NEMA 문장 다음에 송신 버퍼를 플러시하도록 송신자를 변경해야합니다.

1

# 대신 <CR><LF> 대신에 #이 표시되는 것 같습니다.

data = "" 
while len(data) == 0 or string[-1] <> '#': 
    data += sys.stdin.read(1) 

#do something with data 
print 'ok' 
6

간단한 :

data=sys.stdin.read().splitlines() 

for i in data: 
     print i