websocket2minitel.py 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. #!/usr/bin/env python3
  2. import serial
  3. import asyncio
  4. import websockets
  5. import sys
  6. ser = None # serial connection
  7. ws = None # websocket connection
  8. async def bridge(url, tty, speed):
  9. "Initializes connection to websocket and local serial port"
  10. global ser, ws
  11. ser = serial.Serial(tty, speed, parity=serial.PARITY_EVEN,
  12. bytesize=7, timeout=1,stopbits=serial.STOPBITS_ONE,
  13. xonxoff=False,rtscts=False)
  14. ws = await websockets.connect(url, ping_interval=None)
  15. ser.write(b'\x07\x0c\x1f\x40\x41connexion\x0a')
  16. # cancel local echo (keyboard > modem > screen)
  17. ser.write(b'\x1b\x3b\x60\x58\x52')
  18. async def w2m():
  19. "websocket > minitel"
  20. while (True):
  21. #data = await ws.recv()
  22. try:
  23. data = await ws.recv()
  24. except websockets.exceptions.ConnectionClosedError:
  25. print("Connection closed by remote host.")
  26. exit(-1)
  27. except websockets.exceptions.ConnectionClosedOK:
  28. exit(0)
  29. ser.write(data.encode())
  30. async def m2w():
  31. "websocket < minitel"
  32. while (True):
  33. if ser.inWaiting() > 0:
  34. tosend = ser.read(ser.inWaiting()).decode()
  35. await ws.send(tosend)
  36. else:
  37. await asyncio.sleep(0.1)
  38. if __name__ == '__main__':
  39. loop = asyncio.get_event_loop()
  40. loop.run_until_complete(bridge(sys.argv[1], sys.argv[2], sys.argv[3]))
  41. loop.run_until_complete(asyncio.gather(w2m(), m2w()))