ZeroMQ API 似乎忽略了我的 PUB
Posted
技术标签:
【中文标题】ZeroMQ API 似乎忽略了我的 PUB【英文标题】:ZeroMQ API seems to ignore my PUB's 【发布时间】:2016-11-11 11:05:03 【问题描述】:我希望有人对 Smart Shooter 3
及其 API ZeroMQ
有更多经验。
ZeroMQ
似乎是 MQTT 的不同版本,但在发布和订阅主题方面基本上以相同的方式工作。
Smart Shooter 3
是一个程序,旨在控制设置/选项并通过 USB 连接使用 DSLR 相机拍照。
我目前正在尝试向该项目添加其他功能,并且正在尝试收听此ZeroMQ
服务器以获取拍照命令:
import json
import datetime
import argparse
import zmq
def main():
parser = argparse.ArgumentParser("smartshooter-listen.py")
parser.add_argument("-q", "--quiet",
action="store_true",
default=False,
help="enable quiet mode for reduced logging")
parser.add_argument("-n", "--nopings",
action="store_true",
default=False,
help="filter out ping messages")
parser.add_argument("-p", "--publisher",
default="tcp://127.0.0.1:54543",
metavar="ENDPOINT",
help="specify ZMQ address of Smart Shooter publisher")
args = parser.parse_args()
context = zmq.Context()
sub_socket = context.socket(zmq.SUB)
sub_socket.setsockopt(zmq.SUBSCRIBE, b"")
sub_socket.connect(args.publisher)
while (True):
raw = sub_socket.recv()
str_msg = raw.decode("utf-8")
json_msg = json.loads(str_msg)
if args.nopings and json_msg["msg_id"] == "NetworkPingMsg":
continue
print("0: 1".format(datetime.datetime.now(), json_msg["msg_id"]))
if not args.quiet:
print(str_msg)
if __name__ == "__main__":
main()
当我连接到在 Smart Shooter 3
上运行的 ZeroMQ
服务器时,它每 5 秒左右给出一个 msg_type Request, msg_id NetworkPingMsg
。当我按拍摄一张照片时,它会更新它以什么ISO值等拍摄照片,但是,没有'请求'拍摄给了一张图片。
我还找到了一个拍照的脚本:
import sys
import json
import argparse
import zmq
def send_shoot(socket):
req =
req["msg_type"] = "Request"
req["msg_id"] = "ShootMsg"
req["msg_ref_num"] = 0
req["CameraSelection"] = "All"
socket.send_string(json.dumps(req))
rep = socket.recv()
str_msg = rep.decode("utf-8")
json_msg = json.loads(str_msg)
return json_msg["Result"]
def main():
parser = argparse.ArgumentParser("smartshooter-trigger.py")
parser.add_argument("-r", "--reqrep",
default="tcp://127.0.0.1:54544",
metavar="ENDPOINT",
help="specify ZMQ address of Smart Shooter request/reply server")
args = parser.parse_args()
context = zmq.Context()
req_socket = context.socket(zmq.REQ)
req_socket.connect(args.reqrep)
if not send_shoot(req_socket):
print("Failed to send trigger message", file=sys.stderr)
exit(1)
if __name__ == "__main__":
main()
但是,当我使用它时,DSLR 会拍摄一张照片。在ZeroMQ
上收听此提要时,我现在看到了拍摄图片命令。
有没有可能信息不是通过ZeroMQ
而是仅通过USB 发送的?
我真正要问的是,有没有人可能知道在哪里或我可以找到响应/查看何时通过ZeroMQ
请求图片的代码。
谢谢!
【问题讨论】:
【参考方案1】:ZeroMQ API 不应受到责备
假设您的陈述得到所报告的 DSLR-under-Test 实验的支持,则解决方案朝这个方向发展:
-
有几个 ZeroMQ F正规 C通信 Patterns 暴露于分布式处理系统的不同模式通信:
PUB
使用 tcp://127.0.0.1:54543
传输类(用户可配置)REP
使用 tcp://127.0.0.1:54544
传输类,但在另一个端口上(可配置)
-
软件可以
.connect()
本地SUB
F普通C通讯P在暴露的 PUB
接入点(根据上面的第 1 项)中充当交易对手,以侦听和接收(由于调用了.setsockopt(zmq.SUBSCRIBE, b"")
方法)从PUB
分发的所有消息节点(utf-8
编码的JSON
-wrapped 数据结构)
-
软件也可以
.connect()
本地REQ
F普通C通讯P 将对方作为另一个端口的另一方,作为公共接入点(根据上面的第 1 项)公开,以发送格式正确的请求(通过调用 send_shoot( socket )
where socket
必须是:[A] 是正确的类型——即 REQ
原型,和 [B] 处于适当的状态——即在 POSACK'd .connect( args.reqrep )
之后
-
假设您的
REQ
已要求 REP
交易对手拍摄一张照片,而它确实拍摄了一张照片,这超出了您本地进程的控制范围,远程进程是否会或不会在任何其他消息传递设施上报告此类事件(此处为PUB
,根据上面的第 1 项),因此 SUB
可能,但不必自动接收任何此类通知。
总结:
Q.E.D. 观察到这种机制有效,这构成了对高层服务处理 JSON/ZeroMQ 消息传递的肯定确认,ZeroMQ API 不会忽略它自己的任何东西,Q.E.D.
(如果您的设计需要对佳能在 USB 串行通信上公开的服务进行真正的低级访问,may be interested in Python module for this level of detail)。
【讨论】:
以上是关于ZeroMQ API 似乎忽略了我的 PUB的主要内容,如果未能解决你的问题,请参考以下文章
UIImageView 忽略了我的 ContentMode 设置
移动 Safari 忽略了我的自动对焦 jQuery 事件?
在安全的 Spring Boot RESTful API 上为登录创建不安全的端点 - WebConfig 似乎被忽略了