我希望有人可以通过 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>
谢谢!
答案 0 :(得分:0)
假设您的陈述得到所报告的DSLR-under-Test实验的支持,解决方案朝这个方向发展:
PUB
使用 tcp://127.0.0.1:54543
传输级(用户可配置)REP
使用 tcp://127.0.0.1:54544
传输类,但在另一个端口上(可配置).connect()
本地 SUB
F ormal C 通讯<强烈> P 对于暴露的 PUB
接入点(按照上面的第1项)进行监听和接收(由于调用了.setsockopt(zmq.SUBSCRIBE, b"")
方法)的所有人从PUB
节点分发的消息(utf-8
编码JSON
- 包装数据结构).connect()
本地 REQ
F 正式 C 通讯 P 另一个端口的实际交易对手,作为公共接入点(按照上面的第1项)公开,以发送格式正确的请求(通过调用 send_shoot( socket )
socket
必须是: [A] 的正确类型 - 即REQ
archetype,.connect( args.reqrep )
之后REQ
已经要求 REP
对方拍摄照片并拍摄照片,那么它就在您当地之外-process'控制,远程进程是否会在任何其他消息传递工具(此处为PUB
,根据上面的第1项)报告此类事件,因此 {{ 1}} 可以(但不一定)自动收到任何此类通知。观察到这种机制起作用,这构成了对处理JSON / ZeroMQ消息传递的高层服务的肯定确认,ZeroMQ API不会忽略它自己的任何内容,Q.E.D。
(如果您的设计需要真正低级别访问佳能通过USB串行通信进行的服务,may be interested in Python module for this level of detail)。