ZeroMQ API似乎忽略了我的PUB

时间:2016-07-08 19:30:48

标签: python camera usb zeromq

我希望有人可以通过 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()

当我连接到ZeroMQ上运行的Smart Shooter 3服务器时,它会每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上收听此Feed时,我现在会看到拍摄图片命令。

是否可以通过ZeroMQ但仅通过USB发送信息?

我真正想问的是,是否有人可能知道在哪里或我如何找到响应代码/查看何时通过ZeroMQ请求图片。 < / p>

谢谢!

1 个答案:

答案 0 :(得分:0)

ZeroMQ API不应受到指责

假设您的陈述得到所报告的DSLR-under-Test实验的支持,解决方案朝这个方向发展:

  1. 对于分布式处理系统的不同模式,有几个 ZeroMQ F 正常 C 通信 P atterns沟通: PUB 使用 tcp://127.0.0.1:54543 传输级(用户可配置)
    REP 使用 tcp://127.0.0.1:54544 传输类,但在另一个端口上(可配置)
    1. 软件可以 .connect() 本地 SUB F ormal C 通讯<强烈> P 对于暴露的 PUB 接入点(按照上面的第1项)进行监听和接收(由于调用了.setsockopt(zmq.SUBSCRIBE, b"")方法)的所有人从PUB节点分发的消息(utf-8编码JSON - 包装数据结构)
      1. 软件还可以 .connect() 本地 REQ F 正式 C 通讯 P 另一个端口的实际交易对手,作为公共接入点(按照上面的第1项)公开,以发送格式正确的请求(通过调用 send_shoot( socket )
        socket 必须是: [A] 的正确类型 - 即REQ archetype,
        [B] 处于适当的状态 - 即在POSACK'd .connect( args.reqrep )之后
        1. 假设您的 REQ 已经要求 REP 对方拍摄照片并拍摄照片,那么它就在您当地之外-process'控制,远程进程是否会在任何其他消息传递工具(此处为PUB,根据上面的第1项)报告此类事件,因此 {{ 1}} 可以(但不一定)自动收到任何此类通知。
        2. 要点:

          观察到这种机制起作用,这构成了对处理JSON / ZeroMQ消息传递的高层服务的肯定确认,ZeroMQ API不会忽略它自己的任何内容,Q.E.D。

          (如果您的设计需要真正低级别访问佳能通过USB串行通信进行的服务,may be interested in Python module for this level of detail)。