smart_shooter_class.py 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322
  1. import json
  2. import datetime
  3. import random
  4. import zmq
  5. import asyncio
  6. from PIL import Image
  7. from io import BytesIO
  8. import base64
  9. import zmq, sys
  10. from utils.SingletonType import SingletonType
  11. # 定义为单例模式,避免被重复实例化
  12. class SmartShooter(metaclass=SingletonType):
  13. SET_REQ = "tcp://127.0.0.1:54544"
  14. LISTEN_REQ = "tcp://127.0.0.1:54543"
  15. def __init__(self, websocket_manager):
  16. self.msg_type = "smart_shooter"
  17. self.websocket_manager = websocket_manager
  18. # 是否停止监听
  19. self.stop_listen = False
  20. # 相机连接状态
  21. self.connect_status = False
  22. # 实时预览状态
  23. self.perview_state = False
  24. self.callback_listen = None
  25. self.listen_init = False
  26. self.websocket = None
  27. # loop = asyncio.get_event_loop()
  28. # loop.create_task(
  29. # self.connect_listen(),
  30. # name="connect_listen",
  31. # )
  32. def __send_tcp_message(self, socket, msg):
  33. # await asyncio.sleep(0.01)
  34. socket.send_string(json.dumps(msg))
  35. rep = socket.recv()
  36. str_msg = rep.decode("utf-8")
  37. json_msg = json.loads(str_msg)
  38. return json_msg
  39. def __create_req(self) -> tuple[zmq.Socket, zmq.Context]:
  40. context = zmq.Context()
  41. req_socket = context.socket(zmq.REQ)
  42. # 设置发送超时为 5000 毫秒(5 秒)
  43. req_socket.setsockopt(zmq.RCVTIMEO, 2000)
  44. # 设置接收超时为 5000 毫秒(5 秒)
  45. req_socket.setsockopt(zmq.SNDTIMEO, 2000)
  46. req_socket.setsockopt(zmq.LINGER, 0) # 设置为 0 表示不等待未完成的操作
  47. req_socket.connect(self.SET_REQ)
  48. return req_socket, context
  49. def __create_listen(self) -> tuple[zmq.Socket, zmq.Context]:
  50. context = zmq.Context()
  51. listen_socket = context.socket(zmq.SUB)
  52. listen_socket.setsockopt(zmq.SUBSCRIBE, b"")
  53. # 设置发送超时为 5000 毫秒(5 秒)
  54. listen_socket.setsockopt(zmq.RCVTIMEO, 2000)
  55. # 设置接收超时为 5000 毫秒(5 秒)
  56. listen_socket.setsockopt(zmq.SNDTIMEO, 2000)
  57. listen_socket.setsockopt(zmq.LINGER, 0) # 设置为 0 表示不等待未完成的操作
  58. listen_socket.connect(self.LISTEN_REQ)
  59. return listen_socket, context
  60. async def GetCameraInfo(self, is_send=True, msg_type=""):
  61. await asyncio.sleep(0.01)
  62. self.msg_type = msg_type
  63. """
  64. 实时获取相机信息,是否连接、软件是否被打开
  65. """
  66. try:
  67. socket, context = self.__create_req()
  68. req = {}
  69. req["msg_type"] = "Request"
  70. req["msg_id"] = "GetCamera"
  71. req["msg_seq_num"] = 0
  72. req["CameraSelection"] = "All"
  73. json_msg = self.__send_tcp_message(socket, req)
  74. msg_result = json_msg.get("msg_result")
  75. if not msg_result:
  76. self.connect_status = False
  77. msg_send = "相机未连接或软件未打开"
  78. if is_send:
  79. message = {
  80. "code": 1,
  81. "msg": msg_send,
  82. "data": None,
  83. "msg_type": self.msg_type,
  84. "device_status": -1,
  85. }
  86. await self.websocket_manager.send_personal_message(message,self.websocket)
  87. return False, msg_send
  88. cameraInfo = json_msg.get("CameraInfo")
  89. if cameraInfo == None or len(cameraInfo) == 0:
  90. self.connect_status = False
  91. msg_send = "相机未连接"
  92. if is_send:
  93. message = {
  94. "code": 1,
  95. "msg": msg_send,
  96. "data": None,
  97. "msg_type": self.msg_type,
  98. "device_status": -1,
  99. }
  100. await self.websocket_manager.send_personal_message(message,self.websocket)
  101. return False, "相机未连接"
  102. # 链接的相机
  103. # connect_camera = cameraInfo
  104. CameraStatus = any(
  105. item.get("CameraStatus") == "Ready" for item in cameraInfo
  106. )
  107. # CameraStatus = connect_camera.get("CameraStatus")
  108. if not CameraStatus:
  109. self.connect_status = False
  110. msg_send = "相机未连接"
  111. if is_send:
  112. message = {
  113. "code": 1,
  114. "msg": msg_send,
  115. "data": None,
  116. "msg_type": self.msg_type,
  117. "device_status": -1,
  118. }
  119. await self.websocket_manager.send_personal_message(message,self.websocket)
  120. return False, msg_send
  121. self.connect_status = True
  122. msg_send = "相机已连接"
  123. if is_send:
  124. message = {
  125. "code": 0,
  126. "msg": msg_send,
  127. "data": None,
  128. "msg_type": self.msg_type,
  129. "device_status": 2,
  130. }
  131. await self.websocket_manager.send_personal_message(message,self.websocket)
  132. return True, "相机已连接"
  133. except:
  134. self.connect_status = False
  135. socket.close()
  136. context.term()
  137. msg_send = "相机未连接或软件未打开"
  138. if is_send:
  139. message = {
  140. "code": 1,
  141. "msg": msg_send,
  142. "data": None,
  143. "msg_type": self.msg_type,
  144. "device_status": -1,
  145. }
  146. await self.websocket_manager.send_personal_message(message,self.websocket)
  147. return False, msg_send
  148. async def EnableCameraPreview(self, enable_status=True, msg_type=""):
  149. self.msg_type = msg_type
  150. """
  151. 激活相机预览
  152. """
  153. camera_states, _ = await self.GetCameraInfo(is_send=False)
  154. if not camera_states:
  155. return False, "请先连接相机"
  156. try:
  157. socket, context = self.__create_req()
  158. req = {}
  159. req["msg_type"] = "Request"
  160. req["msg_id"] = "EnableLiveview"
  161. req["msg_seq_num"] = 0
  162. req["CameraSelection"] = "All"
  163. req["Enable"] = enable_status
  164. json_msg = self.__send_tcp_message(socket, req)
  165. msg_result = json_msg.get("msg_result")
  166. if not msg_result:
  167. self.perview_state = False
  168. msg_send = "预览启用失败"
  169. self.sendSocketMessage(
  170. code=0,
  171. msg=msg_send,
  172. device_status=2,
  173. )
  174. return False, "预览启用失败"
  175. msg_send = "预览启用成功" if enable_status else "预览关闭成功"
  176. message = {
  177. "code": 0,
  178. "msg": msg_send,
  179. "data": None,
  180. "msg_type": self.msg_type,
  181. "device_status": 2,
  182. }
  183. await self.websocket_manager.send_personal_message(message,self.websocket)
  184. return True, "预览启用成功" if enable_status else "预览关闭成功"
  185. except:
  186. self.perview_state = False
  187. socket.close()
  188. context.term()
  189. msg_send = "相机未连接或软件未打开"
  190. message = {
  191. "code": 1,
  192. "msg": msg_send,
  193. "data": None,
  194. "msg_type": self.msg_type,
  195. "device_status": -1,
  196. }
  197. await self.websocket_manager.send_personal_message(message,self.websocket)
  198. return False, "相机未连接或软件未打开"
  199. async def CameraAutofocus(self):
  200. """
  201. 相机自动对焦
  202. """
  203. camera_states, _ = await self.GetCameraInfo(is_send=False)
  204. if not camera_states:
  205. return False, "请先连接相机"
  206. try:
  207. socket, context = self.__create_req()
  208. req = {}
  209. req["msg_type"] = "Request"
  210. req["msg_id"] = "Autofocus"
  211. req["msg_seq_num"] = 0
  212. req["CameraSelection"] = "All"
  213. json_msg = self.__send_tcp_message(socket, req)
  214. print("json_msg", json_msg)
  215. msg_result = json_msg.get("msg_result")
  216. if not msg_result:
  217. return False, "对焦失败"
  218. return True, "对焦成功"
  219. except:
  220. socket.close()
  221. context.term()
  222. return False, "相机未连接或软件未打开"
  223. async def CameraShooter(self, msg_type=""):
  224. self.msg_type = msg_type
  225. """
  226. 执行拍照
  227. """
  228. camera_states, _ = await self.GetCameraInfo(is_send=False)
  229. if not camera_states:
  230. return False, "请先连接相机"
  231. try:
  232. socket, context = self.__create_req()
  233. req = {}
  234. req["msg_type"] = "Request"
  235. req["msg_id"] = "Shoot"
  236. req["msg_seq_num"] = 1
  237. req["CameraSelection"] = "All"
  238. json_msg = self.__send_tcp_message(socket, req)
  239. print("CameraShooter", json_msg)
  240. msg_result = json_msg.get("msg_result")
  241. if not msg_result:
  242. msg_send = "拍照失败"
  243. message = {
  244. "code": 1,
  245. "msg": msg_send,
  246. "data": None,
  247. "msg_type": self.msg_type,
  248. "device_status": -1,
  249. }
  250. await self.websocket_manager.send_personal_message(message,self.websocket)
  251. return False, msg_send
  252. msg_send = "拍照成功"
  253. message = {
  254. "code": 0,
  255. "msg": msg_send,
  256. "data": None,
  257. "msg_type": self.msg_type,
  258. "device_status": 2,
  259. }
  260. await self.websocket_manager.send_personal_message(message,self.websocket)
  261. return True, "拍照成功"
  262. except:
  263. socket.close()
  264. context.term()
  265. msg_send = "相机未连接或软件未打开"
  266. message = {
  267. "code": 1,
  268. "msg": msg_send,
  269. "data": None,
  270. "msg_type": self.msg_type,
  271. "device_status": -1,
  272. }
  273. await self.websocket_manager.send_personal_message(message,self.websocket)
  274. return False, msg_send
  275. async def connect_listen(self):
  276. if self.connect_status == True or self.listen_init == True:
  277. return True
  278. # 发起监听
  279. sub_socket, context = self.__create_listen()
  280. print("构建监听", self.connect_status)
  281. while True:
  282. self.listen_init = True
  283. await asyncio.sleep(0.01)
  284. if self.callback_listen == None:
  285. continue
  286. camera_states, camera_msg = await self.GetCameraInfo(is_send=False)
  287. if not camera_states:
  288. print("相机未连接")
  289. await asyncio.sleep(0.01) # 等待相机连接
  290. continue
  291. if self.stop_listen:
  292. break
  293. try:
  294. self.connect_status = True
  295. raw = sub_socket.recv()
  296. str_msg = raw.decode("utf-8")
  297. json_msg = json.loads(str_msg)
  298. if json_msg["msg_id"] == "NetworkPing":
  299. continue
  300. await self.callback_listen(json_msg)
  301. except zmq.Again:
  302. print("接收超时,继续监听...")
  303. continue
  304. except Exception as e:
  305. self.connect_status = False
  306. print(f"发生错误: {e}")
  307. break
  308. self.listen_init = False
  309. sub_socket.close()
  310. context.term()
  311. print("smart shooter连接断开")