2017-11-15 19 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" 

EDIT:修正後

私のコード。

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() 

私は2番目のwhileループを作成しました。私は今も継続して聞くことができますが、私はESPからパケットを1つだけ受信します(ESPは9パケットを送信します)。その問題を解決するには?あなたが継続的にあなたのリモートエンドからの接続やデータをリッスンする場合は、selectを使用してこれを達成することができます

+0

TCPソケットのタイムアウトを15分以上に設定できます。 –

+0

あなたは 'socket.close()'と 'time.sleep(15 * 60)'を追加してwhileループを終了して15分後に新しいソケット接続を作成することができます –

答えて

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

もう1つ質問があります。同じポートで2人のクライアントを聴きたいのですが?マルチスレッドを使用すべきか、それとも別の解決方法がありますか?私は同時に2つのポートを同時に聞くことができますが、時には衝突があります。 私はESP8266sにデータフォームを受信して​​いますが、時々私は、たとえば期待するもの得ることはありません: 2:T = 25.20H = 35.10 1:T = 25.40H = 38.90 2:T = 25.20H = 35.10; 1 このような状況を回避するにはどうすればよいですか? –

関連する問題