message_handler.py 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  1. from .connect_manager import ConnectionManager
  2. from models import WebSocket
  3. import json, asyncio
  4. from mcu.DeviceControl import DeviceControl, checkMcuConnection
  5. from mcu.BlueToothMode import BlueToothMode
  6. from databases import DeviceConfig, SqlQuery, CRUD, PhotoRecord, SysConfigs
  7. from mcu.capture.module_digicam import DigiCam
  8. from mcu.capture.smart_shooter_class import SmartShooter
  9. # socket消息发送逻辑处理方法
  10. async def handlerSend(
  11. manager: ConnectionManager, receiveData: str, websocket: WebSocket
  12. ):
  13. loop = asyncio.get_event_loop()
  14. receiveData = json.loads(receiveData)
  15. # 处理消息发送逻辑
  16. receiveData = json.loads(receiveData.get("text"))
  17. jsonType = receiveData.get("type")
  18. code = receiveData.get("code")
  19. msg = receiveData.get("msg")
  20. data = receiveData.get("data")
  21. print("receiveData", receiveData)
  22. print("jsonType", jsonType)
  23. def MsgCallback(msg):
  24. msg_id = msg.get("msg_id")
  25. match msg_id:
  26. case "PhotoUpdated":
  27. PhotoFilename = msg.get("PhotoFilename")
  28. if PhotoFilename != "" and PhotoFilename != None:
  29. print("收到照片:", json.dumps(msg, ensure_ascii=False))
  30. print("PhotoFilename", PhotoFilename)
  31. case "LiveviewUpdated":
  32. CameraLiveviewImage = msg.get("CameraLiveviewImage", None)
  33. # base64_to_image(CameraLiveviewImage, "liveview.jpg")
  34. # print("收到直播画面:", json.dumps(msg, ensure_ascii=False))
  35. match jsonType:
  36. case "ping":
  37. """发送心跳"""
  38. data = manager.jsonMessage("pong")
  39. await manager.send_personal_message(data, websocket)
  40. case "pong":
  41. """发送心跳"""
  42. pass
  43. case "forward_message":
  44. data = receiveData.get("data")
  45. dictMsg = {"code":code,"msg":msg,"data":data}
  46. await manager.broadcast(dictMsg)
  47. case "connect_mcu":
  48. device_ctrl = DeviceControl(websocket_manager=manager)
  49. device_ctrl.mcu_exit = False
  50. # if device_ctrl.serial_ins.check_connect():
  51. # print("未连接")
  52. loop.create_task(checkMcuConnection(device_ctrl), name="mcu")
  53. case "connect_bluetooth":
  54. blue_tooth = BlueToothMode(websocket_manager=manager)
  55. blue_tooth.bluetooth_exit = False
  56. # await blue_tooth.main_func()
  57. print("连接蓝牙信息")
  58. loop.create_task(blue_tooth.main_func(), name="blue_tooth")
  59. # loop.close()
  60. case "init_mcu":
  61. device_ctrl = DeviceControl(websocket_manager=manager)
  62. # 是否强制初始化
  63. is_force_init = data.get("value",False)
  64. loop.create_task(device_ctrl.initDevice(is_force_init), name="init_mcu")
  65. case "control_mcu":
  66. device_name = data.get("device_name")
  67. value = data.get("value")
  68. if (device_name == "" or device_name == None) or (
  69. value == "" or value == None
  70. ):
  71. data = manager.jsonMessage(
  72. code=1, msg="参数错误", msg_type="mcu"
  73. )
  74. await manager.send_personal_message(data, websocket)
  75. return
  76. device_ctrl = DeviceControl(websocket_manager=manager)
  77. device_ctrl.controlDevice(device_name, value)
  78. case "stop_action":
  79. device_ctrl = DeviceControl(websocket_manager=manager)
  80. if device_ctrl.is_runn_action == True:
  81. print("动作执行中,停止")
  82. device_ctrl.is_stop_action = True
  83. else:
  84. print("动作没有执行,略过")
  85. case "run_mcu":
  86. msg_type = "run_mcu"
  87. action_info = data.get("action", "执行左脚程序")
  88. goods_art_no = data.get("goods_art_no", None)
  89. if goods_art_no == None or goods_art_no =="":
  90. # 判断货号是否存在
  91. data = manager.jsonMessage(
  92. code=1, msg="goods_art_no不能为空", msg_type=msg_type
  93. )
  94. await manager.send_personal_message(data, websocket)
  95. return
  96. session = SqlQuery()
  97. sys_configs = CRUD(SysConfigs)
  98. action_configs = sys_configs.read(
  99. session, conditions={"key": "action_configs"}
  100. )
  101. action_configs_json = json.loads(action_configs.value)
  102. action_flag = "left"
  103. if "右" in action_info:
  104. action_flag = "right"
  105. tab_id = action_configs_json.get(action_flag)
  106. photoRecord = CRUD(PhotoRecord)
  107. goods_art_record = photoRecord.read(session,conditions={"goods_art_no": goods_art_no})
  108. if goods_art_record != None:
  109. data = manager.jsonMessage(
  110. code=1,
  111. msg=f"货号[{goods_art_no}]已存在,请勿重复拍摄~",
  112. msg_type=msg_type,
  113. )
  114. await manager.send_personal_message(data, websocket)
  115. return
  116. crud = CRUD(DeviceConfig)
  117. condtions = {"tab_id": tab_id}
  118. all_devices = crud.read_all(
  119. session, conditions=condtions, order_by="action_index", ascending=True
  120. )
  121. if len(all_devices) == 0:
  122. # 判断是否有可用配置
  123. data = manager.jsonMessage(code=1, msg="当前没有可用配置")
  124. await manager.send_personal_message(data, websocket, msg_type=msg_type)
  125. return
  126. action_list = [device.model_dump() for device in all_devices]
  127. print("action_list", action_list)
  128. device_ctrl = DeviceControl(websocket_manager=manager)
  129. loop.create_task(
  130. device_ctrl.run_mcu_config(action_list, goods_art_no, action_info),
  131. name="run_mcu_config",
  132. )
  133. case "run_mcu_single":
  134. device_ctrl = DeviceControl(websocket_manager=manager)
  135. loop.create_task(
  136. device_ctrl.run_mcu_config_single(data, None, "run_mcu_single"),
  137. name="run_mcu_single",
  138. )
  139. case "handler_take_picture":
  140. blue_tooth = BlueToothMode(websocket_manager=manager)
  141. loop.create_task(
  142. blue_tooth.remote_control_v2.handlerTakePhoto(),
  143. name="run_mcu_config",
  144. )
  145. case "re_take_picture":#重拍
  146. msg_type = "re_take_picture"
  147. record_id = data.get("record_id")
  148. session = SqlQuery()
  149. photoRecord = CRUD(PhotoRecord)
  150. goods_art_record = photoRecord.read(session, conditions={"id": record_id})
  151. if goods_art_record == None:
  152. data = manager.jsonMessage(
  153. code=1,
  154. msg=f"记录不存在,请核实后重新操作~",
  155. msg_type=msg_type,
  156. )
  157. await manager.send_personal_message(data, websocket)
  158. return
  159. action_id = goods_art_record.action_id
  160. goods_art_no = goods_art_record.goods_art_no
  161. image_index = goods_art_record.image_index
  162. crud = CRUD(DeviceConfig)
  163. condtions = {"id": action_id}
  164. device_action = crud.read(
  165. session, conditions=condtions
  166. )
  167. if device_action == None:
  168. # 判断是否有可用配置
  169. data = manager.jsonMessage(code=1, msg="当前没有可用配置")
  170. await manager.send_personal_message(data, websocket, msg_type=msg_type)
  171. return
  172. # 清除图片记录,执行重拍
  173. reset_data = {"image_path": None}
  174. photoRecord.update(session, record_id, **reset_data)
  175. device_ctrl = DeviceControl(websocket_manager=manager)
  176. loop.create_task(
  177. device_ctrl.run_mcu_config_single(
  178. device_action.model_dump(), goods_art_no, msg_type=msg_type,image_index=image_index
  179. ),
  180. name="run_mcu_config_single",
  181. )
  182. case "get_deviation":
  183. device_ctrl = DeviceControl(websocket_manager=manager)
  184. loop.create_task(
  185. device_ctrl.getDeviationInfo(),
  186. name="get_deviation",
  187. )
  188. case "set_deviation":
  189. device_ctrl = DeviceControl(websocket_manager=manager)
  190. value = data.get("value", None)
  191. action_name = data.get("action_name", None)
  192. loop.create_task(
  193. device_ctrl.set_deviation_cmd(value, action_name, "set"),
  194. name="set_deviation",
  195. )
  196. case "move_deviation":
  197. device_ctrl = DeviceControl(websocket_manager=manager)
  198. value = data.get("value", None)
  199. action_name = data.get("action_name", None)
  200. loop.create_task(
  201. device_ctrl.set_deviation_cmd(value, action_name, "move"),
  202. name="move_deviation",
  203. )
  204. case "get_mcu_other_info":
  205. device_ctrl = DeviceControl(websocket_manager=manager)
  206. loop.create_task(
  207. device_ctrl.getMcuOtherInfo(),
  208. name="mcu_other_set_get",
  209. )
  210. case "set_mcu_other_info":
  211. device_ctrl = DeviceControl(websocket_manager=manager)
  212. loop.create_task(
  213. device_ctrl.setMcuOtherInfo(data),
  214. name="setMcuOtherInfo",
  215. )
  216. case "send_command":
  217. device_ctrl = DeviceControl(websocket_manager=manager)
  218. loop.create_task(
  219. device_ctrl.sendCommand(data.get("command", None)),
  220. name="sendCommand",
  221. )
  222. case "smart_shooter_getinfo":
  223. '''
  224. 获取相机信息,是否连接
  225. '''
  226. smart_shooter = SmartShooter(
  227. websocket_manager=manager
  228. )
  229. smart_shooter.callback_listen = MsgCallback
  230. loop.create_task(
  231. smart_shooter.GetCameraInfo(),
  232. name="smart_shooter_getinfo",
  233. )
  234. loop.create_task(
  235. smart_shooter.connect_listen(),
  236. name="connect_listen",
  237. )
  238. case _:
  239. data = manager.jsonMessage(code=1, msg="未知消息")
  240. await manager.send_personal_message(data, websocket)
  241. return