多网卡环境下paho-mqtt指定bind_address连接MQTT Broker超时问题
我的PC同时连接了以太网和Wi-Fi两个网络接口,想用paho-mqtt客户端连接MQTT Broker。根据paho-mqtt官方文档,可以通过connect方法的bind_address参数指定要使用的网络接口,方法定义如下:
connect(host, port=1883, keepalive=60, bind_address="")
但当我传入具体的本地IP(比如192.168.0.215)调用connect方法时,出现了连接超时错误,错误栈信息如下:
Traceback (most recent call last): File "stream.py", line 105, in <module> client.connect(MQTT_IP, bind_address="192.168.0.215") File "/media/mmrbulbul/HDD2/reid_codes/conv_venv/lib/python3.6/site-packages/paho/mqtt/client.py", line 914, in connect return self.reconnect() File "/media/mmrbulbul/HDD2/reid_codes/conv_venv/lib/python3.6/site-packages/paho/mqtt/client.py", line 1044, in reconnect sock = self._create_socket_connection() File "/media/mmrbulbul/HDD2/reid_codes/conv_venv/lib/python3.6/site-packages/paho/mqtt/client.py", line 3685, in _create_socket_connection return socket.create_connection(addr, timeout=self._connect_timeout, source_address=source) File "/usr/lib/python3.6/socket.py", line 724, in create_connection raise err File "/usr/lib/python3.6/socket.py", line 713, in create_connection sock.connect(sa) socket.timeout: timed out
核对绑定IP与路由
先用ip addr(Linux)或ipconfig(Windows)确认192.168.0.215确实是当前PC某一网络接口的有效IP;再用traceroute -s 192.168.0.215 <BrokerIP>(Linux)或tracert -s 192.168.0.215 <BrokerIP>(Windows)检查该IP到Broker的路由是否通畅,若中间节点出现中断,排查网络链路问题。排查防火墙限制
检查绑定IP所在接口的本地防火墙,是否允许出站访问MQTT默认端口1883;同时确认Broker端的安全组/防火墙是否放行192.168.0.215的连接请求,必要时临时关闭防火墙测试。升级paho-mqtt版本
你使用的Python3.6搭配的是旧版paho-mqtt,部分旧版本对bind_address参数的处理存在bug,执行pip install --upgrade paho-mqtt升级到最新稳定版后重试。手动绑定socket(备选)
如果上述方法无效,可绕过connect的bind_address参数,手动绑定底层socket后再连接:import paho.mqtt.client as mqtt client = mqtt.Client() # 绑定指定本地IP,端口设为0让系统自动分配 client.socket().bind(("192.168.0.215", 0)) client.connect(MQTT_IP)
内容的提问来源于stack exchange,提问作者mmrbulbul

