クライアントの詳細: http://git.eclipse.org/gitroot/paho/org.eclipse.paho.mqtt.python.gitから取得した Paho MQTT Python クライアント、SHA ID 300fcbdffd62d08f627f94f3074463cfa532ca87
ブローカーの詳細: MQTT プラグインを使用した RabbitMQ 3.3.4
最初のシナリオでは、すべてが SSL を有効にしてローカルで実行されています。私は、メッセージ (> 10000 メッセージ) をパブリッシュし、パブリッシュ間の確認を待たない別のプロセスを持つ方法でクライアントを使用しています。このエラーは、self._ssl.read(1) が client.py の _packet_read からの次のコード スニペットから長さゼロの値を返した結果です。
...
if self._in_packet['command'] == 0:
try:
if self._ssl:
command = self._ssl.read(1)
else:
command = self._sock.recv(1)
except socket.error as err:
...
else:
if len(command) == 0:
return 1
command = struct.unpack("!B", command)
self._in_packet['command'] = command[0]
...
RabbitMQ から 25 個の確認応答を受信して解析した後に発生します。このエラーの後、ブローカーから何も返されなくなりました。
SSL を無効にして実行すると、エラーは発生せず、送信されたすべてのメッセージの受信確認を正常に受信できます。
ブローカーをリモート (インターネット上のどこか) で実行すると、SSL 経由で同じ結果が得られます。ただし、SSL を使用していない場合、さまざまな間隔で読み取りエラー/切断が発生しますが、クライアントは回復/再接続でき、送信されたすべてのメッセージに対してブローカーの確認応答を受け取ります。
私が使用しているクライアント構成は次のとおりです。
...
client = Client('foo')
client.max_inflight_messages_set(65536)
client.on_connect = self.on_connect_callback
client.on_disconnect = self.on_disconnect_callback
client.on_publish = self.on_publish_callback
client.on_message = self.on_message_callback
client.username_pw_set('foo', 'bar')
client.tls_set("ca-cert.pem",
"client-cert.pem",
"client-key.pem")
client.will_set(topic="last_will/foo",
payload=Message().body, qos=1)
client.connect('127.0.0.1', 8883, 30)
client.loop_start()
...
これを引き起こしている可能性のあるものについてのアイデアやトラブルシューティングの提案はありますか?
更新 20140828: loop_read をステップ実行していて、最初の完全なパケット (接続確認) を正常に受信した後、空のソケットの戻り値を取得していることに気付きました。socket.recv 呼び出しに先行する select の呼び出しは、ソケットで読み取る準備ができているデータがあることを示します。これはソケットバッファの問題でしょうか? オーバーフローした場合の Python ソケット受信バッファ (これを OSX で実行しています) の動作がどうなるかわかりません。