2017-11-15 7 views
0

TCP 프로토콜을 통해 포트에서 데이터를 수신 할 수있는 코드를 만들었습니다. ESP8266에서 15 분마다 데이터를 수신 한 후 ESP는 deepSleep 모드로 전환됩니다. 연속적으로 작동하도록 변경하는 방법? while 루프에서 새로운 연결을 만들고 싶었지만 작동하지 않습니다.TCP 포트 연속 수신

내 코드

import sys 
import socket 

TCP_IP = '192.168.42.1' 
TCP_PORT = 8888 
BUFFER_SIZE = 1024 
param = [] 
i=0 

#s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
#s.bind((TCP_IP,TCP_PORT)) 
#s.listen(1) 

#print 'Listening for client...' 

#conn, addr = s.accept() 
#print 'Connection address:', addr 
while 1: 
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    s.bind((TCP_IP,TCP_PORT)) 
    s.listen(1) 

    print 'Listening for client...' 
    conn, addr = s.accept() 
    print 'Connection address:', addr 
    data = conn.recv(BUFFER_SIZE) 
    if data == ";" : 
      conn.close() 
      print "Received all the data" 
      i=0 
      for x in param: 
        print x 
      #break 
    elif data: 
      print "received data: ", data 
      param.insert(i,data) 
      i+=1 
      #print "End of transmission" 

편집 : 수정 후

내 코드입니다.

import sys 
import socket 

TCP_IP = '192.168.42.1' 
TCP_PORT = 8888 
BUFFER_SIZE = 1024 
param = [] 
i=0 

#s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
#s.bind((TCP_IP,TCP_PORT)) 
#s.listen(1) 

#print 'Listening for client...' 

#conn, addr = s.accept() 
#print 'Connection address:', addr 
while 1: 
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    s.bind((TCP_IP,TCP_PORT)) 
    s.listen(1) 
    while 1: 
      print 'Listening for client...' 
      conn, addr = s.accept() 
      print 'Connection address:', addr 
      data = conn.recv(BUFFER_SIZE) 
      if data == ";" : 
        conn.close() 
        print "Received all the data" 
        i=0 
        for x in param: 
          print x 
        #break 
      elif data: 
        print "received data: ", data 
        param.insert(i,data) 
        i+=1 
        #print "End of transmission" 
    s.close() 

두 번째 while 루프를 만들었습니다. 지금도 계속들을 수 있지만 ESP (ESP는 9 패킷 전송)에서 하나의 패킷 만받습니다. 그 문제를 해결하는 방법? 당신이 지속적으로 원격 끝에서 연결 및 데이터를 수신하려면

+0

TCP 소켓의 제한 시간을 15 분 이상으로 설정할 수 있습니다. –

+0

당신은 15 분 후에 새로운 소켓 연결을 만들기 위해'socket.close()'와'time.sleep (15 * 60)'을 추가하고 while 회 돌이를 끝낼 수 있습니다. –

답변

0

, 당신은()

(선택 사용하는 코드의 수정 된 버전) 아래 그림이 사용 선택을 달성 할 수있다. 이것은 또한 연결을 종료 원격 끝을 처리합니다 :

import sys 
import socket 
import select 

TCP_IP = '127.0.0.1' 
TCP_PORT = 8888 
BUFFER_SIZE = 1024 
param = [] 

print 'Listening for client...' 
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
server.bind((TCP_IP,TCP_PORT)) 
server.listen(1) 
rxset = [server] 
txset = [] 

while 1: 
    rxfds, txfds, exfds = select.select(rxset, txset, rxset) 
    for sock in rxfds: 
     if sock is server: 
      conn, addr = server.accept() 
      conn.setblocking(0) 
      rxset.append(conn) 
      print 'Connection from address:', addr 
     else: 
      try: 
       data = sock.recv(BUFFER_SIZE) 
       if data == ";" : 
        print "Received all the data" 
        for x in param: 
         print x 
        param = [] 
        rxset.remove(sock) 
        sock.close() 
       else: 
        print "received data: ", data 
        param.append(data) 
      except: 
       print "Connection closed by remote end" 
       param = [] 
       rxset.remove(sock) 
       sock.close() 

NB를 내가 루프백 사용하여 IP 주소를 교체했습니다하지만 당신은 아이디어를 얻을.

희망이 있으면 도움이 될 수 있습니다.

+0

매우 감사합니다. 그것은 작동합니다. 인사말. –

+0

표시. 다시 한번 감사드립니다 –

+0

한 번 더 질문드립니다. 같은 포트에서 2 명의 클라이언트를 청취하고 싶다면 어떻게해야합니까? 멀티 스레딩을 사용해야합니까 아니면 다른 해결책이 있습니까? 지금은 2 개의 포트를 동시에들을 수 있지만 때로는 충돌이 있습니다. 나는 ESP8266s 데이터 양식을 수신하고있어하지만 때로는 내가 예를 들어 기대하지 않습니다 2 : T = 25.20H = 35.10 1 : T = 25.40H = 38.90 2 : T = 25.20H = 35.10; 1 어떻게 이런 상황을 피할 수 있습니까? –