diff options
author | Chris Liechti <cliechti@gmx.net> | 2015-09-07 23:38:37 +0200 |
---|---|---|
committer | Chris Liechti <cliechti@gmx.net> | 2015-09-07 23:38:37 +0200 |
commit | 6948bd8f80bc7760ed70cb1bae9106bf59546a4f (patch) | |
tree | 558d74ba339f86ca1edb4598094a876f0ccecd37 /examples | |
parent | 4059dc609dbe846caeedb4515574e98612306c99 (diff) | |
download | pyserial-git-6948bd8f80bc7760ed70cb1bae9106bf59546a4f.tar.gz |
rfc2217_server: API update, cleanup
Diffstat (limited to 'examples')
-rwxr-xr-x | examples/rfc2217_server.py | 72 |
1 files changed, 35 insertions, 37 deletions
diff --git a/examples/rfc2217_server.py b/examples/rfc2217_server.py index 53f11b4..10c47c5 100755 --- a/examples/rfc2217_server.py +++ b/examples/rfc2217_server.py @@ -8,7 +8,6 @@ # SPDX-License-Identifier: BSD-3-Clause import logging -import os import socket import sys import time @@ -16,6 +15,7 @@ import threading import serial import serial.rfc2217 + class Redirector(object): def __init__(self, serial_instance, socket, debug=False): self.serial = serial_instance @@ -24,7 +24,7 @@ class Redirector(object): self.rfc2217 = serial.rfc2217.PortManager( self.serial, self, - logger = logging.getLogger('rfc2217.server') if debug else None + logger=logging.getLogger('rfc2217.server') if debug else None ) self.log = logging.getLogger('redirector') @@ -40,12 +40,12 @@ class Redirector(object): from one side to the other""" self.alive = True self.thread_read = threading.Thread(target=self.reader) - self.thread_read.setDaemon(True) - self.thread_read.setName('serial->socket') + self.thread_read.daemon = True + self.thread_read.name = 'serial->socket' self.thread_read.start() self.thread_poll = threading.Thread(target=self.statusline_poller) - self.thread_poll.setDaemon(True) - self.thread_poll.setName('status line poll') + self.thread_poll.daemon = True + self.thread_poll.name = 'status line poll' self.thread_poll.start() self.writer() @@ -54,15 +54,10 @@ class Redirector(object): self.log.debug('reader thread started') while self.alive: try: - data = self.serial.read(1) # read one, blocking - n = self.serial.inWaiting() # look if there is more - if n: - data = data + self.serial.read(n) # and get as much as possible + data = self.serial.read(self.serial.in_waiting or 1) if data: # escape outgoing data when needed (Telnet IAC (0xff) character) - data = serial.to_bytes(self.rfc2217.escape(data)) - with self._write_lock: - self.socket.sendall(data) # send it over TCP + self.write(serial.to_bytes(self.rfc2217.escape(data))) except socket.error as msg: self.log.error('%s' % (msg,)) # probably got disconnected @@ -102,8 +97,8 @@ if __name__ == '__main__': import argparse parser = argparse.ArgumentParser( - description = "RFC 2217 Serial to Network (TCP/IP) redirector.", - epilog = """\ + description="RFC 2217 Serial to Network (TCP/IP) redirector.", + epilog="""\ NOTE: no security measures are implemented. Anyone can remotely connect to this service over the network. @@ -113,14 +108,16 @@ it waits for the next connect. parser.add_argument('SERIALPORT') - parser.add_argument('-p', '--localport', + parser.add_argument( + '-p', '--localport', type=int, help='local TCP port, default: %(default)s', metavar='TCPPORT', default=2217 ) - parser.add_argument('-v', '--verbose', + parser.add_argument( + '-v', '--verbose', dest='verbosity', action='count', help='print more diagnostic messages (option can be given multiple times)', @@ -138,43 +135,43 @@ it waits for the next connect. logging.NOTSET, )[args.verbosity] logging.basicConfig(level=logging.INFO) - logging.getLogger('root').setLevel(logging.INFO) + #~ logging.getLogger('root').setLevel(logging.INFO) logging.getLogger('rfc2217').setLevel(level) # connect to serial port ser = serial.serial_for_url(args.SERIALPORT, do_not_open=True) - ser.timeout = 3 # required so that the reader thread can exit + ser.timeout = 3 # required so that the reader thread can exit + # reset control line as no _remote_ "terminal" has been connected yet + ser.dtr = False + ser.rts = False logging.info("RFC 2217 TCP/IP to Serial redirector - type Ctrl-C / BREAK to quit") try: ser.open() except serial.SerialException as e: - logging.error("Could not open serial port %s: %s" % (ser.name, e)) + logging.error("Could not open serial port {}: {}".format(ser.name, e)) sys.exit(1) - logging.info("Serving serial port: %s" % (ser.name,)) - settings = ser.getSettingsDict() - # reset control line as no _remote_ "terminal" has been connected yet - ser.setDTR(False) - ser.setRTS(False) + logging.info("Serving serial port: {}".format(ser.name)) + settings = ser.get_settings() 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) - logging.info("TCP/IP port: %s" % (args.localport,)) + logging.info("TCP/IP port: {}".format(args.localport)) while True: try: - connection, addr = srv.accept() - logging.info('Connected by %s:%s' % (addr[0], addr[1])) - connection.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) - ser.setRTS(True) - ser.setDTR(True) + client_socket, addr = srv.accept() + logging.info('Connected by {}:{}'.format(addr[0], addr[1])) + client_socket.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) + ser.rts = True + ser.dtr = True # enter network <-> serial loop r = Redirector( ser, - connection, + client_socket, args.verbosity > 0 ) try: @@ -182,15 +179,16 @@ it waits for the next connect. finally: logging.info('Disconnected') r.stop() - connection.close() - ser.setDTR(False) - ser.setRTS(False) + client_socket.close() + ser.dtr = False + ser.rts = False # Restore port settings (may have been changed by RFC 2217 # capable client) - ser.applySettingsDict(settings) + ser.apply_settings(settings) except KeyboardInterrupt: + sys.stdout.write('\n') break except socket.error as msg: - logging.error('%s' % (msg,)) + logging.error(str(msg)) logging.info('--- exit ---') |