From 13c413e7a7b5d5870ce0c3489131b647d1b09646 Mon Sep 17 00:00:00 2001 From: FEIJINTI <83849113+FEIJINTI@users.noreply.github.com> Date: Mon, 19 Sep 2022 12:09:45 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=B9=E6=8E=89=E4=BA=86=E5=BE=88=E5=A4=9Abu?= =?UTF-8?q?g=EF=BC=88zhenye.li=E4=BF=AE=E6=94=B9=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- classifer.py | 7 ++++ socket_detector.py | 93 +++++++++++++++++++++++++++++++++------------- utils.py | 15 ++++---- 3 files changed, 83 insertions(+), 32 deletions(-) diff --git a/classifer.py b/classifer.py index 8349763..48cccb8 100644 --- a/classifer.py +++ b/classifer.py @@ -5,6 +5,7 @@ Created on Nov 3 21:18:26 2020 @author: l.z.y @e-mail: li.zhenye@qq.com """ +import logging import sys import numpy as np import cv2 @@ -220,6 +221,12 @@ class WoodClass(object): latest_model = model_files[int(np.argmax(file_times))] self.log.log("└--Using the latest model: "+str(latest_model)) path = os.path.join(ROOT_DIR, "models", str(latest_model)) + if not os.path.isabs(path): + logging.warning('给的是相对路径') + return -1 + if not os.path.exists(path): + logging.warning('文件不存在') + return -1 with open(path, "rb") as f: model_dic = pickle.load(f) self.n, self.k, self.p1, self.pur = model_dic["n"], model_dic["k"], model_dic["p1"], model_dic["pur"] diff --git a/socket_detector.py b/socket_detector.py index 792487e..bc61985 100644 --- a/socket_detector.py +++ b/socket_detector.py @@ -4,40 +4,83 @@ import cv2 from classifer import WoodClass import time import os + +from root_dir import ROOT_DIR from utils import PreSocket, receive_sock, parse_protocol, ack_sock, done_sock import logging -def process_cmd(recv_sock: PreSocket, send_sock: PreSocket): - model_path = "models/model_2022-09-06_13-08.p" - detector = WoodClass(w=4096, h=1200, n=3000, debug_mode=False) - detector.load(path=model_path) - while True: - pack, next_pack = receive_sock(recv_sock) - recv_sock.set_prepack(next_pack) - cmd, data = parse_protocol(pack) - ack_sock(send_sock, cmd_type=cmd) - if cmd == 'IM': - wood_color = detector.predict(data) - done_sock(send_sock, cmd_type=cmd, result=wood_color) - elif cmd == 'TR': - detector.fit_pictures(data_path=r"C:\Users\FEIJINTI\PycharmProjects\wood_color") - done_sock(send_sock, cmd_type=cmd) - elif cmd == 'MD': - model_path = os.path.join("models", data) - detector.load(path=model_path) - done_sock(send_sock, cmd_type=cmd) - print(model_path) - else: - logging.error(f'错误指令,指令为{cmd}') +def try_connect(is_repeat: bool = False, max_reconnect_times: int = 50) -> (bool, socket.socket): + """ + 尝试连接. + + :param is_repeat: 是否是重新连接 + :param max_reconnect_times:最大重连次数 + :return: (连接状态True为成功, Socket / None) + """ + reconnect_time = 0 + while reconnect_time < max_reconnect_times: + logging.warning(f'尝试{"重新" if is_repeat else ""}发起第{reconnect_time+1}次连接...') + try: + connected_sock = PreSocket(socket.AF_INET, socket.SOCK_STREAM) + connected_sock.connect(('127.0.0.1', 23456)) + except Exception as e: + reconnect_time += 1 + logging.error(f'第{reconnect_time}次连接失败\n {e}') + continue + logging.warning(f'{"重新" if is_repeat else ""}连接成功') + return True, connected_sock + return False, None + + +def process_cmd(cmd: str, data: any, connected_sock: PreSocket, detector: WoodClass) -> bool: + """ + 处理指令 + + :param cmd: 指令类型 + :param data: 指令内容 + :param connected_sock: socket + :param detector: 模型 + :return: 是否处理成功 + """ + + if cmd == 'IM': + wood_color = detector.predict(data) + response = done_sock(connected_sock, cmd_type=cmd, result=wood_color) + elif cmd == 'TR': + detector = WoodClass(w=4096, h=1200, n=3000, debug_mode=False) + detector.fit_pictures(data_path=data) + response = done_sock(connected_sock, cmd_type=cmd) + elif cmd == 'MD': + detector.load(path=data) + response = done_sock(connected_sock, cmd_type=cmd) + else: + logging.error(f'错误指令,指令为{cmd}') + response = False + return response def main(): - socket_receive = PreSocket(socket.AF_INET, socket.SOCK_STREAM) - socket_receive.connect(('127.0.0.1', 23456)) + status, connected_sock = False, None + while not status: + status, connected_sock = try_connect() # socket_send = PreSocket(socket.AF_INET, socket.SOCK_STREAM) # socket_send.connect(('127.0.0.1', 21123)) - process_cmd(recv_sock=socket_receive, send_sock=socket_receive) + # a = b'\xaa\x00\x00\x00\x05\x20\x44\x54\x52\xff\xff\xff\xbb' + # connected_sock.send(a) + model_path = os.path.join(ROOT_DIR, "models/model_2022-09-06_13-08.p") + detector = WoodClass(w=4096, h=1200, n=3000, debug_mode=False) + detector.load(path=model_path) + while True: + pack, next_pack = receive_sock(connected_sock) + if pack == b"": + status, connected_sock = try_connect() + continue + connected_sock.set_prepack(next_pack) + + cmd, data = parse_protocol(pack) + ack_sock(connected_sock, cmd_type=cmd) + process_cmd(cmd=cmd, data=data, connected_sock=connected_sock, detector=detector) if __name__ == '__main__': diff --git a/utils.py b/utils.py index b400e6e..ab2a946 100644 --- a/utils.py +++ b/utils.py @@ -70,8 +70,8 @@ class Logger(object): class PreSocket(socket.socket): - def __int__(self, *args, **kwargs): - super(socket.socket, self).__init__(*args, **kwargs) + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) self.pre_pack = b'' def receive(self, *args, **kwargs): @@ -84,7 +84,8 @@ class PreSocket(socket.socket): return required def set_prepack(self, pre_pack: bytes): - self.pre_pack = pre_pack + temp = self.pre_pack + self.pre_pack = temp + pre_pack def receive_sock(recv_sock: PreSocket, pre_pack: bytes = b'') -> (bytes, bytes): @@ -102,13 +103,13 @@ def receive_sock(recv_sock: PreSocket, pre_pack: bytes = b'') -> (bytes, bytes): temp = recv_sock.receive(1) except ConnectionError as e: logging.error(f'连接出错, 错误代码:\n{e}') - return '', None + return b'', b'' except TimeoutError as e: logging.error(f'超时了,错误代码: \n{e}') - return '', None + return b'', b'' except Exception as e: logging.error(f'遇见未知错误,错误代码: \n{e}') - return '', None + return b'', b'' if temp == b'\xaa': break @@ -118,7 +119,7 @@ def receive_sock(recv_sock: PreSocket, pre_pack: bytes = b'') -> (bytes, bytes): try: temp += recv_sock.receive(1) except Exception as e: - logging.error(f'接收报文长度失败, 错误代码: \n{e}') + logging.error(f'接收报文的长度不正确, 错误代码: \n{e}') return b'', b'' try: data_len = int.from_bytes(temp, byteorder='big')