我正在同一网络内的两台连接机器之间用Python发送数据(已成功连接)。
发布者代码定义为:
def senderzmq(self, lat, lon):
sock = zmq.Context().socket(zmq.PUB)
sock.bind("tcp://*:10000")
running = True
while running:
sock.send_string(f"Lat {lat}, Lon={lon}")
接收器具有以下格式:
import zmq
context=zmq.Context()
socket=context.socket(zmq.SUB)
socket.connect("tcp://192.168.1.35:10000")
while True:
message=socket.recv_string()
print(message)
senderzmq 函数的触发方式是:
print(f"Lat {self.lat}, Lon={self.lon}")
self.senderzmq(self.lat, self.lon)
self.lat 和 self.lon 从此静态方法更新:
@staticmethod
def gnss(event):
self.lat = event.latitude + LAT0
self.lon = event.longitude + LON0
LAT0和LON0都是手动配置的。
上述开发是有效的,但是发送方总是发送相同的数据,看起来发送方仍然处于 while True 状态,没有监听新数据。如果我删除 while True,则上述内容不起作用。知道如何退出 while True 但在每个循环中传输新数据吗?
谢谢。 劳尔
我认为您在订户中缺少的部分如下:
socket.setsockopt(zmq.SUBSCRIBE, b"") # or socket.subscribe(b"")
在 ZMQ 中,您应该订阅通配符(“”)或指定主题(例如
socket.subscribe(b"TOPIC_NAME")
)。
我使用以下代码片段测试了代码:
publisher.py
import zmq
import time
def main():
context = zmq.Context()
sock = context.socket(zmq.PUB)
sock.bind("tcp://*:5563")
running = True
while running:
sock.send_string("Lat=42, Lon=42")
time.sleep(1.0)
if __name__ == "__main__":
main()
subsriber.py
:
import zmq
context = zmq.Context()
socket = context.socket(zmq.SUB)
socket.connect("tcp://localhost:5563")
socket.setsockopt(zmq.SUBSCRIBE, b"")
while True:
message = socket.recv_string()
print(message)
并且成功了。
我还建议您快速浏览 zmq 指南(您可以随时转向“python”获取那里的代码片段)。