socket_server.py 3.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. import json
  2. import asyncio
  3. from models import *
  4. from .connect_manager import ConnectionManager
  5. from .message_handler import *
  6. from mcu.DeviceControl import DeviceControl,checkMcuConnection
  7. from mcu.BlueToothMode import BlueToothMode
  8. from mcu.capture.smart_shooter_class import SmartShooter
  9. import time
  10. from .socket_client import socket_manager
  11. conn_manager = ConnectionManager()
  12. active_connections = set()
  13. device_ctrl = DeviceControl(websocket_manager=conn_manager)
  14. blue_tooth = BlueToothMode(websocket_manager=conn_manager)
  15. smart_shooter = SmartShooter(websocket_manager=conn_manager)
  16. from utils.common import message_queue
  17. @app.websocket("/ws")
  18. async def websocket_endpoint(websocket: WebSocket):
  19. await conn_manager.connect(websocket)
  20. active_connections.add(websocket)
  21. smart_shooter.websocket = websocket
  22. try:
  23. # await socket_manager.connect()
  24. async def handler_messages():
  25. while True:
  26. try:
  27. byteDats = await websocket.receive()
  28. socket_type = byteDats.get("type")
  29. if socket_type == "websocket.disconnect":
  30. smart_shooter.stop_listen = True
  31. device_ctrl.close_connect()
  32. device_ctrl.mcu_exit = True
  33. device_ctrl.clearMyInstance()
  34. diviceList = blue_tooth.devices
  35. if len(diviceList) == 0:
  36. blue_tooth.bluetooth_exit = True
  37. blue_tooth.clearMyInstance()
  38. break
  39. diviceAddress = list(diviceList.keys())[0]
  40. if diviceAddress != "":
  41. print(diviceList.get(diviceAddress))
  42. diviceName = diviceList[diviceAddress]["name"]
  43. blue_tooth.disconnect_device(diviceAddress, diviceName)
  44. blue_tooth.bluetooth_exit = True
  45. blue_tooth.clearMyInstance()
  46. break
  47. print("byteDats", byteDats)
  48. await handlerSend(
  49. conn_manager, json.dumps(byteDats), websocket, smart_shooter
  50. )
  51. except Exception as e:
  52. print(e)
  53. break
  54. # async def checkConnMcu():
  55. # await checkMcuConnection(device_ctrl)
  56. # async def connectBlueTooth():
  57. # await blue_tooth.main_func()
  58. async def send_message():
  59. while True:
  60. try:
  61. message = await message_queue.get()
  62. await websocket.send_json(message)
  63. except Exception as e:
  64. print(e)
  65. break
  66. await asyncio.gather(handler_messages(), send_message())
  67. except WebSocketDisconnect:
  68. # socket_manager.close()
  69. print("Client disconnected")
  70. finally:
  71. active_connections.discard(websocket)
  72. # if websocket:
  73. # await websocket.close()
  74. @app.on_event("shutdown")
  75. async def shutdown_event():
  76. print("Shutting down...")
  77. # socket_manager.close()
  78. # 清理操作
  79. for connection in list(active_connections):
  80. try:
  81. await connection.close()
  82. except Exception as e:
  83. print(f"Error closing connection: {e}")