+
    Dd>j*                         R t ^ RIt^ RIt^ RIHtHt ^ RIHtHtH	t	 ^ RI
Ht ^ RIHt ^ RIt^ RIt^ RIHt ]! 4       t ! R R4      t]! 4       tRR	 R
 lltR# )u   WebSocket 实时通信模块N)DictSet)	WebSocketWebSocketDisconnectDepends)Session)get_db)
get_configc                      a  ] tR t^t o RtR tV 3R lR ltV 3R lR ltV 3R lR ltV 3R	 lR
 lt	V 3R lR lt
V 3R lR ltV 3R lR ltV 3R lR ltV 3R lR ltRtV tR# )ConnectionManageru   WebSocket 连接管理器c                2    / V n         \        4       V n        R # )N)device_connectionssetadmin_connectionsselfs   &:/Users/wind/Downloads/Coruna-main/backend/api/websocket.py__init__ConnectionManager.__init__   s    8:14    c                &   < V ^8  d   QhRS[ RS[/# )   	websocketdevice_uuid)r   str)format__classdict__s   "r   __annotate__ConnectionManager.__annotate__   s     
 
i 
c 
r   c           
        "   VP                  4       G Rj  xL
  WP                  V&   V P                  RRRVR\        R4      P                  P                  4       P                  4       /4      G Rj  xL
  R#  Lb L5i)u   设备连接Ntypedevice_connectedr   	timestampdatetime)acceptr   broadcast_to_admins
