diff --git a/service.py b/service.py index c249184..aa5cc74 100644 --- a/service.py +++ b/service.py @@ -84,7 +84,10 @@ class MeshMultiListener(MeshArgsParse): transport = BLETransport(device_config["address"], device_config["adapter"]) self.devices.append(MeshtDevice(transport, device_config['uuid'])) elif device_config["transport"] == "ws": - raise Exception("ws transport not impl") + logger.info("Found ws transport") + from transport_ws import WSTransport + transport = WSTransport(device_config["port"], device_config["uuid"]) + self.devices.append(MeshtDevice(transport, device_config['uuid'], True)) #set default mesh self.defaultDeviceUUID = self.json_config[0]["uuid"] @@ -189,8 +192,8 @@ class MongoDriver(MeshArgsParse): else: self.tryParseProtobuf(v) - if "decoded_payload_object" in v: - print(v["decoded_payload_object"]) + #if "decoded_payload_object" in v: + # print(v["decoded_payload_object"]) except: logger.error("Cannot decode protobuf: " + v.get("portnum", 0)) self.tryParseProtobuf(v) @@ -283,7 +286,7 @@ if __name__ == "__main__": #mesh parser.add_argument("--change-workdir", default=True, action="store_true") parser.add_argument("--mesh-config", default="./config/mesh.json") - parser.add_argument("--disable-mesh", action="store_true", default=True) + parser.add_argument("--disable-mesh", action="store_true", default=False) parser.add_argument("--enable-mesh", action="store_true", default=False, help="Need to run in docker if git is bullshit updates") ''' parser.add_argument("--transport", default="tcp") diff --git a/transport_ws.py b/transport_ws.py new file mode 100644 index 0000000..daf11b1 --- /dev/null +++ b/transport_ws.py @@ -0,0 +1,46 @@ +from fastapi import FastAPI, WebSocket, WebSocketDisconnect +from threading import Thread +import uvicorn +import asyncio + +#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 + "/{token}") + async def websocket_endpoint(*, websocket: WebSocket, token: str): + if token != self.token: + return + + await websocket.accept() + while True: + data = await websocket.receive_bytes() + await self._recv_q.put(data) + + 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): + item = await self._recv_q.get() + if item is None: + raise ConnectionError(self._error or "tcp transport error") + return item + + async def send(self, payload): + pass + + async def close(self): + pass \ No newline at end of file diff --git a/ui/srv.conf b/ui/srv.conf index 35781a5..fd31fa8 100644 --- a/ui/srv.conf +++ b/ui/srv.conf @@ -16,4 +16,13 @@ server { proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } + + location /ws/0/ { + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + proxy_http_version 1.1; + proxy_pass http://meshcenterbackend:60000; + } }