enet-validator/scripts/session/analyze_dmx3.ps1

97 lines
4.4 KiB
PowerShell
Raw Normal View History

[Console]::OutputEncoding = [Text.Encoding]::UTF8
$ErrorActionPreference = "Stop"
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 HexR($b, $o, $l) { return (($b[$o..($o+$l-1)] | ForEach-Object { $_.ToString("x2") }) -join "") }
$lines = [IO.File]::ReadAllLines("$env:TEMP\opencode\ss123.tsv")
$dmx = New-Object System.Collections.ArrayList
$keys = New-Object System.Collections.ArrayList
foreach ($l in $lines) {
$p = $l -split "`t"; if ($p.Count -lt 5 -or -not $p[4]) { continue }
$b = H2B $p[4]
if ($p[1] -eq "192.168.123.113" -and $p[2] -eq "192.168.123.1" -and $b.Length -eq 1084 -and [int]$b[4] -eq 4 -and $b[0x20] -eq 1 -and $b[0x21] -eq 1) {
[void]$dmx.Add(@{ t=[double]$p[0]; b=$b })
}
# 密钥报文: 主机→广播 1947B 帧
if ($p[1] -eq "192.168.123.113" -and $p[2] -match "255" -and $b.Length -ge 1900) {
[void]$keys.Add(@{ t=[double]$p[0]; b=$b })
}
}
Write-Host ("DMX-A={0} 密钥广播={1}" -f $dmx.Count, $keys.Count)
# === 1. 相同通道数据的帧, 可变字节是否相同? ===
Write-Host "`n=== 相同通道数据帧的可变字节对比 ==="
$byData = @{}
foreach ($f in $dmx) {
$dh = HexR $f.b 0x3C 64 # 前64通道作指纹
if (-not $byData.ContainsKey($dh)) { $byData[$dh] = New-Object System.Collections.ArrayList }
[void]$byData[$dh].Add($f)
}
$groups = $byData.GetEnumerator() | Where-Object { $_.Value.Count -ge 2 } | Select-Object -First 3
$gcount = 0
foreach ($g in $groups) {
$gcount++
Write-Host (" 组{0} ({1}帧):" -f $gcount, $g.Value.Count)
foreach ($f in ($g.Value | Select-Object -First 4)) {
Write-Host (" t={0,8:F3} 0x1A={1} 0x22={2}" -f $f.t, (HexR $f.b 0x1A 2), (HexR $f.b 0x22 8))
}
}
if ($gcount -eq 0) { Write-Host " (120s 内通道数据无重复 — 效果持续变化)" }
# === 2. 可变字节是否随帧序平滑变化? 连续 8 帧的 0x22-0x29 ===
Write-Host "`n=== 连续 8 帧 0x1A/0x22 原始值 ==="
foreach ($f in ($dmx | Select-Object -First 8)) {
Write-Host (" t={0,8:F3} 0x1A={1} 0x22-0x29={2}" -f $f.t, (HexR $f.b 0x1A 2), (HexR $f.b 0x22 8))
}
# === 3. 密钥广播结构 ===
if ($keys.Count -gt 0) {
Write-Host "`n=== 密钥广播帧 (前2个) ==="
foreach ($k in ($keys | Select-Object -First 2)) {
Write-Host (" t={0,8:F3} len={1}" -f $k.t, $k.b.Length)
Write-Host (" 0x00-0x2F: " + (HexR $k.b 0 0x30))
Write-Host (" 0x30-0x5F: " + (HexR $k.b 0x30 0x30))
}
# 密钥帧之间是否相同
if ($keys.Count -ge 2) {
$same = 0; $diff = 0
for ($i = 0; $i -lt [Math]::Min(0x100, $keys[0].b.Length); $i++) {
if ($keys[0].b[$i] -eq $keys[1].b[$i]) { $same++ } else { $diff++ }
}
Write-Host (" 帧1vs帧2 前256B: 同={0} 异={1}" -f $same, $diff)
}
# 密钥帧间隔
$kg = New-Object System.Collections.ArrayList
for ($i = 1; $i -lt $keys.Count; $i++) { [void]$kg.Add([int](($keys[$i].t - $keys[$i-1].t) * 1000)) }
Write-Host (" 间隔ms: " + (($kg | Select-Object -First 12) -join ", "))
}
# === 4. 0x22-0x29 是否 = f(通道数据)? 试常见简单哈希 ===
Write-Host "`n=== 0x22-0x29 vs 通道数据简单函数 ==="
$m_add=0; $m_xor=0; $m_crc32=0
foreach ($f in ($dmx | Select-Object -First 100)) {
$d = $f.b[0x3C..0x43B]
# CRC32 (IEEE)
$crc = [uint32]0xFFFFFFFF
foreach ($v in $d) {
$crc = $crc -bxor $v
for ($j=0; $j -lt 8; $j++) { if ($crc -band 1) { $crc = ($crc -shr 1) -bxor 0xEDB88320 } else { $crc = $crc -shr 1 } }
}
$crc = $crc -bxor 0xFFFFFFFF
$s0 = [uint32]$f.b[0x22] + [uint32]$f.b[0x23]*256 + [uint32]$f.b[0x24]*65536 + [uint32]$f.b[0x25]*16777216
$s1 = [uint32]$f.b[0x26] + [uint32]$f.b[0x27]*256 + [uint32]$f.b[0x28]*65536 + [uint32]$f.b[0x29]*16777216
if ($crc -eq $s0 -or $crc -eq $s1) { $m_crc32++ }
}
Write-Host (" CRC32(通道数据) 匹配 0x22或0x26: {0}/100" -f $m_crc32)
# === 5. 常量字段 0x2C-0x3B 的稳定性 (是否随 universe 变化) ===
Write-Host "`n=== 0x2C-0x3B 常量确认 ==="
$var34 = @{}
foreach ($f in $dmx) { $h = HexR $f.b 0x2C 16; if (-not $var34.ContainsKey($h)) { $var34[$h] = 0 }; $var34[$h]++ }
foreach ($kv in $var34.GetEnumerator()) { Write-Host (" {0} : {1}帧" -f $kv.Key, $kv.Value) }