__import__r#   utcnow	isoformat)r   r   r   s   &&&r   connect_device ConnectionManager.connect_device   s{        /8, &&&;J/88??AKKM(
  	 		 	!	s"   A=A9AA=2A;3A=;A=c                    < V ^8  d   QhRS[ /# r   r   r   )r   r   s   "r   r   r   %   s      Y r   c           
     ^  "   VP                  4       G Rj  xL
  V P                  P                  V4       \        V P                  P                  4       4      pVP                  RRRVR\        R4      P                  P                  4       P                  4       /4      G Rj  xL
  R#  L L5i)u   管理员连接Nr    admin_connectedonline_devicesr"   r#   )r$   r   addlistr   keys	send_jsonr&   r#   r'   r(   )r   r   r0   s   && r   connect_adminConnectionManager.connect_admin%   s        ""9- d55::<=!!%nJ/88??AKKM#
  	 	 	!
	s"   B-B)BB-"B+#B-+B-c                    < V ^8  d   QhRS[ /# )r   r   )r   )r   r   s   "r   r   r   2   s     5 5S 5r   c                D    WP                   9   d   V P                   V R# R# )u   设备断开连接Nr   r   r   s   &&r   disconnect_device#ConnectionManager.disconnect_device2   s!    111''4 2r   c                    < V ^8  d   QhRS[ /# r,   r-   )r   r   s   "r   r   r   7   s     5 5) 5r   c                `    WP                   9   d   V P                   P                  V4       R# R# )u   管理员断开连接N)r   remove)r   r   s   &&r   disconnect_admin"ConnectionManager.disconnect_admin7   s'    ..."")))4 /r   c                &   < V ^8  d   QhRS[ RS[/# )r   r   message)r   dict)r   r   s   "r   r   r   <   s       d r   c                  "   WP                   9   d0   V P                   V,          p VP                  V4      G Rj  xL
  R# R#  L  \         d.   p\        RT RT 24       T P	                  T4        Rp?R# Rp?ii ; i5i)u   发送消息到指定设备NTzError sending to device : F)r   r4   	Exceptionprintr;   )r   r   rC   r   es   &&&  r   send_to_device ConnectionManager.send_to_device<   s}     111//<I))'222
  3 0RsCD&&{3s>   $BA AA  BA A>"A93B9A>>Bc                    < V ^8  d   QhRS[ /# r   rC   rD   )r   r   s   "r   r   r   I   s     - - -r   c                $  "   \        4       pV P                   F  p VP                  V4      G Rj  xL
  K  	  V F  pV P                  V4       K  	  R#  L$  \         d+   p\	        RT 24       TP                  T4        Rp?Ko  Rp?ii ; i5i)u   广播消息到所有管理员NzError sending to admin: )r   r   r4   rG   rH   r1   r@   )r   rC   disconnectedr   rI   s   &&   r   r%   %ConnectionManager.broadcast_to_adminsI   s     u//I,))'222 0 &I!!), & 3 ,045  ++,s=   BAAA BAB#BBBBc                    < V ^8  d   QhRS[ /# rM   rN   )r   r   s   "r   r   r   W   s     0 0$ 0r   c                J  "   \        4       pV P                  P                  4        F  w  r4 VP                  V4      G Rj  xL
  K!  	  V F  pV P                  V4       K  	  R#  L$  \         d.   p\        RT RT 24       TP                  T4        Rp?Kt  Rp?ii ; i5i)u   广播消息到所有设备NzError broadcasting to device rF   )r   r   itemsr4   rG   rH   r1   r;   )r   rC   disconnected_devicesr   r   rI   s   &&    r   broadcast_to_devices&ConnectionManager.broadcast_to_devicesW   s     "u&*&=&=&C&C&E"K6))'222 'F 0K"";/ 0 3 65k]"QCHI$((556s@   *B#A(A&A( B#&A((B 3"BB#B  B#c                    < V ^8  d   QhRS[ /# )r   return)r2   )r   r   s   "r   r   r   e   s     4 4D 4r   c                H    \        V P                  P                  4       4      # )u   获取在线设备列表)r2   r   r3   r   s   &r   get_online_devices$ConnectionManager.get_online_devicese   s    D++00233r   c                &   < V ^8  d   QhRS[ RS[/# )r   r   rY   )r   bool)r   r   s   "r   r   r   i   s     6 6C 6D 6r   c                    WP                   9   # )u   检查设备是否在线r9   r:   s   &&r   is_device_online"ConnectionManager.is_device_onlinei   s    5555r   )r   r   N)__name__
__module____qualname____firstlineno____doc__r   r)   r5   r;   r@   rJ   r%   rV   r[   r`   __static_attributes____classdictcell__)r   s   @r   r   r      sg     #7
 
 5 5
5 5
 - -0 04 46 6r   r   c                <    V ^8  d   QhR\         R\        R\        /# )r   r   r   admin)r   r   r^   )r   s   "r   r   r   r   s'     l3 l3	 l3 l3SW l3r   c                  "    V'       Ed,   \         P                  V 4      G Rj  xL
   V P                  4       G Rj  xL
 pVP                  R4      pVR8X  d   V P	                  RR/4      G Rj  xL
  KN  VR8X  db   VP                  R4      pVP                  R/ 4      p\         P                  WV4      G Rj  xL
 pV P	                  RR	R
VRV/4      G Rj  xL
  K  VR8X  g   K  VP                  R/ 4      p\         P                  V4      G Rj  xL
  V P	                  RRR
R/4      G Rj  xL
  EK  V'       g   V P                  RRR7      G Rj  xL
  R# \         P                  W4      G Rj  xL
   V P                  4       G Rj  xL
 pVP                  R4      pVR8X  d   V P	                  RR/4      G Rj  xL
  KN  VR8X  d   \        P                  ! VVP                  RR4      VP                  RR4      VP                  R4      VP                  R4      VP                  R4      VP                  RR4      R7      p\        \        4       4      p	 \        P                  ! W4       V	P                  4        \         P                  RRRVRVP!                  4       /4      G Rj  xL
  EK=  VR8X  d   VP                  R4      p
VP                  RR4      pVP                  R4      pVP                  R4      p\        \        4       4      p	 \        P"                  ! WVVVR 7       V	P                  4        \         P                  RRRVRV
RVRVRV/4      G Rj  xL
  EK  VR!8X  d   \        P$                  ! VVP                  RR"4      VP                  R#4      VP                  R$4      VP                  R%4      R&7      p\        \        4       4      p	 \        P&                  ! W4       V	P                  4        V P	                  RR'/4      G Rj  xL
  EK  VR(8X  g   EK  \        P(                  ! VVP                  R)4      VP                  R*4      VP                  R+4      VP                  R,4      R-7      p\        \        4       4      p	 \        P*                  ! W4       V	P                  4        \         P                  RR.RVR(VP!                  4       /4      G Rj  xL
  EKy   EL EL EL ELB EL& EL EL EL EL EL ELP  T	P                  4        i ; i ELz  T	P                  4        i ; i EL  T	P                  4        i ; i EL=  T	P                  4        i ; i L  \,         d    T'       d   \         P/                  T 4        R# \         P1                  T4       \         P                  RR/RTR0\3        R14      P4                  P7                  4       P9                  4       /4      G Rj  xL 
   R# \:         dR   p\=        R2T 24       T'       d   \         P/                  T 4        Rp?R# \         P1                  T4        Rp?R# Rp?ii ; i5i)3u1   
WebSocket 端点
支持设备和管理员连接
NTr    pingpongrJ   r   rC   send_resultsuccessrV   broadcast_resulti  zDevice UUID required)codereasonlogstageunknownstatusinfo
elapsed_msmetadata	log_levelINFO)r   rt   rv   rC   rx   ry   rz   
device_logtask_resulttask_id	completedresulterror_message)r   r   	heartbeatonlinebattery_levelexploit_stageextra)r   rv   r   r   r   heartbeat_acklocationlatitude	longitudealtitudeaccuracy)r   r   r   r   r   device_locationdevice_disconnectedr"   r#   zWebSocket error: )managerr5   receive_jsongetr4   rJ   rV   closer)   schemasDeviceLogCreatenextr   crudcreate_device_logr%   rD   update_task_statusDeviceHeartbeatupdate_device_heartbeatDeviceLocationUpdateupdate_device_locationr   r@   r;   r&   r#   r'   r(   rG   rH   )r   r   rj   datamessage_typetarget_devicerC   ro   log_datadbr~   result_statusresult_datar   heartbeat_datalocation_datarI   s   &&&              r   websocket_endpointr   r   s    
g35''	222&3355#xx/6)#--vv.>???!%55$(HH]$;M"hhy"5G$+$:$:=$RRG#--!7%}/    "%;;"hhy"5G!66w???#-- 2!4/    oo48NoOOO((@@@&3355#xx/6)#--vv.>???!U*&66$/"hhw	:#xx&9 $ 3#'88L#9!%*!5"&((;"? H fhB#..r<
 "55%{x}}7    "]2"hhy1G$(HHX{$CM"&((8"4K$(HH_$=M fhB#//#.*7 
 "55%{!7 - +'7    "[0%,%<%<$/#xx(;&*hh&?&*hh&?"hhw/&N fhB#44RH
 $--v.GHHH!Z/$+$@$@$/!%*!5"&((;"7!%*!5!%*!5%M fhB#33BF
 "55 1%{"M$6$6$87   Y 3 6
 @ S @ P A 6
 @& 
, 
0 
 I" 
  $$Y/%%k2 ---{Z
3<<CCEOOQ/     3!!%&$$Y//%%k223s  Y'!U3 S3U3 S62U3 1S92AU3 :S<;U3 S?
U3 )*U3 TU3 0T1U3  U3 TU3 Y'U3 5T6U3 T2U3 TBU3 T 3<U3 /T)0A&U3 T, 14U3 %U&A9U3  U 6&U3 UU3 .A*U3 U /<U3 +U1,U3 6U3 9U3 <U3 ?U3 U3 U3 U3 U3 U3 U3 T&&U3 ,T>>U3 UU3 U..U3 3Y$Y$Y'A"Y$ XY$Y'	Y$Y$+Y>Y'YY'Y$$Y')NF)rf   jsonasynciotypingr   r   fastapir   r   r   sqlalchemy.ormr   databaser   r   r   configr	   r   r   r    r   r   <module>r      sM    "    ; ; "   	[6 [6~ 
l3 l3r   