chenyc
2026-03-22 d23dc3235324e6bbe62e507eae807435d77dfc6d
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
const { SerialPort } = require('serialport');
const PORT_NAME = 'COM9'; // 确认端口
 
// 尝试不同的目标节点和类型
const PROBES = [
    { dst: 0x53, type: 0x0F, desc: "Service Node: Get System Info" }, // 'S'
    { dst: 0x4D, type: 0x0F, desc: "Maint Node: Get System Info" },   // 'M'
    { dst: 0x53, type: 0x00, cond: 0x09, desc: "Service Node: Get Version (Cond=09)" },
    { dst: 0x4F, type: 0x0E, desc: "Operator Node: Service Request" }  // 特殊类型
];
 
function buildProbe(dst, type, cond = 0x00) {
    // 简化构建:Seq=01, Src=00, Param=0000, NumSpec=00 (无参数)
    // 注意:如果没有 Spec,长度会变短
    // 结构: Seq, Len, Src, Dst, Type, Cond, ParamH, ParamL, NumSpec
    // 如果 NumSpec=0,后面就没有 SpecType/Idx
    
    const numSpec = 0x00; 
    // Len = Src(1)+Dst(1)+Type(1)+Cond(1)+Param(2)+NumSpec(1) + CRC(1) = 8 (0x08)
    const len = 0x08;
    
    const raw = [0x01, len, 0x00, dst, type, cond, 0x00, 0x00, numSpec];
    
    let sum = raw.reduce((a, b) => a + b, 0);
    const crc = sum & 0xFF;
    raw.push(crc);
 
    // 转义
    const special = new Set([0x02, 0x04, 0x06, 0x15, 0x1B]);
    const escaped = [];
    raw.forEach(b => {
        if(special.has(b)) { escaped.push(0x1B); escaped.push((b+0x20)&0xFF); }
        else escaped.push(b);
    });
 
    return Buffer.from([0x02, ...escaped, 0x04]);
}
 
async function runProbes() {
    const port = new SerialPort({ path: PORT_NAME, baudRate: 9600 });
    port.on('open', async () => {
        console.log("🔍 开始探测维护模式...");
        for (const p of PROBES) {
            const pkt = buildProbe(p.dst, p.type, p.cond);
            console.log(`\n尝试: ${p.desc}`);
            console.log(`Hex: ${pkt.toString('hex').match(/.{1,2}/g).join(' ')}`);
            
            port.write(pkt);
            
            const resp = await new Promise(res => {
                let t = setTimeout(() => res(null), 1000);
                port.once('data', d => { clearTimeout(t); res(d); });
            });
 
            if (resp) {
                if (resp[0] === 0x06) console.log("✅ SUCCESS! 发现隐藏入口!");
                else if (resp[0] === 0x15) console.log("❌ NAK");
                else console.log(`⚠️ 未知: ${resp.toString('hex')}`);
            } else {
                console.log("⏱️ 超时");
            }
            await new Promise(r => setTimeout(r, 300));
        }
        port.close();
    });
}
runProbes();