rambo před 9 měsíci
rodič
revize
b472ee8929

+ 48 - 1
python/api.py

@@ -5,10 +5,19 @@ from logger import logger
 from serial.tools import list_ports
 from utils.hlm_http_request import forward_request
 from sockets.socket_client import socket_manager
+from mcu.DeviceControl import DeviceControl
+import time
 
 @app.get("/")
 async def index():
-    await socket_manager.send_message(msg="测试")
+    # await socket_manager.send_message(msg="测试")
+    return {"message": "Hello World"}
+
+
+@app.get("/send_test")
+async def index():
+    data = {"data1":1,"data2":2,"data3":3,"data4":4}
+    await socket_manager.send_message(msg="测试",data=data)
     return {"message": "Hello World"}
 
 
@@ -20,6 +29,44 @@ async def scanSerials():
     return {"message": "Hello World"}
 
 
+@app.get("/test_conndevice")
+def test_conndevice():
+        device_control = DeviceControl()
+        p_list = []
+        temp_ports_dict = {}
+    # while 1:
+        time.sleep(1)
+        ports_dict = device_control.scan_serial_port()
+        temp_ports_dict = ports_dict
+
+        if not ports_dict:
+            # 全部清空 移除所有串口
+            if p_list:
+                _p = p_list.pop()
+                device_control.remove_port(_p)
+            # continue
+
+        if ports_dict:
+            # print(plist)
+            for index, _i in enumerate(p_list):
+                if _i not in ports_dict:
+                    _p = p_list.pop(index)
+                    device_control.remove_port(_p)
+
+            for _port_name, _port_value in ports_dict.items():
+                if _port_name not in p_list:
+                    try:
+                        p_list.append(_port_name)
+                        device_control.add_port_by_linkage(_port_name)
+                    except BaseException as e:
+                        print(e.__traceback__.tb_frame.f_globals["__file__"])   # 发生异常所在的文件
+                        print(e.__traceback__.tb_lineno)                        # 发生异常所在的行数
+                        print("串口不存在{} {}".format(_port_name, e))
+
+                # threading.Thread(target=self.add_port, args=(_port_name, _port_value)).start()
+                # self.add_port(_p)
+
+
 @app.api_route(
     "/forward_request", methods=["GET", "POST"], description="代理转发hlm项目得请求"
 )

+ 1 - 1
python/config.ini

@@ -4,7 +4,7 @@ app_name=智慧拍-后端应用
 # 应用版本号
 version=1.0.0
 # 应用host地址
-host=127.0.0.1
+host=10.56.42.176
 # 应用服务启动名称
 app_run=api:app
 # 端口号

+ 177 - 54
python/mcu/DeviceControl.py

@@ -1,8 +1,13 @@
+import asyncio
 import serial.tools.list_ports
 import time
+from .SerialIns import SerialIns
+from sockets import socket_manager
 # mcu命令
 class DeviceControl:
-
+    def __init__(self):
+        self.serial_ins = None
+        self.connected_ports_dict = {}  # 已连接的ports
     def scan_serial_port(self) -> dict:
         # 获取所有可用串口列表
         ports_dict = {}
@@ -23,18 +28,31 @@ class DeviceControl:
             return {}
         return ports_dict
 
-    def add_port(self, port_name, port_value=None):
-        # port_value :串口基础信息
-        # todo 根据prot_value 信息自动进行连接
-        print("add", port_name)
-        # 对没有连接的设备进行尝试连接
+    def remove_port(self, port_name):
+        '''移除串口'''
+        print("remove", port_name)
         self.sign_data.emit(
             {
-                "_type": "show_info",
+                "_type": "remove_port",
                 "plugins_mode": "auto_select_com",
-                "data": {"text": "开始识别接口:{}".format(port_name)},
+                "data": {"port_name": port_name},
             }
         )
