Files

244 lines
11 KiB
Python
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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. 转 double8字节 大端) =========
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