import struct from dataclasses import dataclass from typing import Optional from config import * @dataclass class PacketHeader: head: int = PKT_HEAD len: int = 0 dev_type_m: int = 0 dev_type_s: int = 0 dev_id: int = 0 cmd_type: int = 0 cmd: int = 0 pkt_id: int = 0 reserve: bytes = bytes(18) HEAD_FORMAT = '> 8) & 0xFF}.{(ip_int >> 16) & 0xFF}.{(ip_int >> 24) & 0xFF}" def ip_to_int(ip_str): parts = ip_str.split('.') return int(parts[0]) | (int(parts[1]) << 8) | (int(parts[2]) << 16) | (int(parts[3]) << 24) def bytes_to_mac(mac_bytes): return ':'.join(f'{b:02x}' for b in mac_bytes) class Protocol: TAIL_SIZE = 2 @staticmethod def build_packet(cmd, data=b''): header = PacketHeader() header.cmd = cmd header.len = len(data) packet = header.to_bytes() + data return packet + struct.pack('