diff options
author | Chris Liechti <cliechti@gmx.net> | 2016-06-23 23:31:59 +0200 |
---|---|---|
committer | Chris Liechti <cliechti@gmx.net> | 2016-06-23 23:31:59 +0200 |
commit | 7b0d774785c8c5d89fb1ac70bf4d2c4027a71684 (patch) | |
tree | 3a7a2c844a5eb821382f0829ef239265edf19b26 | |
parent | 9a16666a667ca476b50c68d6ebdc515e6fa8c44d (diff) | |
download | pyserial-git-7b0d774785c8c5d89fb1ac70bf4d2c4027a71684.tar.gz |
examples: add client mode to tcp_serial_redirect.py, closes #72
-rwxr-xr-x | examples/tcp_serial_redirect.py | 63 |
1 files changed, 53 insertions, 10 deletions
diff --git a/examples/tcp_serial_redirect.py b/examples/tcp_serial_redirect.py index 1d8b917..6131a21 100755 --- a/examples/tcp_serial_redirect.py +++ b/examples/tcp_serial_redirect.py @@ -10,7 +10,7 @@ import sys import socket import serial import serial.threaded - +import time class SerialToNet(serial.threaded.Protocol): """serial->socket""" @@ -23,7 +23,10 @@ class SerialToNet(serial.threaded.Protocol): def data_received(self, data): if self.socket is not None: - self.socket.sendall(data) + try: + self.socket.sendall(data) + except serial.SerialException as e: + sys.stderr.write('ERROR: {}\n'.format(e)) if __name__ == '__main__': # noqa @@ -56,6 +59,12 @@ it waits for the next connect. help='suppress non error messages', default=False) + parser.add_argument( + '--develop', + action='store_true', + help='Development mode, prints Python internals on errors', + default=False) + group = parser.add_argument_group('serial port') group.add_argument( @@ -91,12 +100,20 @@ it waits for the next connect. group = parser.add_argument_group('network settings') - group.add_argument( + exclusive_group = group.add_mutually_exclusive_group() + + exclusive_group.add_argument( '-P', '--localport', type=int, help='local TCP port', default=7777) + exclusive_group.add_argument( + '-c', '--client', + metavar='HOST:PORT', + help='make the connection as a client, instead of running a server', + default=False) + args = parser.parse_args() # connect to serial port @@ -127,15 +144,32 @@ it waits for the next connect. serial_worker = serial.threaded.ReaderThread(ser, ser_to_net) serial_worker.start() - srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) - srv.bind(('', args.localport)) - srv.listen(1) + if not args.client: + srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + srv.bind(('', args.localport)) + srv.listen(1) try: + intentional_exit = False while True: - sys.stderr.write('Waiting for connection on {}...\n'.format(args.localport)) - client_socket, addr = srv.accept() - sys.stderr.write('Connected by {}\n'.format(addr)) + if args.client: + host, port = args.client.split(':') + sys.stderr.write("Opening connection to {}:{}...\n".format(host, port)) + client_socket = socket.socket() + try: + client_socket.connect((host, int(port))) + except socket.error as msg: + sys.stderr.write('WARNING: {}\n'.format(msg)) + time.sleep(5) # intentional delay on reconnection as client + continue + sys.stderr.write('Connected\n') + client_socket.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) + + #~ client_socket.settimeout(5) + else: + sys.stderr.write('Waiting for connection on {}...\n'.format(args.localport)) + client_socket, addr = srv.accept() + sys.stderr.write('Connected by {}\n'.format(addr)) try: ser_to_net.socket = client_socket # enter network <-> serial loop @@ -146,15 +180,24 @@ it waits for the next connect. break ser.write(data) # get a bunch of bytes and send them except socket.error as msg: + if args.develop: + raise sys.stderr.write('ERROR: {}\n'.format(msg)) # probably got disconnected break + except KeyboardInterrupt: + intentional_exit = True + raise except socket.error as msg: + if args.develop: + raise sys.stderr.write('ERROR: {}\n'.format(msg)) finally: ser_to_net.socket = None sys.stderr.write('Disconnected\n') client_socket.close() + if args.client and not intentional_exit: + time.sleep(5) # intentional delay on reconnection as client except KeyboardInterrupt: pass |