|
@@ -4,17 +4,15 @@ import queue
|
|
|
import json
|
|
|
import traceback
|
|
|
from collections import deque
|
|
|
+from typing import Optional, List
|
|
|
|
|
|
from common.sys_comm import LOGDBG, LOGINFO, LOGWARN, LOGERR
|
|
|
-from common.sys_comm import get_utc_time_ms, utc_to_bj_s, get_bj_time_ms, get_bj_time_s
|
|
|
+from common.sys_comm import (
|
|
|
+ get_utc_time_ms, get_utc_time_s,
|
|
|
+ get_bj_time_ms, get_bj_time_s,
|
|
|
+ utc_to_bj_s)
|
|
|
from common.sys_comm import g_sys_conf, g_sys_conf_mtx
|
|
|
|
|
|
-g_dev_map_lock = threading.Lock()
|
|
|
-g_dev_map = {} # <dev_id: str, device: Device>
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
|
|
|
# 跟踪区域类
|
|
|
class TrackingRegion:
|
|
@@ -95,6 +93,8 @@ class Device():
|
|
|
self.network_ = network if network else Network()
|
|
|
self.install_param_ = install_param if install_param else InstallParam()
|
|
|
|
|
|
+ self.keepalive_: int = get_utc_time_s()
|
|
|
+
|
|
|
# 实时数据队列
|
|
|
self.rtd_len_: int = 100
|
|
|
self.rtd_que_: deque = deque(maxlen=self.rtd_len_)
|
|
@@ -119,7 +119,6 @@ class Device():
|
|
|
}
|
|
|
"""
|
|
|
|
|
|
-
|
|
|
# 插入新的rtd单元
|
|
|
def put_rtd_unit(self, rtd_unit: object):
|
|
|
"""
|
|
@@ -159,70 +158,77 @@ class Device():
|
|
|
return list(self.rtd_que_)
|
|
|
|
|
|
|
|
|
+ def update_keepalive(self):
|
|
|
+ with self.lock_:
|
|
|
+ self.keepalive_ = get_utc_time_s()
|
|
|
|
|
|
-def update_dev_info(dev_id:str, dev_instance:Device):
|
|
|
- with g_dev_map_lock:
|
|
|
- if dev_id in g_dev_map:
|
|
|
- g_dev_map[dev_id] = None
|
|
|
- # LOGDBG(f"update dev: {dev_id}")
|
|
|
- # else:
|
|
|
- # LOGDBG(f"new dev: {dev_id}")
|
|
|
-
|
|
|
- # todo 更新设备保活时间(伪)
|
|
|
- # dev_instance.set_keepalive(get_utc_time_ms())
|
|
|
- g_dev_map[dev_id] = dev_instance
|
|
|
-
|
|
|
-
|
|
|
-# 回调函数,处理查询结果:查询所有的设备信息
|
|
|
-def cb_handle_query_all_dev_info(result):
|
|
|
- try:
|
|
|
- if result:
|
|
|
- for row in result:
|
|
|
- dev_id = row["client_id"]
|
|
|
-
|
|
|
- dev_instance = Device(
|
|
|
- dev_id=row["client_id"],
|
|
|
- dev_name=row["dev_name"],
|
|
|
- online=row["online"],
|
|
|
- dev_type=row["dev_type"]
|
|
|
- )
|
|
|
-
|
|
|
- # 更新设备信息
|
|
|
- update_dev_info(dev_id, dev_instance)
|
|
|
-
|
|
|
- LOGDBG(f"cb_handle_query_all_dev_info succeed")
|
|
|
- else:
|
|
|
- LOGDBG("cb_handle_query_all_dev_info, invalid result")
|
|
|
-
|
|
|
- except json.JSONDecodeError as e:
|
|
|
- tb_info = traceback.extract_tb(e.__traceback__)
|
|
|
- for frame in tb_info:
|
|
|
- LOGERR(f"[{frame.filename}:{frame.lineno}] @{frame.name}(), error:{e}, {e.doc}")
|
|
|
- except Exception as e:
|
|
|
- tb_info = traceback.extract_tb(e.__traceback__)
|
|
|
- for frame in tb_info:
|
|
|
- LOGERR(f"[{frame.filename}:{frame.lineno}] @{frame.name}(), error: {e}")
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-def dev_map_push(dev_id: str, device: Device) -> None:
|
|
|
- with g_dev_map_lock:
|
|
|
- g_dev_map[dev_id] = device
|
|
|
-
|
|
|
-
|
|
|
-def dev_map_pop(dev_id: str) -> Device:
|
|
|
- with g_dev_map_lock:
|
|
|
- return g_dev_map.pop(dev_id, None)
|
|
|
-
|
|
|
-
|
|
|
-def dev_map_find(dev_id: str) -> Device:
|
|
|
- with g_dev_map_lock:
|
|
|
- return g_dev_map.get(dev_id, None)
|
|
|
-
|
|
|
+ def update_keepalive(self, now:int):
|
|
|
+ with self.lock_:
|
|
|
+ self.keepalive_ = now
|
|
|
|
|
|
-def dev_map_delete(dev_id: str) -> bool:
|
|
|
- with g_dev_map_lock:
|
|
|
- if dev_id in g_dev_map:
|
|
|
- del g_dev_map[dev_id]
|
|
|
- return True
|
|
|
- return False
|
|
|
+ def get_keepalive(self):
|
|
|
+ with self.lock_:
|
|
|
+ return self.keepalive_
|
|
|
+
|
|
|
+
|
|
|
+class DeviceManager():
|
|
|
+ def __init__(self):
|
|
|
+ self.g_dev_map_lock = threading.Lock()
|
|
|
+ self.g_dev_map = {} # <dev_id: str, device: Device>
|
|
|
+
|
|
|
+ def push_dev_map(self, dev_id:str, dev_instance:Device):
|
|
|
+ with self.g_dev_map_lock:
|
|
|
+ self.g_dev_map[dev_id] = dev_instance
|
|
|
+
|
|
|
+ def pop_dev_map(self, dev_id: str):
|
|
|
+ with self.g_dev_map_lock:
|
|
|
+ return self.g_dev_map.pop(dev_id, None)
|
|
|
+
|
|
|
+ def find_dev_map(self, dev_id: str):
|
|
|
+ with self.g_dev_map_lock:
|
|
|
+ return self.g_dev_map.get(dev_id, None)
|
|
|
+
|
|
|
+ def delete_dev_map(self, dev_id: str):
|
|
|
+ with self.g_dev_map_lock:
|
|
|
+ if dev_id in self.g_dev_map:
|
|
|
+ del self.g_dev_map[dev_id]
|
|
|
+ return True
|
|
|
+ return False
|
|
|
+
|
|
|
+ def list_all_dev(self,) -> List["Device"]:
|
|
|
+ with self.g_dev_map_lock:
|
|
|
+ return list(self.g_dev_map.values())
|
|
|
+
|
|
|
+ # 回调函数,处理查询结果:查询所有的设备信息
|
|
|
+ def cb_handle_query_all_dev_info(self, result, userdata):
|
|
|
+ try:
|
|
|
+ if result:
|
|
|
+ for row in result:
|
|
|
+ dev_id = row["client_id"]
|
|
|
+ dev_instance = Device(
|
|
|
+ dev_id=row["client_id"],
|
|
|
+ dev_name=row["dev_name"],
|
|
|
+ online=row["online"],
|
|
|
+ dev_type=row["dev_type"]
|
|
|
+ )
|
|
|
+ # 更新设备信息
|
|
|
+ self.push_dev_map(dev_id, dev_instance)
|
|
|
+
|
|
|
+ LOGDBG(f"cb_handle_query_all_dev_info succeed")
|
|
|
+ else:
|
|
|
+ LOGDBG("cb_handle_query_all_dev_info, invalid result")
|
|
|
+
|
|
|
+ except json.JSONDecodeError as e:
|
|
|
+ tb_info = traceback.extract_tb(e.__traceback__)
|
|
|
+ for frame in tb_info:
|
|
|
+ LOGERR(f"[{frame.filename}:{frame.lineno}] @{frame.name}(), error:{e}, {e.doc}")
|
|
|
+ except Exception as e:
|
|
|
+ tb_info = traceback.extract_tb(e.__traceback__)
|
|
|
+ for frame in tb_info:
|
|
|
+ LOGERR(f"[{frame.filename}:{frame.lineno}] @{frame.name}(), error: {e}")
|
|
|
+
|
|
|
+
|
|
|
+g_dev_mgr: DeviceManager = None
|
|
|
+def init_dev_mng():
|
|
|
+ global g_dev_mgr
|
|
|
+ g_dev_mgr = DeviceManager()
|