You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
58 lines
1.6 KiB
58 lines
1.6 KiB
from fastapi import FastAPI, WebSocket, WebSocketDisconnect, Query
|
|
from threading import Thread
|
|
import uvicorn
|
|
import asyncio
|
|
from protobuf_decoder.protobuf_decoder import Parser
|
|
from logger import logger
|
|
|
|
#only rx
|
|
class WSTransport:
|
|
def __init__(self, port, t, path = "/ws/0"):
|
|
self.port = port
|
|
self.token = t
|
|
self.path = path
|
|
self._recv_q = asyncio.Queue()
|
|
self.thread = None
|
|
|
|
self.app = FastAPI()
|
|
|
|
@self.app.websocket(self.path)
|
|
async def websocket_endpoint(*, websocket: WebSocket, token: str = Query("")):
|
|
if token != self.token:
|
|
return
|
|
|
|
await websocket.accept()
|
|
try:
|
|
while True:
|
|
data = await websocket.receive_bytes()
|
|
await self._recv_q.put(data)
|
|
except WebSocketDisconnect:
|
|
pass
|
|
|
|
async def start(self):
|
|
if self.thread != None:
|
|
return
|
|
|
|
def run():
|
|
uvicorn.run(self.app, host="0.0.0.0", port = int(self.port))
|
|
|
|
self.thread = Thread(target=run, daemon=True)
|
|
self.thread.start()
|
|
|
|
async def recv(self, packetParse = False):
|
|
item = await self._recv_q.get()
|
|
if item is None:
|
|
raise ConnectionError(self._error or "tcp transport error")
|
|
|
|
if packetParse:
|
|
to_parse = ' '.join(f'{byte:02x}' for byte in item)
|
|
res = Parser().parse(to_parse)
|
|
logger.info("[WS PACKET]", res.to_dict())
|
|
|
|
return item
|
|
|
|
async def send(self, payload):
|
|
pass
|
|
|
|
async def close(self):
|
|
pass
|