socket_server.py 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  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. from sqlalchemy.exc import NoResultFound
  12. import os, datetime
  13. conn_manager = ConnectionManager()
  14. active_connections = set()
  15. device_ctrl = DeviceControl(websocket_manager=conn_manager)
  16. blue_tooth = BlueToothMode(websocket_manager=conn_manager)
  17. smart_shooter = SmartShooter(websocket_manager=conn_manager)
  18. from utils.common import message_queue
  19. async def updateDataRecord(PhotoFilename, id):
  20. await asyncio.sleep(0.01)
  21. create_time = datetime.datetime.fromtimestamp(os.path.getctime(PhotoFilename))
  22. data = {"id": id, "image_path": PhotoFilename, "photo_create_time": create_time}
  23. # record_model = PhotoRecord(**data)
  24. session = SqlQuery()
  25. record_model = CRUD(PhotoRecord)
  26. model = record_model.read(session, conditions={"id": id})
  27. if model == None:
  28. print(f"smart shooter 拍照记录更新失败,记录id:{id},不存在")
  29. else:
  30. # 走编辑逻辑
  31. record_model.updateConditions(session, conditions={"id": id}, **data)
  32. print(f"smart shooter 拍照记录更新成功,记录id:{id}")
  33. @app.websocket("/ws")
  34. async def websocket_endpoint(websocket: WebSocket):
  35. # await websocket.accept()
  36. await conn_manager.connect(websocket)
  37. active_connections.add(websocket)
  38. smart_shooter.websocket = websocket
  39. try:
  40. # await socket_manager.connect()
  41. async def handler_messages():
  42. while True:
  43. try:
  44. byteDats = await websocket.receive()
  45. socket_type = byteDats.get("type")
  46. if socket_type == "websocket.disconnect":
  47. smart_shooter.stop_listen = True
  48. device_ctrl.close_connect()
  49. device_ctrl.mcu_exit = True
  50. device_ctrl.clearMyInstance()
  51. diviceList = blue_tooth.devices
  52. if len(diviceList) == 0:
  53. blue_tooth.bluetooth_exit = True
  54. blue_tooth.clearMyInstance()
  55. break
  56. diviceAddress = list(diviceList.keys())[0]
  57. if diviceAddress != "":
  58. print(diviceList.get(diviceAddress))
  59. diviceName = diviceList[diviceAddress]["name"]
  60. blue_tooth.disconnect_device(diviceAddress, diviceName)
  61. blue_tooth.bluetooth_exit = True
  62. blue_tooth.clearMyInstance()
  63. break
  64. print("byteDats", byteDats)
  65. await handlerSend(
  66. conn_manager, json.dumps(byteDats), websocket, smart_shooter
  67. )
  68. except Exception as e:
  69. print(e)
  70. break
  71. # async def checkConnMcu():
  72. # await checkMcuConnection(device_ctrl)
  73. # async def connectBlueTooth():
  74. # await blue_tooth.main_func()
  75. async def send_message():
  76. while True:
  77. try:
  78. message = await message_queue.get()
  79. await websocket.send_json(message)
  80. except Exception as e:
  81. print(e)
  82. break
  83. async def MsgCallback(msg):
  84. msg_id = msg.get("msg_id")
  85. match msg_id:
  86. case "PhotoUpdated":
  87. PhotoFilename = msg.get("PhotoFilename")
  88. PhotoLocation = msg.get("PhotoLocation")
  89. PhotoOrigin = msg.get("PhotoOrigin")
  90. if (PhotoFilename != "" and PhotoFilename != None) and (
  91. PhotoLocation == "Local Disk"
  92. ):
  93. # temp_photo_name = PhotoFilename
  94. # 更新拍照记录
  95. print("PhotoFilename", PhotoFilename, PhotoOrigin)
  96. if PhotoOrigin != "" and PhotoOrigin != "external":
  97. goods_art_no, id = PhotoOrigin.split(",")
  98. await updateDataRecord(PhotoFilename, id)
  99. data = conn_manager.jsonMessage(
  100. code=0,
  101. msg=f"照片获取成功",
  102. data={"photo_file_name": PhotoFilename},
  103. msg_type="smart_shooter_photo_take",
  104. )
  105. await conn_manager.send_personal_message(data, websocket)
  106. case "LiveviewUpdated":
  107. CameraLiveviewImage = msg.get("CameraLiveviewImage", None)
  108. # base64_to_image(CameraLiveviewImage, "liveview.jpg")
  109. # print("收到直播画面:CameraLiveviewImage")
  110. data = conn_manager.jsonMessage(
  111. code=1,
  112. msg=f"预览数据发送",
  113. data={"smart_shooter_preview": CameraLiveviewImage},
  114. msg_type="smart_shooter_enable_preview",
  115. )
  116. await conn_manager.send_personal_message(data, websocket)
  117. smart_shooter.callback_listen = MsgCallback
  118. loop = asyncio.get_event_loop()
  119. loop.run_in_executor(None, smart_shooter.connect_listen) # 后台线程启动监听
  120. await asyncio.gather(handler_messages(), send_message())
  121. except WebSocketDisconnect:
  122. # socket_manager.close()
  123. print("Client disconnected")
  124. finally:
  125. active_connections.discard(websocket)
  126. # if websocket:
  127. # await websocket.close()
  128. # @app.on_event("startup")
  129. # async def startup_event():
  130. # loop = asyncio.get_event_loop()
  131. # loop.run_in_executor(None, await smart_shooter.connect_listen)
  132. # print("监听服务已启动")
  133. @app.on_event("shutdown")
  134. async def shutdown_event():
  135. print("Shutting down...")
  136. # socket_manager.close()
  137. # 清理操作
  138. for connection in list(active_connections):
  139. try:
  140. await connection.close()
  141. except Exception as e:
  142. print(f"Error closing connection: {e}")