英文:
zmq socket bind fails with: "No such device (addr='tcp://wpan0:5556')" when Thread-network interface should be used
问题
我正在创建一个基于Python中的Thread网络的系统。我想要使用pyzmq作为我的消息基础(尤其是PUB/SUB)。
我正在使用Debian GNU/Linux 11(bullseye)上的Raspberry Pi 4,来自Nordic Semiconductor的nRF52840 DK作为我的Thread天线,以及Google的Thread边界路由器实现(OpenThread / OTBR)。
我可以从其他Thread设备ping通这个接口,也可以直接绑定一个套接字来使用它。但是一旦我尝试绑定一个ZMQ套接字,我会收到错误消息“No such device (addr='tcp://wpan0:5556')
”。
ZMQ可以毫无问题地绑定到Raspberry Pi的其他接口(例如wlan0
或eth0
)。
我尝试像这样绑定一个ZMQ套接字:
self.ctx = zmq.Context()
self.xpub_sock = self.ctx.socket(zmq.XPUB)
self.xpub_sock.bind("tcp://" + self.ip + ":" + self.subport)
我尝试将wpan0
作为self.ip的参数,还尝试过wpan0
接口的IPv6地址,两者都导致了相同的错误:
Traceback (most recent call last):
File "/home/pi/DAHS-MAS/zmqMessagingTest.py", line 35, in <module>
psp = PubSubProxy("wpan0", "5556", "5555", nodefinder)
File "/home/pi/DAHS-MAS/proxy.py", line 15, in __init__
self.xpub_sock.bind("tcp://" + self.ip + ":" + self.subport)
File "/usr/local/lib/python3.9/dist-packages/zmq/sugar/socket.py", line 302, in bind
super().bind(addr)
File "zmq/backend/cython/socket.pyx", line 564, in zmq.backend.cython.socket.Socket.bind
File "zmq/backend/cython/checkrc.pxd", line 28, in zmq.backend.cython.checkrc._check_rc
zmq.error.ZMQError: No such device (addr='tcp://wpan0:5556')
当我直接在wpan0接口上创建并绑定一个网络套接字时,它可以正常工作,所以我预期ZMQ会毫无问题地处理这个接口。
英文:
I am creating a system based on a Thread-network in Python. I want to use pyzmq as my messaging foundation (especially the PUB/SUB).
I am using a Raspberry Pi 4 with Debian GNU/Linux 11 (bullseye), the Thread Border Router implemantation from Goolge (OpenThread / OTBR) an the nRF52840 DK from Nordic Semiconductor as my Thread-antenna.
I can ping the interface from other Thread-devices and I can use it by directly binding a socket to it. But as soon as I try to bind a ZMQ socket to it, I get the error "No such device (addr='tcp://wpan0:5556')
".
ZMQ can bind without a problem to other interfaces of the Raspberry Pi (for example wlan0
or eth0
)
I tried to bind a ZMQ Socket like this:
self.ctx = zmq.Context()
self.xpub_sock = self.ctx.socket(zmq.XPUB)
self.xpub_sock.bind("tcp://" + self.ip + ":" + self.subport)
I tried to use wpan0 as a parameter for self.ip and also the IPv6 address of the wpan0
interface, both lead to the same error:
Traceback (most recent call last):
File "/home/pi/DAHS-MAS/zmqMessagingTest.py", line 35, in <module>
psp = PubSubProxy("wpan0", "5556", "5555", nodefinder)
File "/home/pi/DAHS-MAS/proxy.py", line 15, in __init__
self.xpub_sock.bind("tcp://" + self.ip + ":" + self.subport)
File "/usr/local/lib/python3.9/dist-packages/zmq/sugar/socket.py", line 302, in bind
super().bind(addr)
File "zmq/backend/cython/socket.pyx", line 564, in zmq.backend.cython.socket.Socket.bind
File "zmq/backend/cython/checkrc.pxd", line 28, in zmq.backend.cython.checkrc._check_rc
zmq.error.ZMQError: No such device (addr='tcp://wpan0:5556')
When I directly create and bind a network socket on the wpan0 interface it works, so I expected that zmq will handle the interface without a problem.
答案1
得分: 0
看起来,我忘记将套接字设置为IPv6,就像这样:
self.xpub_sock.setsockopt(zmq.IPV6, 1)
所以如果有人碰到类似的问题,使用只有IPv6地址的接口,请再次检查是否在创建的套接字上设置了zmq.IPV6常量!
英文:
It seems, I forgot to set the socket to IPv6, like this:
self.xpub_sock.setsockopt(zmq.IPV6, 1)
So if anyone is ever having a similar problem, with an interface that has ONLY IPv6 addresses, check again if you set the zmq.IPV6 constant on your created socket!
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论