|
@@ -1,381 +0,0 @@
|
|
-# from hub import methods, Global
|
|
|
|
-
|
|
|
|
-import threading
|
|
|
|
-import socket
|
|
|
|
-import struct
|
|
|
|
-import time
|
|
|
|
-# import cv2
|
|
|
|
-# import base64
|
|
|
|
-# import asyncio
|
|
|
|
-
|
|
|
|
-import sys
|
|
|
|
-import importlib
|
|
|
|
-
|
|
|
|
-sys.path.append('/home/server/repositories/repositories/sri-project.demo-py/sri-server-bg03')
|
|
|
|
-protobuf = importlib.import_module(f"protobuf.protocol_pb2")
|
|
|
|
-sys.path.append('/home/server/repositories/repositories/sri-project.demo-py/3rdparty')
|
|
|
|
-methods = importlib.import_module(f"xlib")
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-class Connection(object):
|
|
|
|
- """"""
|
|
|
|
-
|
|
|
|
- tcp_server = None
|
|
|
|
- tcp_client = None
|
|
|
|
- all_connection_dict = {} # {<ipv4>: (socket, update_at, type)} | {<连接id>: (socket对象, 最后一次请求时间, 客户端类型)}
|
|
|
|
-
|
|
|
|
- @classmethod
|
|
|
|
- def get_method_by_command_id(cls, command_id):
|
|
|
|
- """获取方法名"""
|
|
|
|
- fn_dict = {
|
|
|
|
- protobuf.CS_Sign: cls.f1, # 建立webrtc邀请
|
|
|
|
- }
|
|
|
|
- return fn_dict.get(command_id)
|
|
|
|
-
|
|
|
|
- @classmethod
|
|
|
|
- def f1(cls):
|
|
|
|
- pass
|
|
|
|
-
|
|
|
|
- # @classmethod
|
|
|
|
- # def run_forever(cls):
|
|
|
|
- # """
|
|
|
|
- # 调用协程方法
|
|
|
|
- # """
|
|
|
|
- # tasks = [cls.check_send()]
|
|
|
|
- # _loop = asyncio.new_event_loop()
|
|
|
|
- # asyncio.set_event_loop(_loop)
|
|
|
|
- # loop = asyncio.get_event_loop()
|
|
|
|
- # loop.run_until_complete(asyncio.wait(tasks))
|
|
|
|
-
|
|
|
|
- # @classmethod
|
|
|
|
- # async def check_send(cls):
|
|
|
|
- #
|
|
|
|
- # # --- define ---
|
|
|
|
- # last_send_id = str()
|
|
|
|
- #
|
|
|
|
- # while True:
|
|
|
|
- #
|
|
|
|
- # try:
|
|
|
|
- # # --- fill face_type_name_dict ---
|
|
|
|
- # """
|
|
|
|
- # face_type_name_dict = {<type_uuid>: <name>}
|
|
|
|
- # """
|
|
|
|
- # face_type_name_dict = dict()
|
|
|
|
- # for item in Global.mdb.get_all('FaceType'):
|
|
|
|
- # uuid = str(item.get('_id'))
|
|
|
|
- # face_type_name_dict[uuid] = item.get('name')
|
|
|
|
- #
|
|
|
|
- # # --- debug ---
|
|
|
|
- # # methods.debug_log(f"LineManage", f"m-21: run at {methods.now_string()} "
|
|
|
|
- # # f"| {len(cls.line_dict.values())}")
|
|
|
|
- # # await asyncio.sleep(3)
|
|
|
|
- # # await asyncio.sleep(0.5)
|
|
|
|
- #
|
|
|
|
- # # --- get send_data ---
|
|
|
|
- # """
|
|
|
|
- # send_data = {
|
|
|
|
- # send_id: 数据id
|
|
|
|
- # send_list: 数据列表
|
|
|
|
- # }
|
|
|
|
- # """
|
|
|
|
- # send_data = Global.rdb.get_one(key='send_data')
|
|
|
|
- # # send_data = db0.get_one(key='send_data')
|
|
|
|
- #
|
|
|
|
- # # --- check ---
|
|
|
|
- # if not send_data:
|
|
|
|
- # continue
|
|
|
|
- #
|
|
|
|
- # # --- check ---
|
|
|
|
- # send_id = send_data.get('send_id')
|
|
|
|
- # if not send_id:
|
|
|
|
- # continue
|
|
|
|
- #
|
|
|
|
- # # --- check ---
|
|
|
|
- # if send_id == last_send_id:
|
|
|
|
- # continue
|
|
|
|
- #
|
|
|
|
- # # --- check ---
|
|
|
|
- # send_list = send_data.get('send_list')
|
|
|
|
- # if send_list is None or len(send_list) == 0:
|
|
|
|
- # continue
|
|
|
|
- #
|
|
|
|
- # # --- debug ---
|
|
|
|
- # # await asyncio.sleep(3)
|
|
|
|
- # # await asyncio.sleep(0.5)
|
|
|
|
- # methods.debug_log(f"LineManage", f"m-74: run at {methods.now_string()} "
|
|
|
|
- # f"| send count is {len(send_list)} "
|
|
|
|
- # f"| online count is {len(cls.line_dict.values())}")
|
|
|
|
- #
|
|
|
|
- # # --- update ---
|
|
|
|
- # last_send_id = send_id
|
|
|
|
- #
|
|
|
|
- # # --- send ---
|
|
|
|
- # for line_id in list(cls.line_dict.keys()):
|
|
|
|
- #
|
|
|
|
- # try:
|
|
|
|
- #
|
|
|
|
- # # --- check ---
|
|
|
|
- # if not cls.check_line_is_live(line_id):
|
|
|
|
- # methods.debug_log(f"LineManage", f"m-56: websocket link broken.")
|
|
|
|
- # cls.line_dict.pop(line_id)
|
|
|
|
- # continue
|
|
|
|
- #
|
|
|
|
- # # --- send ---
|
|
|
|
- # """
|
|
|
|
- # send_list = [
|
|
|
|
- # {
|
|
|
|
- # base_face_uuid: 底库人脸id
|
|
|
|
- # snap_face_image: 抓拍人脸
|
|
|
|
- # base_face_image_path: 底库人脸路径
|
|
|
|
- # face_similarity: 相似度
|
|
|
|
- # }
|
|
|
|
- # ]
|
|
|
|
- # """
|
|
|
|
- # for data in send_list:
|
|
|
|
- #
|
|
|
|
- # # --- check ---
|
|
|
|
- # if data.get('snap_face_image') is None:
|
|
|
|
- # continue
|
|
|
|
- #
|
|
|
|
- # # --- define ---
|
|
|
|
- # """
|
|
|
|
- # send_dict = {
|
|
|
|
- # input_face_b64: 抓拍人脸图像
|
|
|
|
- # face_uuid: 人脸id
|
|
|
|
- # face_name: 人脸名称
|
|
|
|
- # known_face_b64: 底库人脸图像
|
|
|
|
- # face_similarity: 相似度
|
|
|
|
- # face_type_name_list: 人员类型
|
|
|
|
- # }
|
|
|
|
- # """
|
|
|
|
- # send_dict = dict(
|
|
|
|
- # input_face_b64=cls.image_to_b64(data.get('snap_face_image')),
|
|
|
|
- # # input_face_b64=str(),
|
|
|
|
- # known_face_b64=str(),
|
|
|
|
- # face_uuid=str(),
|
|
|
|
- # face_name=str(),
|
|
|
|
- # face_similarity=data.get('face_similarity'),
|
|
|
|
- # face_type_name_list=list(),
|
|
|
|
- # )
|
|
|
|
- #
|
|
|
|
- # # --- fill known_face_b64 ---
|
|
|
|
- # base_face_image_path = data.get('base_face_image_path')
|
|
|
|
- # if base_face_image_path and methods.is_file(base_face_image_path):
|
|
|
|
- # frame = cv2.imread(base_face_image_path)
|
|
|
|
- # if frame is not None:
|
|
|
|
- # _, image = cv2.imencode('.jpg', frame)
|
|
|
|
- # base64_data = base64.b64encode(image) # byte to b64 byte
|
|
|
|
- # s = base64_data.decode() # byte to str
|
|
|
|
- # send_dict['known_face_b64'] = f'data:image/jpeg;base64,{s}'
|
|
|
|
- #
|
|
|
|
- # # --- fill face_uuid and face_name ---
|
|
|
|
- # """
|
|
|
|
- # Face: 陌生人脸表
|
|
|
|
- # Face.face_name: 人脸名称
|
|
|
|
- # """
|
|
|
|
- # face_uuid = data.get('base_face_uuid')
|
|
|
|
- # if face_uuid:
|
|
|
|
- # send_dict['face_uuid'] = face_uuid
|
|
|
|
- # face = Global.mdb.get_one_by_id('Face', face_uuid)
|
|
|
|
- # if face and face.get('face_name'):
|
|
|
|
- # send_dict['face_name'] = face.get('face_name')
|
|
|
|
- #
|
|
|
|
- # # --- fill face_type_name_list ---
|
|
|
|
- # face_type_uuid_list = face.get('face_type_uuid_list')
|
|
|
|
- # if face_type_uuid_list:
|
|
|
|
- # send_dict['face_type_name_list'] = [face_type_name_dict.get(i)
|
|
|
|
- # for i in face_type_uuid_list
|
|
|
|
- # if face_type_name_dict.get(i)]
|
|
|
|
- #
|
|
|
|
- # # --- send ---
|
|
|
|
- # # methods.debug_log(f"LineManage", f"m-153: send_dict is {send_dict}")
|
|
|
|
- # line = cls.line_dict.get(line_id)
|
|
|
|
- # send_json = methods.json_dumps(send_dict)
|
|
|
|
- # await line.send_text(send_json)
|
|
|
|
- # # await asyncio.sleep(0.1)
|
|
|
|
- #
|
|
|
|
- # except Exception as exception:
|
|
|
|
- #
|
|
|
|
- # # --- check ---
|
|
|
|
- # if not cls.check_line_is_live(line_id):
|
|
|
|
- # cls.line_dict.pop(line_id)
|
|
|
|
- #
|
|
|
|
- # if exception.__class__.__name__ == 'RuntimeError':
|
|
|
|
- # methods.debug_log(f"LineManage", f"m-170: {cls.get_line_state()}")
|
|
|
|
- # else:
|
|
|
|
- # methods.debug_log('LineManage', f"m-172: exception | {exception}")
|
|
|
|
- # methods.debug_log('LineManage', f"m-172: traceback | {methods.trace_log()}")
|
|
|
|
- #
|
|
|
|
- # except Exception as exception:
|
|
|
|
- #
|
|
|
|
- # methods.debug_log('LineManage', f"m-179: exception | {exception}")
|
|
|
|
- # methods.debug_log('LineManage', f"m-179: traceback | {methods.trace_log()}")
|
|
|
|
- # methods.debug_log('LineManage', f"m-179: wait 1 minutes try again!")
|
|
|
|
- # await asyncio.sleep(60)
|
|
|
|
-
|
|
|
|
- # @classmethod
|
|
|
|
- # def get_line_total(cls):
|
|
|
|
- # count = 0
|
|
|
|
- # for k, v in cls.line_dict.items():
|
|
|
|
- # count += 1
|
|
|
|
- # return count
|
|
|
|
-
|
|
|
|
- # @classmethod
|
|
|
|
- # def check_line_is_live(cls, line_id):
|
|
|
|
- # d1 = {
|
|
|
|
- # 0: 'CONNECTING',
|
|
|
|
- # 1: 'CONNECTED',
|
|
|
|
- # 2: 'DISCONNECTED',
|
|
|
|
- # }
|
|
|
|
- # line = cls.line_dict.get(line_id)
|
|
|
|
- # if line and d1.get(line.client_state.value) != 'DISCONNECTED':
|
|
|
|
- # return True
|
|
|
|
- # else:
|
|
|
|
- # return False
|
|
|
|
-
|
|
|
|
- # @classmethod
|
|
|
|
- # def get_line_state(cls):
|
|
|
|
- # d1 = {
|
|
|
|
- # 0: 'CONNECTING',
|
|
|
|
- # 1: 'CONNECTED',
|
|
|
|
- # 2: 'DISCONNECTED',
|
|
|
|
- # }
|
|
|
|
- # d2 = dict() # {<line_id>: <state>}
|
|
|
|
- # for line_id, line in cls.line_dict.items():
|
|
|
|
- # state = d1.get(line.client_state.value)
|
|
|
|
- # _id = line_id[-6:]
|
|
|
|
- # d2[_id] = state
|
|
|
|
- # return d2
|
|
|
|
-
|
|
|
|
- # @staticmethod
|
|
|
|
- # def image_to_b64(image):
|
|
|
|
- # frame = numpy_method.to_array(image) # list to numpy array
|
|
|
|
- # _, image = cv2.imencode('.jpg', frame)
|
|
|
|
- # base64_data = base64.b64encode(image)
|
|
|
|
- # s = base64_data.decode()
|
|
|
|
- # return f'data:image/jpeg;base64,{s}'
|
|
|
|
-
|
|
|
|
- @classmethod
|
|
|
|
- def create_tcp_server(cls, host='0.0.0.0', port=20916):
|
|
|
|
- cls.tcp_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
|
|
|
- cls.tcp_server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
|
|
|
|
- cls.tcp_server.bind((host, port))
|
|
|
|
- cls.tcp_server.listen(10) # 设置可处理的未处理连接请求的最大数量
|
|
|
|
- methods.debug_log('Connection.260', f"Server listening on {host}:{port}")
|
|
|
|
-
|
|
|
|
- @classmethod
|
|
|
|
- def start_listener(cls):
|
|
|
|
-
|
|
|
|
- cls.create_tcp_server()
|
|
|
|
- head_sequence = '<hh' # 字节序规则
|
|
|
|
- head_size = struct.calcsize(head_sequence)
|
|
|
|
-
|
|
|
|
- while True:
|
|
|
|
-
|
|
|
|
- try:
|
|
|
|
- # --- 等待连接 ---
|
|
|
|
- client, ipv4 = cls.tcp_server.accept()
|
|
|
|
- # cls.clients[ipv4] = client, 时间戳, 客户端类型
|
|
|
|
- methods.debug_log('Connection.260', f"Connected by {ipv4}")
|
|
|
|
-
|
|
|
|
- # --- 解析数据头
|
|
|
|
- head_bytestream = client.recv(head_size)
|
|
|
|
- if not head_bytestream:
|
|
|
|
- continue
|
|
|
|
- command_id, body_length = struct.unpack(head_sequence, head_bytestream)
|
|
|
|
- methods.debug_log('Connection.284', f"Received values: {command_id, body_length}")
|
|
|
|
-
|
|
|
|
- # --- debug ---
|
|
|
|
- # command_id, body_length = struct.unpack('<hh', head_bytestream)
|
|
|
|
- # methods.debug_log('Connection.1', f"Received values: {command_id, body_length}")
|
|
|
|
- # command_id, body_length = struct.unpack('<HH', head_bytestream)
|
|
|
|
- # methods.debug_log('Connection.2', f"Received values: {command_id, body_length}")
|
|
|
|
- # command_id, body_length = struct.unpack('>hh', head_bytestream)
|
|
|
|
- # methods.debug_log('Connection.5', f"Received values: {command_id, body_length}")
|
|
|
|
- # command_id, body_length = struct.unpack('>HH', head_bytestream)
|
|
|
|
- # methods.debug_log('Connection.6', f"Received values: {command_id, body_length}")
|
|
|
|
- # command_id, body_length = struct.unpack('@hh', head_bytestream)
|
|
|
|
- # methods.debug_log('Connection.9', f"Received values: {command_id, body_length}")
|
|
|
|
- # command_id, body_length = struct.unpack('@HH', head_bytestream)
|
|
|
|
- # methods.debug_log('Connection.10', f"Received values: {command_id, body_length}")
|
|
|
|
- # command_id, body_length = struct.unpack('=hh', head_bytestream)
|
|
|
|
- # methods.debug_log('Connection.13', f"Received values: {command_id, body_length}")
|
|
|
|
- # command_id, body_length = struct.unpack('=HH', head_bytestream)
|
|
|
|
- # methods.debug_log('Connection.14', f"Received values: {command_id, body_length}")
|
|
|
|
-
|
|
|
|
- # command_id, body_length = struct.unpack('<ii', head_bytestream)
|
|
|
|
- # methods.debug_log('Connection.3', f"Received values: {command_id, body_length}")
|
|
|
|
- # command_id, body_length = struct.unpack('<II', head_bytestream)
|
|
|
|
- # methods.debug_log('Connection.4', f"Received values: {command_id, body_length}")
|
|
|
|
- # command_id, body_length = struct.unpack('>ii', head_bytestream)
|
|
|
|
- # methods.debug_log('Connection.7', f"Received values: {command_id, body_length}")
|
|
|
|
- # command_id, body_length = struct.unpack('>II', head_bytestream)
|
|
|
|
- # methods.debug_log('Connection.8', f"Received values: {command_id, body_length}")
|
|
|
|
- # command_id, body_length = struct.unpack('@ii', head_bytestream)
|
|
|
|
- # methods.debug_log('Connection.11', f"Received values: {command_id, body_length}")
|
|
|
|
- # command_id, body_length = struct.unpack('@II', head_bytestream)
|
|
|
|
- # methods.debug_log('Connection.12', f"Received values: {command_id, body_length}")
|
|
|
|
- # command_id, body_length = struct.unpack('=ii', head_bytestream)
|
|
|
|
- # methods.debug_log('Connection.15', f"Received values: {command_id, body_length}")
|
|
|
|
- # command_id, body_length = struct.unpack('=II', head_bytestream)
|
|
|
|
- # methods.debug_log('Connection.16', f"Received values: {command_id, body_length}")
|
|
|
|
-
|
|
|
|
- # --- 解析数据体
|
|
|
|
- if command_id == protobuf.CS_KeepAlive:
|
|
|
|
- continue
|
|
|
|
- elif command_id == protobuf.CS_Sign:
|
|
|
|
- # --- 接收请求数据
|
|
|
|
- body_bytestream = client.recv(body_length)
|
|
|
|
- object = protobuf.CSSign()
|
|
|
|
- object.ParseFromString(body_bytestream)
|
|
|
|
- print(f"Received Response: account={object.account}, password={object.password}")
|
|
|
|
-
|
|
|
|
- # --- 发送返回数据
|
|
|
|
- object = protobuf.SCSign()
|
|
|
|
- object.ret = True
|
|
|
|
- object.uid = 112233
|
|
|
|
- object.cid = 223344
|
|
|
|
- object.name = 'aabbcc'
|
|
|
|
- command_id = protobuf.SC_Sign
|
|
|
|
- body_length = object.ByteSize()
|
|
|
|
- head_bytestream = struct.pack(head_sequence, command_id, body_length)
|
|
|
|
- body_bytestream = object.SerializeToString()
|
|
|
|
- send_bytestream = head_bytestream + body_bytestream
|
|
|
|
- client.sendall(send_bytestream)
|
|
|
|
- print(f"Sent data: {send_bytestream}")
|
|
|
|
-
|
|
|
|
- # --- test ---
|
|
|
|
- # for _ in range(10):
|
|
|
|
- # for i in range(3)[::-1]:
|
|
|
|
- # methods.debug_log('SRIConnection.58', f"sleep {i}s! | [{ipv4}]")
|
|
|
|
- # time.sleep(1)
|
|
|
|
- # methods.debug_log('SRIConnection.58', f"send re_send_data | [{ipv4}]")
|
|
|
|
- # client.sendall(send_bytestream)
|
|
|
|
-
|
|
|
|
-
|
|
|
|
- except Exception as exception:
|
|
|
|
-
|
|
|
|
- methods.debug_log('Connection.287', f"#exception: {exception}")
|
|
|
|
- methods.debug_log('Connection.287', f"#traceback: {methods.trace_log()}")
|
|
|
|
-
|
|
|
|
- finally:
|
|
|
|
- client.close()
|
|
|
|
-
|
|
|
|
- @classmethod
|
|
|
|
- def run(cls, background_is=True):
|
|
|
|
- thread_list = [
|
|
|
|
- threading.Thread(target=cls.start_listener), # 人脸检测 deepstream facenet
|
|
|
|
- ]
|
|
|
|
- for thread in thread_list:
|
|
|
|
- thread.setDaemon(True)
|
|
|
|
- thread.start()
|
|
|
|
- if background_is:
|
|
|
|
- return
|
|
|
|
- for thread in thread_list:
|
|
|
|
- thread.join()
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-if __name__ == '__main__':
|
|
|
|
- print(protobuf.CS_Offer)
|
|
|
|
-
|
|
|
|
- Connection.run(background_is=False)
|
|
|