import socket import struct import urllib.request import urllib.error import time class gimbal_ctrl: """ 云台控制器类,用于通过 TCP 和 HTTP 协议控制云台。 支持长连接模式,避免频繁新建连接导致设备 RST。 """ def __init__(self, host, port, timeout=5): """ 初始化控制器。 Args: host (str): 云台设备的 IP 地址。 port (int): 云台设备的 TCP 控制端口。 timeout (int, optional): TCP 连接和接收响应的超时时间(秒)。默认为 5。 """ self.host = host self.port = port self.base_url = f"http://{host}" # 基础 URL 用于 HTTP 请求 self.timeout = timeout self.client_socket = None # 长连接 socket def connect(self): """建立 TCP 长连接""" if self.client_socket is not None: return # 已连接,直接返回 try: self.client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.client_socket.settimeout(self.timeout) self.client_socket.connect((self.host, self.port)) print(f"Connected to {self.host}:{self.port}") except Exception as e: print(f"Failed to connect to {self.host}:{self.port}: {e}") self.client_socket = None def disconnect(self): """断开 TCP 连接""" if self.client_socket: try: self.client_socket.close() except: pass self.client_socket = None print("TCP connection closed.") def calculate_checksum(self, data_bytes): """ 计算校验和。 使用简单累加和(32位有符号),与原始代码一致。 如设备使用 CRC32,请替换为 zlib.crc32。 """ checksum = 0 for i in range(0, len(data_bytes), 4): chunk = data_bytes[i:i+4] if len(chunk) == 4: value = struct.unpack('