External API¶
Integrating CaptureGRID with an external system
CaptureGRID can be integrated with an external system by using the External API feature. This provides two key channels of communication:
Publisher of event information
Server for handling command requests
The External API uses the ZeroMQ library for managing the communication transport layer. See http://zeromq.org for more information on how to use ZeroMQ from your system. This also defines the programming model for using the event publisher and request/reply server, as these are implementated as ZeroMQ socket endpoints.
All messages passed over the External API are encoded in JSON format. See http://json.org for more information on how to handle this type of message format.
Tip
Sample python code for the External API is available at:
Listening to Events¶
The event publisher will broadcast messages about important events that happen inside the app. This includes:
When a new photo is taken
When a photo changes state (downloaded/deleted/renamed etc)
When a new camera is detected
When a camera changes state
When a camera property changes state
Below is an example of a listener application written in Python. This can be run from the command line, and simply prints out each message that is received from the app’s publisher endpoint.
#!/usr/bin/env python3
#
# Copyright (c) 2015-2019, Kuvacode Oy
# All rights reserved. No warranty, explicit or implicit, provided.
#
import zmq
def main():
context = zmq.Context()
sub_address = "tcp://127.0.0.1:54543"
sub_socket = context.socket(zmq.SUB)
sub_socket.setsockopt(zmq.SUBSCRIBE, b"")
sub_socket.connect(sub_address)
print("Opened listener to: {0}".format(sub_address))
while (True):
raw = sub_socket.recv()
json_msg = raw.decode("utf-8")
print("Received: {0}".format(json_msg))
if __name__ == '__main__':
main()
downloads/smartshooter_listen.py
For example, the text below shows the output from this after a new photo has been taken:
Opened listener to: tcp://127.0.0.1:54543
Received: {
"msg_type": "Event",
"msg_id": "PhotoUpdated",
"msg_seq_num": 187,
"msg_user_id": 0,
"msg_result": true,
"NetworkAddress": "192.168.1.52",
"NetworkEndpoint": "tcp://192.168.1.52:54442",
"PhotoSelection": "Single",
"PhotoKey": "5752505c-07f1-4cd3-ab47-d70b4f8a5d02",
"CameraKey": "Nikon Corporation|D5300|4337807",
"PhotoLocation": "Local Disk",
"PhotoOriginalName": "DSC_0000.NEF",
"PhotoComputedName": "SSP_30.nef",
"PhotoDateCaptured": "20190530 19:53:07.000",
"PhotoOrigin": "ui",
"PhotoFormat": "Raw",
"PhotoOrientation": "None",
"PhotoAperture": "5",
"PhotoShutterSpeed": "1/10",
"PhotoISO": "400",
"PhotoFocalLength": "52.0",
"PhotoWidth": 6000,
"PhotoHeight": 4000,
"PhotoFilesize": 24755185,
"PhotoIsImage": true,
"PhotoSequenceNum": 30,
"PhotoBatchNum": 141,
"PhotoHash": "095A4317"
}
Sending Requests¶
The request/reply server inside the app can handle requests to do various actions such as:
Connect/Disconnect camera
Take photo
Download/rename/delete photo
Change camera property
Auto focus camera
Change sequence/batch number
Tip
For further documentation see the public git repo:
https://bitbucket.org/kuvacode/smartshooter-api
And in particular the API documenation stored here:
https://bitbucket.org/kuvacode/smartshooter-api/src/master/external_api.rst
Configuring the External API¶
By default the External API is disabled. To enable it, go to the Network/API tab in the Options window and enable the checkbox, as shown below. This also allows customisation of the ZeroMQ endpoints that are used for the event publisher and request/reply server, so that it can be opened up for access from other computers on a network.