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()本地SUBF普通C通讯P在暴露的 PUB 接入点(根据上面的第 1 项)中充当交易对手,以侦听和接收(由于调用了.setsockopt(zmq.SUBSCRIBE, b"") 方法)从PUB 分发的所有消息节点(utf-8 编码的JSON-wrapped 数据结构)

    软件也可以.connect()本地REQF普通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的主要内容,如果未能解决你的问题,请参考以下文章

Delphi 似乎忽略了我的一些代码行?

zeroMq中pub-sub和push-pull模式的区别

UIImageView 忽略了我的 ContentMode 设置

移动 Safari 忽略了我的自动对焦 jQuery 事件?

在安全的 Spring Boot RESTful API 上为登录创建不安全的端点 - WebConfig 似乎被忽略了

Gcloud pub/sub 忽略配置?