Improve net-to-serial proxy

This commit is contained in:
2021-12-31 18:44:47 +01:00
parent a57b9c6b5a
commit a769205906
3 changed files with 49 additions and 16 deletions

10
daemons/config.ini Normal file
View File

@@ -0,0 +1,10 @@
[Daemon]
LogLevel = debug
ListeningIP = 0.0.0.0
ListeningPort = 2560
[Serial]
Port = /dev/ttyACM0
Baudrate = 115200
# Timeout in milliseconds
Timeout = 100

View File

@@ -1,11 +1,15 @@
import logging
import serial import serial
import asyncio import asyncio
import configparser
class SerialDaemon: class SerialDaemon:
def __init__(self): def __init__(self, config):
self.ser = serial.Serial('/dev/pts/7') # WIP self.ser = serial.Serial(
self.ser.baudrate = 115200 config["Serial"]["Port"],
timeout=int(config["Serial"]["Timeout"])/1000)
self.ser.baudrate = config["Serial"]["Baudrate"]
def __del__(self): def __del__(self):
try: try:
@@ -15,27 +19,48 @@ class SerialDaemon:
async def handle_echo(self, reader, writer): async def handle_echo(self, reader, writer):
data = await reader.read(100) data = await reader.read(100)
message = data.decode()
addr = writer.get_extra_info('peername') addr = writer.get_extra_info('peername')
print(f"Received {message!r} from {addr!r}") logging.info("Received {} from {}".format(data, addr[0]))
self.ser.write(data) self.ser.write(data)
response = self.read_until() response = line = self.ser.read()
print(f"Send: {response!r}") while line.strip():
line = self.ser.read_until()
if not line.decode().startswith("<*"):
response += line
logging.info("Send: {}".format(response))
writer.write(response) writer.write(response)
await writer.drain() await writer.drain()
print("Close the connection") logging.info("Close the connection")
writer.close() writer.close()
async def return_board(self):
self.ser.write(b'<s>')
self.ser.read_until() # we need the second line
return(self.ser.read_until().decode().strip('\n'))
async def main(): async def main():
sd = SerialDaemon() config = configparser.ConfigParser()
config.read("config.ini")
logging.basicConfig(level=config["Daemon"]["LogLevel"].upper())
sd = SerialDaemon(config)
server = await asyncio.start_server( server = await asyncio.start_server(
sd.handle_echo, '127.0.0.1', 2560) # WIP sd.handle_echo,
addrs = ', '.join(str(sock.getsockname()) for sock in server.sockets) config["Daemon"]["ListeningIP"],
print(f'Serving on {addrs}') config["Daemon"]["ListeningPort"])
addr = server.sockets[0].getsockname()
logging.warning("Serving on {} port {}".format(addr[0], addr[1]))
logging.warning(
"Proxying to {} (Baudrate: {}, Timeout: {})".format(
config["Serial"]["Port"],
config["Serial"]["Baudrate"],
config["Serial"]["Timeout"]))
logging.warning(
await sd.return_board())
async with server: async with server:
await server.serve_forever() await server.serve_forever()

View File

@@ -6,14 +6,12 @@ from driver.models import DriverConfiguration
class Connector: class Connector:
def __init__(self): def __init__(self):
config = DriverConfiguration.get_solo() self.config = DriverConfiguration.get_solo()
self.remote_host = config.remote_host
self.remote_port = config.remote_port
def __send_data(self, message): def __send_data(self, message):
# to be encoded # to be encoded
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock: with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
sock.connect((self.remote_host, self.remote_port)) sock.connect((self.config.remote_host, self.config.remote_port))
sock.sendall(message) sock.sendall(message)
resp = sock.recv(1024) resp = sock.recv(1024)