3

私はPythonでいくつかのソケットプログラミングを行っており、低速の組み込みデバイスと通信するためにクライアントTCP / IPソケットを開発しています。そのため、応答が 1 つのパッケージのみであると想定されている場合でも、2 つのパッケージに分割されることがあります。それに対する私の現在の解決策は、sleep()必要なすべてのデータが既に到着していることを確認するのを待って、python プログラムを使用することです。

comSocket.send('\r')

sleep(1)

comSocket.send('\r')

comSocket.recv(128)

comSocket.send('\r\r')

comSocket.recv(256)



#sending I commands for data

comSocket.send('1I\r\r3I\r\r4I\r\r13I\r\r5I\r\r8I\r\r7I\r\r9I\r\r')

sleep(2)

#receiving data

rawData = comSocket.recv(512)

sleep(1.5)

この状況を処理するためのより良い方法があるかどうか疑問に思っていますか?

4

3 に答える 3

1

単一のデバイスの場合は、低レベルのsocket対話を処理するソリューションを使用する必要があります... pythonにはpexpectexscript、またはparamiko(sshのみ)などのいくつかがあります...複数のデバイスであり、非同期通信が必要な場合は、 @zeekayの答えを使用してください(ただし、非同期プログラミングは、特にツイストを使用する場合は、まだ慣れていない場合は不快です)。

私はあなたがtelnetしてコマンドのリストを単一のデバイスに送信する方法で質問に答えました...

pexpectで死にかけているプロセスをキャッチする

上記の答えはコードを効率的にしますが、初心者が理解するのはより困難です...次のコードはより単純で、TCP / 23でTelnet接続を確立し、待機し*、コマンドを送信し、コマンドに応答を送信しますでmydata1..。

import pexpect as px
import sys

def send_this(child, retcode, COMMAND):
    if retcode == 2:
        child.sendline(COMMAND)
    else:
        raise RuntimeError, "Could not complete login, due to socket error"

def expect_this(child, EXPR, timeout = 10):
    return child.expect([px.TIMEOUT, px.EOF, EXPR], timeout = timeout)

HOST = '192.168.49.49'
CMD1 = '1I'
PROMPT = '\*'     #Note: you might not need the backslash
TIMEOUT = 10

child = px.spawn('telnet %s' % HOST)
retcode = expect_this(child, PROMPT)
send_this(child, retcode, CMD1)
retcode = expect_this(child, PROMPT)
mydata1 = child.before    # mydata has the output from CMD1

解決策に関係なく、最も重要なことはタイムアウトを微調整することです。これにより、セルネットワークの長い遅延(私の経験では5秒を超えることもあります)を気にする必要がなくなります。

セルラー通信のもう1つの厄介な問題は、多くの消費者向けデバイスが移動中にIPアドレスを定期的に変更することです(dhcpに依存しているため)...これが発生した場合、TCPでできることはほとんどありません...静的アドレスがある場合、デバイスが新しいIPアドレスをプルすると接続が切断されます。

于 2011-06-21T17:55:36.367 に答える
1

twistedzeromqなどのネットワーク ライブラリを使用します。

于 2011-06-21T17:40:36.840 に答える
0

ループ内にいる必要がrecvあり、すべてのメッセージがプロトコルパーサーで受信されたかどうかを確認する必要があります..

condition = True
while condition:
    rawData += sock.recv(512)
    # parse rawData to check if message is complete and if so you can set condition = False to break the loop
    if parser.is_complete(rawData):
        condition = False
于 2011-06-21T17:43:47.183 に答える