+    def sendMsg(self,code=0,msg="",data=None):
+        asyncio.run(socket_manager.send_message(code=code, msg=msg, data=data))
+        # print(code,msg,data)
+    def add_port_by_linkage(self, port_name):
+        # port_value :串口基础信息
+        # todo 根据prot_value 信息自动进行连接
+        print("add", port_name)
+        # 对没有连接的设备进行尝试连接
+        message_data = {
+            "_type": "show_info",
+            "plugins_mode": "auto_select_com",
+            "data": {"text": "开始识别接口:{}".format(port_name)},
+        }
+
+        self.sendMsg(msg="开始识别接口:{}".format(port_name), data=message_data)
         time.sleep(1)
         """
         步骤:
@@ -42,14 +60,18 @@ class DeviceControl:
         """
         try:
             # 尝试使用115200波特率链接
-            serial_handle = serial.Serial(port=port_name, baudrate=115200, timeout=0.5)
+            serial_handle =  serial.Serial(
+                port=port_name, baudrate=115200, timeout=0.5
+            )
         except:
-            self.sign_data.emit(
-                {
-                    "_type": "show_info",
-                    "plugins_mode": "auto_select_com",
-                    "data": {"text": "串口:{} 被占用,或无法识别".format(port_name)},
-                }
+            message_data = {
+                "_type": "show_info",
+                "plugins_mode": "auto_select_com",
+                "data": {"text": "串口:{} 被占用,或无法识别".format(port_name)},
+            }
+            self.sendMsg(
+                msg="串口:{} 被占用,或无法识别".format(port_name).format(port_name),
+                data=message_data,
             )
             print("串口:{} 被占用".format(port_name))
             return
@@ -93,47 +115,28 @@ class DeviceControl:
 
         if device_id > 0:
             if device_id == 1:
-                self.windows.mcu.to_connect_com(port_name, is_test=False)
-                self.sign_data.emit(
-                    {
-                        "_type": "show_info",
-                        "plugins_mode": "auto_select_com",
-                        "data": {"text": "MCU开始连接"},
-                    }
-                )
-                self.connected_ports_dict[port_name] = "MCU"
-            if device_id == 2:
-                self.windows.remote_control.to_connect_com(port_name, is_test=False)
-                self.sign_data.emit(
-                    {
-                        "_type": "show_info",
-                        "plugins_mode": "auto_select_com",
-                        "data": {"text": "开始连接遥控器"},
-                    }
-                )
-                self.connected_ports_dict[port_name] = "有线遥控器"
-
-            # RemoteControlV2 新版遥控器 2024-12-02
-            if device_id == 4:
-                self.windows.remote_control_v2.to_connect_com(port_name, is_test=False)
-                self.sign_data.emit(
-                    {
-                        "_type": "show_info",
-                        "plugins_mode": "auto_select_com",
-                        "data": {"text": "开始连接遥控器V2"},
-                    }
-                )
-                self.connected_ports_dict[port_name] = "无线遥控器V2"
-
-            self.sign_data.emit(
-                {
-                    "_type": "select_port_name",
+                self.to_connect_com(port_name)
+                message_data = {
+                    "_type": "show_info",
                     "plugins_mode": "auto_select_com",
-                    "data": {
-                        "device_name": "mcu" if device_id == 1 else "remote_control",
-                        "port_name": port_name,
-                    },
+                    "data": {"text": "MCU开始连接"},
                 }
+                self.sendMsg(
+                    msg="MCU开始连接",
+                    data=message_data,
+                )
+                self.connected_ports_dict[port_name] = "MCU"
+            message_data = {
+                "_type": "select_port_name",
+                "plugins_mode": "auto_select_com",
+                "data": {
+                    "device_name": "mcu" if device_id == 1 else "remote_control",
+                    "port_name": port_name,
+                },
+            }
+            self.sendMsg(
+                msg="MCU连接成功",
+                data=message_data,
             )
         else:
             print("串口无法识别")
@@ -143,3 +146,123 @@ class DeviceControl:
         # 正常跳过;记录为其他列表
         # 不正常进行尝试连接
         # 连接不上,记录为其他列表
+
+    def read_cmd(self, serial_handle, check=None):
+        n = 0
+        while 1:
+            try:
+                read_d = serial_handle.read_all()  # 读取接收到的数据
+                self.receive_data += read_d
+            except BaseException as e:
+                print("171串口接收报错", e)
+                self.serial_handle = None
+                return False
+
+            if len(self.receive_data) < 4:
+                break
+
+            if self.receive_data[0] == 0x55 and self.receive_data[1] == 0x55:
+                # print("read ori ", self.change_hex_to_int(self.receive_data))
+                data_len = self.receive_data[2]
+                if len(self.receive_data) < data_len + 4:
+                    # 此处需要超时机制
+                    # print("数据长度不够,等待下次读取")
+                    # 超时退出
+                    # if not self.serial_handle.txdone():
+                    #     return None
+                    # n += 1
+                    # if n > out_time_n:
+                    #     return None
+                    # time.sleep(0.01)
+                    continue
+                _data = self.receive_data[3 : data_len + 4]
+                # 更新缓存区
+                self.receive_data = self.receive_data[data_len + 4 :]
+                # 校验数据
+                if 0xFF & ~sum(_data[:-1]) == _data[-1]:
+                    # print("receive_data:", self.change_hex_to_int(self.receive_data[:-1]))
+                    return _data[:-1]
+                else:
+                    return None
+            else:
+                # print("起始位不是 55 55 进行移除", self.receive_data[0])
+                # 起始位不是 55 55 进行移除
+                while self.receive_data:
+                    if len(self.receive_data) == 1:
+                        if self.receive_data[0] == 0x55:
+                            break
+                        else:
+                            self.receive_data = b""
+                    else:
+                        if (
+                            self.receive_data[0] == 0x55
+                            and self.receive_data[1] == 0x55
+                        ):
+                            break
+                        else:
+                            self.receive_data = self.receive_data[1:]
+
+    def to_connect_com(self, port_name):
+        self.close_connect()
+        time.sleep(0.5)
+        try:
+            self.serial_ins = SerialIns(port_name=port_name, baud=115200)
+            # self.serial_ins = SerialIns(port_name=port_name, baud=9600)
+            if self.serial_ins.serial_handle:
+                self.sendMsg(msg="条码识别 打开串口成功")
+                self.connect_state = True
+                self.start()
+                return True
+            else:
+                self.sendMsg(code=1, msg="条码识别 打开串口失败")
+                self.serial_ins = None
+                self.connect_state = False
+        except:
+            self.sendMsg(code=1, msg="条码识别 打开串口失败")
+            # print("条码识别 打开串口失败")
+            self.serial_ins = None
+            self.connect_state = False
+            return False
+
+    def close_connect(self):
+        self.port_name = ""
+        if self.serial_ins:
+            self.serial_ins.close_serial_port()
+            self.connect_state = False
+
+
+if __name__ == "__main__":
+    device_control = DeviceControl()
+    p_list = []
+    temp_ports_dict = {}
+    while 1:
+        time.sleep(1)
+        ports_dict = device_control.scan_serial_port()
+        temp_ports_dict = ports_dict
+
+        if not ports_dict:
+            # 全部清空 移除所有串口
+            if p_list:
+                _p = p_list.pop()
+                device_control.remove_port(_p)
+            continue
+
+        if ports_dict:
+            # print(plist)
+            for index, _i in enumerate(p_list):
+                if _i not in ports_dict:
+                    _p = p_list.pop(index)
+                    device_control.remove_port(_p)
+
+            for _port_name, _port_value in ports_dict.items():
+                if _port_name not in p_list:
+                    # try:
+                        p_list.append(_port_name)
+                        device_control.add_port_by_linkage(_port_name)
+                    # except BaseException as e:
+                    #     print(e.__traceback__.tb_frame.f_globals["__file__"])   # 发生异常所在的文件
+                    #     print(e.__traceback__.tb_lineno)                        # 发生异常所在的行数
+                    #     print("串口不存在{} {}".format(_port_name, e))
+
+                # threading.Thread(target=self.add_port, args=(_port_name, _port_value)).start()
+                # self.add_port(_p)

+ 8 - 10
python/mcu/SerialIns.py

@@ -17,7 +17,8 @@ class SerialIns(object):
                 port=self.port_name, baudrate=self.baud, timeout=timeout
             )
             print("{}打开成功".format(self.port_name))
-        except:
+        except Exception as e:
+            print(e)
             self.serial_handle = None
             print("{}打开失败".format(self.port_name))
 
@@ -269,7 +270,6 @@ class SerialIns(object):
         plist = list(serial.tools.list_ports.comports())
         if len(plist) <= 0:
             return None
-
         if port_name:
             for i in plist:
                 # print("port", i)
@@ -278,7 +278,10 @@ class SerialIns(object):
             return None
         else:
             for i in plist:
+                print("串口列表:", i.description)
+                print("串口列表:", i.name)
                 if "CH340" in i.description:
+                    print("CH340:", i.name)
                     self.port_name = i.name
                     print("----------", i)
             return plist
@@ -298,19 +301,14 @@ class SerialIns(object):
     def __del__(self):
         self.close_serial_port()
 
-
 if __name__ == "__main__":
-    s = SerialIns(port_name="COM11", baud=115200, timeout=0.1)
+    s = SerialIns(port_name="COM4", baud=115200, timeout=0.1)
     s.scan_serial_port()
     s.clearn_flush()
     print("-" * 30)
     for i in range(2):
-        data = [0x55, 0x55, 0x2, 0x5A, 0x1, 0xA4]
-        print("command data {}".format(s.change_hex_to_int(data)))
-        # s.write_cmd(data=data)
-        buf = bytearray(b"")
-        buf.extend(data)
-        s.serial_handle.write(buf)
+        data = [2,99,1]
+        s.write_cmd(data)
 
         time.sleep(0.1)
         data = s.read_cmd()

binární
python/requestments.txt


+ 1 - 0
python/sockets/__init__.py

@@ -0,0 +1 @@
+from .socket_client import socket_manager

+ 3 - 1
python/sockets/connect_manager.py

@@ -9,7 +9,7 @@ class ConnectionManager:
     def jsonMessage(self, code=0, msg="", data: object = None):
         """json字符串数据"""
         jsonData = {"code": code, "msg": msg, "data": data}
-        return json.dumps(jsonData)
+        return jsonData
 
     async def connect(self, websocket: WebSocket):
         '''连接事件'''
@@ -24,7 +24,9 @@ class ConnectionManager:
 
     async def send_personal_message(self, message: str, websocket: WebSocket):
         '''向用户发送消息'''
+        print("ready message successfully")
         await websocket.send_json(message)
+        print("sent message successfully")
 
     async def broadcast(self, message: str):
         """广播消息"""

+ 10 - 1
python/sockets/message_handler.py

@@ -1,14 +1,19 @@
 from .connect_manager import ConnectionManager
 from models import WebSocket
-
+import json
 
 # socket消息发送逻辑处理方法
 async def handlerSend(
     manager: ConnectionManager, receiveData: str, websocket: WebSocket
 ):
+    receiveData = json.loads(receiveData)
     # 处理消息发送逻辑
+    receiveData = json.loads(receiveData.get("text"))
     jsonType = receiveData.get("type")
+    code = receiveData.get("code")
+    msg = receiveData.get("msg")
     print("receiveData", receiveData)
+    print("jsonType", jsonType)
     match jsonType:
         case "ping":
             """发送心跳"""
@@ -17,3 +22,7 @@ async def handlerSend(
         case "pong":
             """发送心跳"""
             pass
+        case "forward_message":
+            data = receiveData.get("data")
+            dictMsg = {"code":code,"msg":msg,"data":data}
+            await manager.broadcast(dictMsg)

+ 4 - 1
python/sockets/socket_client.py

@@ -16,7 +16,10 @@ class SocketClient:
 
     async def send_message(self, code=0, msg="", data: object = None):
         if self.websocket:
-            json_data = json.dumps({"code": code, "msg": msg, "data": data})
+            # 本地客户端发送消息,在软件异步处理过程需要有客户端转发消息到应用客户端
+            json_data = json.dumps(
+                {"code": code, "type": "forward_message", "msg": msg, "data": data}
+            )
             await self.websocket.send(json_data)
             print("Message sent:", json_data)
         else:

+ 2 - 2
python/sockets/socket_server.py

@@ -17,8 +17,8 @@ async def websocket_endpoint(websocket: WebSocket):
         async def handler_messages():
             while True:
                 byteDats = await websocket.receive()
-                # print("byteDats", byteDats)
-                await handlerSend(manager, json.loads(byteDats), websocket)
+                print("byteDats", byteDats)
+                await handlerSend(manager, json.dumps(byteDats), websocket)
         await asyncio.gather(handler_messages())
     except WebSocketDisconnect:
         socket_manager.close()