[Console]::OutputEncoding = [Text.Encoding]::UTF8 $ErrorActionPreference = "Stop" $f = "$env:TEMP\opencode\cold2.tsv" $lines = [IO.File]::ReadAllLines($f) function H2B($hex) { if (-not $hex) { return $null } $n = $hex.Length / 2 $b = New-Object byte[] $n for ($i = 0; $i -lt $n; $i++) { $b[$i] = [Convert]::ToByte($hex.Substring(2*$i, 2), 16) } return $b } function Hex($b) { return ($b | ForEach-Object { $_.ToString("x2") }) -join "" } function UidStr($b, $o) { if ($b.Length -lt $o+6) { return "?" }; return ($b[$o..($o+5)] | ForEach-Object { $_.ToString("x2") }) -join "" } # 采集 70B RDM 应答 $resp70 = @() foreach ($l in $lines) { $p = $l -split "`t"; if ($p.Count -lt 5 -or -not $p[4]) { continue } if ($p[1] -ne "192.168.123.1" -or $p[2] -ne "192.168.123.113") { continue } $b = H2B $p[4] if ($b.Length -eq 70 -and $b[0x2A] -eq 0xCC) { $resp70 += ,$b } } Write-Host ("70B RDM 应答数: {0}" -f $resp70.Count) # 全字段偏移扫描: sum(b[o..66])==ck16 且唯一解 Write-Host "`n--- 唯一偏移扫描: sum(b[o..66]) == ck@68-69 (BE) ---" foreach ($o in 0x2A..0x34) { $matchAll = $true foreach ($b in $resp70) { $sum = 0; for ($i = $o; $i -le 66; $i++) { $sum += $b[$i] } $ck = ($b[67] -shl 8) -bor $b[68] # 注意: 上面偏移占位, 实际 ck 在最后两字节 68-69 $ck = ($b[68] -shl 8) -bor $b[69] if (($sum -band 0xFFFF) -ne $ck) { $matchAll = $false; break } } Write-Host (" start=0x{0:x2} end=66 ck@68-69 : {1}" -f $o, $(if ($matchAll) {"全部匹配"} else {"否"})) } # 结合 msgLen: 若 start=0x2E, 覆盖字节数 = 66-0x2E+1 = 0x27? 试 sum(b[0x2A..0x2A+msgLen+2]) (msgLen 不含 CC01) Write-Host "`n--- 假设: msgLen@0x2C 不含 CC01 两字节, 求和范围 = CC01 + msgLen 字节 ---" $ok = 0; $bad = 0 foreach ($b in $resp70) { $msgLen = $b[0x2C] $sum = 0; for ($i = 0x2A; $i -lt 0x2A + 2 + $msgLen; $i++) { $sum += $b[$i] } $ck = ($b[68] -shl 8) -bor $b[69] if (($sum -band 0xFFFF) -eq $ck) { $ok++ } else { $bad++ } } Write-Host (" OK={0} BAD={1}" -f $ok, $bad) # 展示两个 70B 样本的完整 hex + 各字段 Write-Host "`n--- 70B 样本字段 ---" foreach ($b in ($resp70 | Select-Object -First 2)) { $msgLen = $b[0x2C] Write-Host (" frame: " + (Hex $b)) Write-Host (" 0x28 RDMlen={0} 0x2C msgLen={1} dest={2} src={3} TN={4:x2} RT={5:x2} CC={6:x2} PID={7:x2}{8:x2} PD={9} ck={10:x2}{11:x2}" -f ` ($b[0x28] -bor ($b[0x29] -shl 8)), $msgLen, (UidStr $b 0x2D), (UidStr $b 0x33), $b[0x39], $b[0x3A], $b[0x3E], $b[0x3F], $b[0x40], (Hex $b[0x42..0x43]), $b[0x44], $b[0x45]) # 试 sum(0x2E..0x2E+msgLen-1) $s1 = 0; for ($i = 0x2E; $i -lt 0x2E + $msgLen; $i++) { $s1 += $b[$i] } Write-Host (" sum(0x2E..0x2E+msgLen-1)=0x{0:x4} (end=0x{1:x2})" -f ($s1 -band 0xFFFF), (0x2E + $msgLen - 1)) $s2 = 0; for ($i = 0x2A; $i -lt 0x2A + 2 + $msgLen; $i++) { $s2 += $b[$i] } Write-Host (" sum(0x2A..0x2A+msgLen+1)=0x{0:x4} (end=0x{1:x2})" -f ($s2 -band 0xFFFF), (0x2A + 2 + $msgLen - 1)) } # 同样验证一个 87B (DEVICE_INFO) 应答 Write-Host "`n--- 87B DEVICE_INFO 应答验证 ---" $cnt = 0 foreach ($l in $lines) { $p = $l -split "`t"; if ($p.Count -lt 5 -or -not $p[4]) { continue } if ($p[1] -ne "192.168.123.1" -or $p[2] -ne "192.168.123.113") { continue } $b = H2B $p[4] if ($b.Length -eq 87 -and $b[0x2A] -eq 0xCC) { $msgLen = $b[0x2C] $ckOff = $b.Length - 2 $ck = ($b[$ckOff] -shl 8) -bor $b[$ckOff+1] $s1 = 0; for ($i = 0x2E; $i -lt 0x2E + $msgLen; $i++) { $s1 += $b[$i] } $s2 = 0; for ($i = 0x2A; $i -lt 0x2A + 2 + $msgLen; $i++) { $s2 += $b[$i] } Write-Host (" msgLen={0} ck=0x{1:x4} sum_noCC01=0x{2:x4}({3}) sum_withCC01=0x{4:x4}({5})" -f $msgLen, $ck, ($s1 -band 0xFFFF), $(if (($s1 -band 0xFFFF) -eq $ck) {"OK"} else {"x"}), ($s2 -band 0xFFFF), $(if (($s2 -band 0xFFFF) -eq $ck) {"OK"} else {"x"})) $cnt++; if ($cnt -ge 5) { break } } }