# Verify-Rdm.ps1 — 验证 enet_protocol.md §5 RDM 断言 $ErrorActionPreference = 'Stop' $script:pass = 0; $script:fail = 0 function Check($name, $cond, $detail) { if ($cond) { $script:pass++; Write-Host (" [PASS] {0} {1}" -f $name, $detail) } else { $script:fail++; Write-Host (" [FAIL] {0} {1}" -f $name, $detail) } } . "C:\Users\tonycao\work\light\enet_lib.ps1" $pkts = Read-Pcap "C:\Users\tonycao\AppData\Local\Temp\opencode\rdm3_classic.pcap" $msgs = @(); foreach ($p in $pkts) { $u = UdpPayload $p; if ($u) { $msgs += $u } } Write-Host ("RDM 抓包总包数: {0}" -f $msgs.Count) # R1: RDM 应答帧 = Butler→主机 + "Butl" + cc01 起始 $rdm = @($msgs | Where-Object { $_.Src -eq '192.168.123.1' -and $_.Payload.Length -gt 0x2C -and (LE32 $_.Payload 4) -eq 4 -and (Hex $_.Payload 0x1A 4) -eq '4275746c' -and (Hex $_.Payload 0x2A 2) -eq 'cc01' }) $dist = ($rdm | Group-Object { $_.Payload.Length } | ForEach-Object { "$($_.Name)x$($_.Count)" }) -join ',' Check "R1 RDM帧=Butler→主机+cc01" ($rdm.Count -gt 0) ("| n={0} ({1})" -f $rdm.Count, $dist) # R2: 0x28 长度字段 == 实际 RDM 区长 (负载长 - 0x2A) $bad = @($rdm | Where-Object { [int](LE16 $_.Payload 0x28) -ne ($_.Payload.Length - 0x2A) }) Check "R2 RDM长度字段0x28" ($bad.Count -eq 0) ("| {0}/{1} 一致" -f ($rdm.Count - $bad.Count), $rdm.Count) # R3: 灯具 UID (Src @ 0x32, 6字节) — 至少 1 台, 收集全部 $uids = @($rdm | ForEach-Object { (Hex $_.Payload 0x32 6) } | Sort-Object -Unique) $uidFmt = ($uids | ForEach-Object { ($_.ToCharArray() | ForEach-Object { if ($_ -eq '*') { $_ } else { $_ } }) -join '' }) -join ':' Check "R3 灯具UID@0x32" ($uids.Count -ge 1) ("| {0} 台: {1}" -f $uids.Count, ($uids -join ' ')) # R4: DISC 发现响应原始脉冲 $disc = @($msgs | Where-Object { $_.Src -eq '192.168.123.1' -and $_.Payload.Length -gt 0x2E -and (Hex $_.Payload 0x2A 4) -eq 'aaaa5dbb' }) Check "R4 DISC发现响应脉冲" ($disc.Count -gt 0) ("| n={0} 负载={1}" -f $disc.Count, $(if($disc.Count){ (Hex $disc[0].Payload 0x2A 17) } else { '-' })) # R5: 主机请求封装在 1126 事件帧 (0x4A 处 cc01) $req = @($msgs | Where-Object { $_.Src -eq '192.168.123.113' -and $_.Payload.Length -ge 0x4C -and (Hex $_.Payload 0x4A 2) -eq 'cc01' }) Check "R5 主机请求封装于事件帧@0x4A" ($req.Count -gt 0) ("| n={0}" -f $req.Count) Write-Host "`n========================================" Write-Host ("RDM 验证结果: PASS={0} FAIL={1}" -f $script:pass, $script:fail) if ($script:fail -eq 0) { Write-Host ">>> RDM 协议断言全部验证通过 <<<" }