1

客户端详情:Paho MQTT Python 客户端从http://git.eclipse.org/gitroot/paho/org.eclipse.paho.mqtt.python.git获取,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 上运行它)是否溢出。

4

0 回答 0