enet-validator/scripts/session/analyze_ck.ps1

82 lines
3.9 KiB
PowerShell

[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 }
}
}