diff --git a/tcp.py b/tcp.py new file mode 100644 index 0000000..9e26483 --- /dev/null +++ b/tcp.py @@ -0,0 +1,89 @@ +from __future__ import print_function + +from socket import socket, AF_INET, SOCK_STREAM + +import json +import time + +server = ('127.0.0.1', 2442) + + +def from_message(content): + try: + return json.loads(content) + except ValueError: + return {} + + +def to_message(typ, value='', params=None): + if params is None: + params = {} + return json.dumps({'type': typ, 'value': value, 'params': params}) + + +class Client(object): + first = True + def process(self, message): + typ = message.get('type', '') + value = message.get('value', '') + params = message.get('params', {}) + if not typ: + return + + print('->', typ) + + if value: + print('-> value', value) + + if params: + print('-> params: ', params) + + + def send(self, *args, **kwargs): + params = kwargs.get('params', {}) + if '_ID' not in params: + params['_ID'] = '{}'.format(int(time.time()*1000)) + kwargs['params'] = params + message = to_message(*args, **kwargs) + print('outgoing message:', message) + self.sock.send(message + '\n') # remember to send the newline at the end :) + + def connect(self): + print('connecting to', ':'.join(map(str, server))) + self.sock = socket(AF_INET, SOCK_STREAM) + self.sock.connect(server) + self.connected = True + try: + # send a simple example query after connected + self.send("STATION.GET_STATUS") + + while self.connected: + content = self.sock.recv(65500) + if not content: + break + print('incoming message') + + try: + message = json.loads(content) + except ValueError: + message = {} + + if not message: + continue + + self.process(message) + + finally: + self.sock.close() + + def close(self): + self.connected = False + + + +def main(): + s = Client() + s.connect() + +if __name__ == '__main__': + main()