import struct from typing import Optional from converter.base_converter import BaseConverter from utils.logger import logger from utils.hex_helper import hex_dump # ====================== 指令映射表 ====================== CMD_MAP = { "5555000811110010A5A5A5A5A5A5A5A5A5": "K3008", "5555000911110010A5A5A5A5A5A5A5A5A5": "K3009", "5555000A11110010A5A5A5A5A5A5A5A5A5": "K3010", "5555000B11110010A5A5A5A5A5A5A5A5A5": "K3011", "88880A0506040004000400A5A5A5A5A5A5": "K6307", "88880A0506040104010401A5A5A5A5A5A5": "K6308", "88880A0506040204020402A5A5A5A5A5A5": "K6309", "88880A0506040304030403A5A5A5A5A5A5": "K6310", "88880A0506040404040404A5A5A5A5A5A5": "K6311", "88880A0506040504050405A5A5A5A5A5A5": "K6312", "88880A0506040604060406A5A5A5A5A5A5": "K6313", "88880A0506040704070407A5A5A5A5A5A5": "K6314", "88880A0506040804080408A5A5A5A5A5A5": "K6315", "88880A0506040904090409A5A5A5A5A5A5": "K6316", "88880A0506040A040A040AA5A5A5A5A5A5": "K6317", "88880A0506040B040B040BA5A5A5A5A5A5": "K6318", "88880A0506040C040C040CA5A5A5A5A5A5": "K6319", "88880A0506040D040D040DA5A5A5A5A5A5": "K6320", "88880A0506040E040E040EA5A5A5A5A5A5": "K6321", "88880A0506040F040F040FA5A5A5A5A5A5": "K6322", "88880A0506050005000500A5A5A5A5A5A5": "K6323", "88880A0506050105010501A5A5A5A5A5A5": "K6324", "88880A0506050205020502A5A5A5A5A5A5": "K6325", "88880A0506050305030503A5A5A5A5A5A5": "K6326", "88880A0506050405040504A5A5A5A5A5A5": "K6327", "88880A0506050505050505A5A5A5A5A5A5": "K6328", "88880A0506050605060506A5A5A5A5A5A5": "K6329", "88880A0506050705070507A5A5A5A5A5A5": "K6330", "88880A0506050805080508A5A5A5A5A5A5": "K6331", "88880A0506050905090509A5A5A5A5A5A5": "K6332", "88880A0506050A050A050AA5A5A5A5A5A5": "K6333", "88880A0506050B050B050BA5A5A5A5A5A5": "K6334", "88880A0506050C050C050CA5A5A5A5A5A5": "K6335", "88880A0506050D050D050DA5A5A5A5A5A5": "K6336", "88880A0506050E050E050EA5A5A5A5A5A5": "K6337", "88880A0506050F050F050FA5A5A5A5A5A5": "K6338", "88880A0506060006000600A5A5A5A5A5A5": "K6339", "88880A0506060106010601A5A5A5A5A5A5": "K6340", "88880A0506060206020602A5A5A5A5A5A5": "K6341", "88880A0506060306030603A5A5A5A5A5A5": "K6342", "88880A0506060406040604A5A5A5A5A5A5": "K6343", "88880A0506060506050605A5A5A5A5A5A5": "K6344", "88880A0506060606060606A5A5A5A5A5A5": "K6345", "88880A0506060706070607A5A5A5A5A5A5": "K6346", "88880A0506060806080608A5A5A5A5A5A5": "K6347", "88880A0506060906090609A5A5A5A5A5A5": "K6348", "88880A0506060A060A060AA5A5A5A5A5A5": "K6349", "88880A0506060B060B060BA5A5A5A5A5A5": "K6350", "88880A0506060C060C060CA5A5A5A5A5A5": "K6351", "88880A0506060D060D060DA5A5A5A5A5A5": "K6352", "88880A0506060E060E060EA5A5A5A5A5A5": "K6353", "88880A0506060F060F060FA5A5A5A5A5A5": "K6354", "88880A0506070007000700A5A5A5A5A5A5": "K6355", "88880A0506070107010701A5A5A5A5A5A5": "K6356", "88880A0506070207020702A5A5A5A5A5A5": "K6357", "88880A0506070307030703A5A5A5A5A5A5": "K6358", "88880A0506070407040704A5A5A5A5A5A5": "K6359", "88880A0506070507050705A5A5A5A5A5A5": "K6360", "88880A0506070607060706A5A5A5A5A5A5": "K6361", "88880A0506070707070707A5A5A5A5A5A5": "K6362", "88880A0506070807080708A5A5A5A5A5A5": "K6363", "88880A0506070907090709A5A5A5A5A5A5": "K6364", "88880A0506070A070A070AA5A5A5A5A5A5": "K6365", "88880A0506070B070B070BA5A5A5A5A5A5": "K6366", "88880A0506070C070C070CA5A5A5A5A5A5": "K6367", "88880A0506070D070D070DA5A5A5A5A5A5": "K6368", "88880A0506070E070E070EA5A5A5A5A5A5": "K6369", "88880A0506070F070F070FA5A5A5A5A5A5": "K6370", "88880101061111001B0000A5A5A5A5A5A5": "K6155", "88880101061111001C0000A5A5A5A5A5A5": "K6156", "88880101061111001F0000A5A5A5A5A5A5": "K6159", "8888010106111100200000A5A5A5A5A5A5": "K6160", "8888010106111100620000A5A5A5A5A5A5": "K6225", "8888010106111100630000A5A5A5A5A5A5": "K6226", "8888010106111100210000A5A5A5A5A5A5": "K6161", "8888010106111100220000A5A5A5A5A5A5": "K6162", "8888010106111100270000A5A5A5A5A5A5": "K6166", "8888010106111100280000A5A5A5A5A5A5": "K6167", "8888010106111100330000A5A5A5A5A5A5": "K6178", "8888010106111100340000A5A5A5A5A5A5": "K6179", "8888010106111100350000A5A5A5A5A5A5": "K6180", "8888010106111100360000A5A5A5A5A5A5": "K6181", "88880101061111006A0000A5A5A5A5A5A5": "K6233", "88880101061111006B0000A5A5A5A5A5A5": "K6234", "88880101061111007E0000A5A5A5A5A5A5": "K6253", "88880101061111007F0000A5A5A5A5A5A5": "K6254", "88880C1B0C020222BBAAAAAAAAAAAAAA33": "K6557", "88880C1B0C020222CCAAAAAAAAAAAAAA44": "K6558", "88880101061111003D0000A5A5A5A5A5A5": "K6188", "88880101061111003E0000A5A5A5A5A5A5": "K6189", "88880101061111003F0000A5A5A5A5A5A5": "K6190", "8888010106111100400000A5A5A5A5A5A5": "K6191", "8888010106111100410000A5A5A5A5A5A5": "K6192", "8888010106111100420000A5A5A5A5A5A5": "K6193", "8888010106111100430000A5A5A5A5A5A5": "K6194", "8888010106111100440000A5A5A5A5A5A5": "K6195", "88880C1B0C02021177AAAAAAAAAAAAAACC": "K6451", "88880C1B0C02021188AAAAAAAAAAAAAA33": "K6452", "88880101061111000B0000A5A5A5A5A5A5": "K6139", "88880101061111000C0000A5A5A5A5A5A5": "K6140", "8888010106111100170000A5A5A5A5A5A5": "K6151", "8888010106111100180000A5A5A5A5A5A5": "K6152", "8888010106111100610000A5A5A5A5A5A5": "K6224", "8888010106111100780000A5A5A5A5A5A5": "K6247", "8888010106111100790000A5A5A5A5A5A5": "K6248", #2026/4/13新增 "888810010AA0A00000000000000000A5A5":"K6669", "888810010A40500000000000000000A5A5":"K6670", "888810010A50400000000000000000A5A5":"K6671", "888810010A6070AB180000AB180000A5A5":"K6672", "888810010A7060AB180000AB180000A5A5":"K6673", "888810010A00000000000000000000A5A5":"K6674", "888810010A20300000000000000000A5A5":"K6675", "888810010A30200000000000000000A5A5":"K6676", #2026/4/16新增 "888810010A00300000000000000000A5A5":"K6677", "888810010A00200000000000000000A5A5":"K6678", "888810010A00500000000000000000A5A5":"K6679", "888810010A00400000000000000000A5A5":"K6680", "888810010A007000000000AB180000A5A5":"K6681", "888810010A006000000000AB180000A5A5":"K6682", "888810010A00A00000000000000000A5A5":"K6683", "888810010A20000000000000000000A5A5":"K6684", "888810010A30000000000000000000A5A5":"K6685", "888810010A20500000000000000000A5A5":"K6686", "888810010A30400000000000000000A5A5":"K6687", "888810010A207000000000AB180000A5A5":"K6688", "888810010A306000000000AB180000A5A5":"K6689", "888810010A20A00000000000000000A5A5":"K6690", "888810010A30A00000000000000000A5A5":"K6691", "888810010A40000000000000000000A5A5":"K6692", "888810010A50000000000000000000A5A5":"K6693", "888810010A40300000000000000000A5A5":"K6694", "888810010A50200000000000000000A5A5":"K6695", "888810010A407000000000AB180000A5A5":"K6696", "888810010A506000000000AB180000A5A5":"K6697", "888810010A40A00000000000000000A5A5":"K6698", "888810010A50A00000000000000000A5A5":"K6699", "888810010A6000AB18000000000000A5A5":"K6700", "888810010A7000AB18000000000000A5A5":"K6701", "888810010A6030AB18000000000000A5A5":"K6702", "888810010A7020AB18000000000000A5A5":"K6703", "888810010A6050AB18000000000000A5A5":"K6704", "888810010A7040AB18000000000000A5A5":"K6705", "888810010A60A0AB18000000000000A5A5":"K6706", "888810010A70A0AB18000000000000A5A5":"K6707", "888810010AA0000000000000000000A5A5":"K6708", "888810010AA0300000000000000000A5A5":"K6709", "888810010AA0200000000000000000A5A5":"K6710", "888810010AA0500000000000000000A5A5":"K6711", "888810010AA0400000000000000000A5A5":"K6712", "888810010AA07000000000AB180000A5A5":"K6713", "888810010AA06000000000AB180000A5A5":"K6714", "888810010A40400000000000000000A5A5":"K6715", "888810010A50500000000000000000A5A5":"K6716", "888810010A6060AB180000AB180000A5A5":"K6717", "888810010A7070AB180000AB180000A5A5":"K6718", "888810010A20200000000000000000A5A5":"K6719", "888810010A30300000000000000000A5A5":"K6720", "888810010A20400000000000000000A5A5":"K6723", "888810010A30500000000000000000A5A5":"K6724", "888810010A206000000000AB180000A5A5":"K6725", "888810010A307000000000AB180000A5A5":"K6726", "888810010A40200000000000000000A5A5":"K6727", "888810010A50300000000000000000A5A5":"K6728", "888810010A406000000000AB180000A5A5":"K6729", "888810010A507000000000AB180000A5A5":"K6730", "888810010A6020AB18000000000000A5A5":"K6731", "888810010A7030AB18000000000000A5A5":"K6732", "888810010A6040AB18000000000000A5A5":"K6733", "888810010A7050AB18000000000000A5A5":"K6734", "BBBBFF0101A5A5A5A5A5A5A5A5A5A5A5A5":"K1085", "BBBBFF0202A5A5A5A5A5A5A5A5A5A5A5A5":"K1089", } class C2AConverter(BaseConverter): def convert(self, data: bytes) -> Optional[bytes]: try: # ========= 1. 截取指令码(B48~B64) ========= if len(data) < 65: logger.warning("帧长度不足,无法解析指令") return None # cmd_bytes = data[48:48+17]#遥控通道遥控帧 cmd_bytes = data[54:(54+17)]#地测通道遥控帧 cmd_hex = cmd_bytes.hex().upper() #logger.info(f"🔍 提取指令码:{cmd_hex}") # ========= 2. 查询指令是否需要转发 ========= if cmd_hex not in CMD_MAP: #logger.info("ℹ️ 指令不在转发列表,不发送给 A") return None cmd_code = CMD_MAP[cmd_hex] logger.info(f"✅ 匹配指令:{cmd_code},准备转发给 A") # ========= 3. 提取数字(4位十进制) ========= num_str = cmd_code[1:] # K3008 → 3008 num = int(num_str) logger.info(f"✅ 匹配指令:{cmd_code},🔢 指令编号:{num_str} → {num}") # ========= 4. 转 double(8字节 大端) ========= double_big = struct.pack('>d', float(num)) # ========= 5. 组 A 软件协议帧 ========= HEADER = 0xEB90EB90 DATA_LEN = 0x08 if num == 1085 or num == 1089: DIR = 0x02222222 #控制前端到同元 DATA_ID = 0x00330000 #测控 else: DIR = 0x01111111 #0x02222222改为0x01111111(数字卫星到同元) DATA_ID = 0x00440000 #SADA PARAM_TYPE = 0x00222222 SATELLITE = 0x00000001 TAIL = 0x4C3A frame = ( struct.pack('>I', HEADER) + struct.pack('>I', DATA_LEN) + struct.pack('>I', DIR) + struct.pack('>I', DATA_ID) + struct.pack('>I', PARAM_TYPE) + struct.pack('>I', SATELLITE) + double_big + struct.pack('>H', TAIL) ) hex_dump(frame, f"向A 软件发送帧 [{cmd_code}]") return frame except Exception as e: logger.error(f"C→A 转换失败:{e}", exc_info=True) return None