82 lines
3.9 KiB
PowerShell
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 }
|
|||
|
|
}
|
|||
|
|
}
|