gdp-if / websocket-subscriber / README.md @ master
History | View | Annotate | Download (3.44 KB)
GDP Websocket gateway
A gateway for subscribing to a GDP log via websockets.
Requirements and setup
Requires following to be installed:
- GDP C library (libgdp)
- GDP python bindings
- Python 2.7
- twisted, Event-based framework for internet applications (package
python-twisted
on Ubuntu) - autobahn, WebSocket/WAMP implementation for Python/Twisted (package
python-autobahn
on Ubuntu)
Once the required dependencies are met, running a gateway is as simple as
python gdp-ws.py --port XXXX
This opens a websocket server on the specified port. If needed, a secure
websocket interface can also be instantiated. See python gdp-ws.py -h
for
invocation details. Note that setting up secure websockets requires you to have
appropriate certificate/private keys.
Client interaction
Clients issue subscription requests by sending a JSON encoded text message,
which should at least specify the logname
(and optionally the range of records
as well). An example client=>server message looks like the following:
{"logname": "a-human-readable-logname", "startrec": 0, "numrec": 20}
The startrec
and numrec
represent the range of records and are optional
parameters. The behavior is the same as for gdp_gcl_subscribe
API call in the
C library. The default values are startrec = 0
and numrec = 1
, which implies
a request for only the next available record. For the subscription to run
forever, use numrec = 0
(see documentation doc/gdp-programmatic-api.html
)
The websocket gateway subscribes to the specified log on behalf of the client and sends the events it receives from a log-server to the client. An example response looks as follows:
{"logname": "a-human-readable-logname", "ep_stat": [200, "OK [200 = 0xc8]"], "datum": {"recno": 24, "data": "hello", "ts": {"tv_sec": 1498143987, "tv_accuracy": 0.0, "tv_nsec": 662371000}}, "type": 1}
A quick summary of the various fields is:
logname
: the name of the log, of course. Useful in case a client has multiple subscriptions activeep_stat
: a status code returned by the C library (EP_STAT)type
: the type of event. Valid types are defined by the C-library, seegdp/gdp.h
.datum
: the datum returned as a result of subscription. Only valid if the event type isGDP_EVENT_DATA
(1).
A client can send multiple subscription requests over the same websocket. Each such request is treated as an independent request, thus a client will receive multiple copies of any new data if it has duplicate active subscriptions on the same log. However, such subscriptions are lost in case the websocket connection goes away; it is the responsibility of a client to re-send the subscription request if the connection fails for any reason.
Note that any exceptions encountered by the gateway are sent back to the client as unformatted text (see Limitations). Thus, a client should be ready to handle the incoming data that is not a well formatted JSON.
Limitations
- Only textual mode is supported for the moment. Binary data (in the logs, logname, etc) does not work.
- In particular, using JSON as the transport format rules out supporting records with binary payload.
- Any exceptions that the gateway encountered while processing a request are
sent back to the client as it is. In some cases, it makes sense (such as a
non-existent logname causing
Error 600
), but in many cases it does not (the gateway server losing connection to the GDP infrastucture)