import socket
from threading import Thread


class LightModuleSimulator:
    def __init__(self):
        # 初始化16路灯状态(0-7对应1-8路,8-15对应9-16路)
        self.light_status = [0] * 16

    def add8_checksum(self, data_bytes):
        """计算ADD8校验和(所有字节累加取低8位)"""
        return sum(data_bytes) & 0xFF

    def process_command(self, command_bytes):
        """处理接收到的命令(带ADD8校验)"""
        # 校验命令长度(7字节数据 + 1字节校验和)
        if len(command_bytes) != 8:
            return self._build_error_response("Invalid length")

        # 分离数据和校验和
        data_part = command_bytes[:-1]
        received_checksum = command_bytes[-1]

        # 验证校验和
        if self.add8_checksum(data_part) != received_checksum:
            return self._build_error_response("Checksum error")

        # 解析命令类型
        cmd_type = data_part[1]
        if cmd_type == 0x10:  # 状态查询
            return self._build_status_response()
        elif cmd_type == 0x30:  # 开灯控制
            return self._process_control(data_part, 1)
        elif cmd_type == 0x40:  # 关灯控制
            return self._process_control(data_part, 0)
        else:
            return self._build_error_response("Unknown command")

    def _process_control(self, data_part, target_state):
        """处理控制命令"""
        xh = data_part[2]  # 1-8路控制位
        xl = data_part[3]  # 9-16路控制位

        # 更新灯状态(1表示改变,0表示不变)
        for i in range(8):  # 处理1-8路
            if (xh >> (7 - i)) & 1:
                self.light_status[i] = target_state
        for i in range(8, 16):  # 处理9-16路
            if (xl >> (15 - i)) & 1:
                self.light_status[i] = target_state

        return self._build_status_response()

    def _build_status_response(self):
        """构建状态响应包(01 11 XH XL 00 00 + ADD8)"""
        # 计算XH(1-8路状态)
        xh = sum(bit << (7 - i) for i, bit in enumerate(self.light_status[:8]))
        # 计算XL(9-16路状态)
        xl = sum(bit << (15 - i) for i, bit in enumerate(self.light_status[8:16]))

        response_data = bytes([0x01, 0x11, xh, xl, 0x00, 0x00,0x00])
        return response_data + bytes([self.add8_checksum(response_data)])

    def _build_error_response(self, error_msg):
        """构建错误响应(可选实现)"""
        print(f"Error: {error_msg}")
        return b"\x01\xFF" + error_msg.encode()[:5] + bytes([self.add8_checksum(b"\x01\xFF")])


def handle_client(conn, addr, simulator):
    print(f"Client connected: {addr}")
    try:
        while True:
            data = conn.recv(1024)
            if not data:
                break

            print(f"Received: {data.hex(' ').upper()}")
            response = simulator.process_command(data)
            print(f"Respond: {response.hex(' ').upper()}")
            conn.send(response)
    finally:
        conn.close()
        print(f"Client disconnected: {addr}")


def run_server(host='0.0.0.0', port=8801):
    simulator = LightModuleSimulator()
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
        s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        s.bind((host, port))
        s.listen(5)
        print(f"Simulator running on {host}:{port}")

        while True:
            conn, addr = s.accept()
            Thread(target=handle_client, args=(conn, addr, simulator)).start()


if __name__ == '__main__':
    run_server('192.168.88.116',8801)
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