client.py
117 lines
| 3.7 KiB
| text/x-python
|
PythonLexer
/ scripts / client.py
|
r17 | #!/usr/bin/python | ||
# -*- coding: UTF-8 -*- | ||||
import time | ||||
from datetime import datetime, timedelta | ||||
import zmq | ||||
import json | ||||
import numpy as np | ||||
import argparse | ||||
|
r20 | REQUEST_TIMEOUT = 5000 | ||
|
r36 | RETRIES = 2 | ||
|
r17 | SERVER_ENDPOINT = 'tcp://localhost:4444' | ||
|
r22 | |||
|
r20 | def send(dato): | ||
|
r19 | ''' | ||
Function to send data to server | ||||
''' | ||||
|
r22 | context = zmq.Context() | ||
socket = context.socket(zmq.REQ) | ||||
|
r24 | socket.connect(SERVER_ENDPOINT) | ||
|
r22 | poll = zmq.Poller() | ||
poll.register(socket, zmq.POLLIN) | ||||
|
r24 | retries = RETRIES | ||
|
r17 | while True: | ||
|
r27 | print(dato['plot']) | ||
|
r36 | socket.send_string(json.dumps(dato)) | ||
|
r17 | socks = dict(poll.poll(REQUEST_TIMEOUT)) | ||
if socks.get(socket) == zmq.POLLIN: | ||||
reply = socket.recv_string() | ||||
|
r31 | if reply == 'ok': | ||
print(('Server replied (%s)' % reply)) | ||||
|
r17 | break | ||
else: | ||||
|
r22 | print(('Malformed reply from server: %s' % reply)) | ||
|
r17 | else: | ||
|
r22 | print(('No response from server, retries left {}'.format(retries))) | ||
|
r20 | socket.setsockopt(zmq.LINGER, 0) | ||
socket.close() | ||||
poll.unregister(socket) | ||||
retries -= 1 | ||||
if retries == 0: | ||||
print('Server seems to be offline...') | ||||
|
r17 | socket = context.socket(zmq.REQ) | ||
socket.connect(SERVER_ENDPOINT) | ||||
poll.register(socket, zmq.POLLIN) | ||||
|
r20 | break | ||
# Create new connection | ||||
socket = context.socket(zmq.REQ) | ||||
socket.connect(SERVER_ENDPOINT) | ||||
poll.register(socket, zmq.POLLIN) | ||||
|
r17 | |||
|
r24 | |||
|
r17 | def main(realtime, code, date=None, interval=30): | ||
|
r19 | ''' | ||
Simulate data to be sended to server | ||||
''' | ||||
|
r17 | |||
while True: | ||||
|
r36 | if realtime: | ||
dt = datetime.now() | ||||
else: | ||||
dt = date | ||||
|
r22 | print(('Sending {} - {}'.format(code, dt))) | ||
|
r17 | |||
|
r27 | data = { | ||
'pcolor': ('Spectra', np.round(np.random.rand(4, 60, 100)*5 + 10, 2).tolist()), | ||||
'pcolorbuffer': ('RTI', np.round(np.random.rand(4, 100)*5 + 10, 2).tolist()), | ||||
|
r31 | 'scatterbuffer': ('Power noise', np.round(np.random.rand(4, 1) + np.array([[10],[11],[12],[13]]), 2).tolist()) | ||
|
r27 | } | ||
|
r17 | dato = { | ||
|
r36 | 'time': (datetime.utcnow()-datetime(1970,1,1)).total_seconds(), | ||
|
r24 | 'metadata': { | ||
|
r22 | 'yrange': np.arange(80, 120, 40/100.).tolist(), | ||
'xrange': np.arange(-30, 30).tolist(), | ||||
'localtime': True, | ||||
|
r27 | 'type': '', | ||
|
r36 | 'interval': interval, | ||
|
r22 | }, | ||
|
r27 | 'code': code, | ||
|
r22 | } | ||
|
r24 | |||
|
r36 | |||
|
r22 | for plot, d in data.items(): | ||
|
r27 | dato['plot'] = d[0] | ||
dato['metadata']['type'] = plot | ||||
dato['data'] = d[1] | ||||
send(dato) | ||||
|
r36 | |||
|
r17 | if realtime: | ||
time.sleep(interval) | ||||
else: | ||||
|
r36 | dt = dt + timedelta(seconds=interval) | ||
time.sleep(2) | ||||
|
r17 | |||
|
r20 | if __name__ == '__main__': | ||
|
r24 | parser = argparse.ArgumentParser(description='''This is a Client for | ||
realtime app''') | ||||
parser.add_argument('--date', action='store', default=None, | ||||
help='format: 2018/02/13 12:23:00') | ||||
parser.add_argument('-r', action='store_true', dest='realtime', | ||||
default=None) | ||||
|
r22 | parser.add_argument('-c', action='store', dest='code', default='172') | ||
|
r24 | parser.add_argument('-i', action='store', dest='interval', type=int, | ||
default=30) | ||||
|
r17 | |||
results = parser.parse_args() | ||||
if not results.realtime: | ||||
try: | ||||
results.date = datetime.strptime(results.date, '%Y/%m/%d %H:%M:%S') | ||||
except: | ||||
|
r24 | raise NameError('''You must specify a date (--date) | ||
for non-realtime experiment''') | ||||
|
r17 | main(results.realtime, results.code, results.date, results.interval) | ||