enet-validator/emu-probes/probe_rdm.py

61 lines
1.5 KiB
Python

import socket,struct,time
DUT=("192.168.68.200",31772)
UID=bytes.fromhex("7fff0ae09229")
SRC=bytes.fromhex("0107340000aa")
def build(dest,cc,pid,pd):
f=bytearray(1084)
f[0:4]=b"ENet"
f[4]=4
f[0x0A]=0x1c; f[0x0B]=0x7c
f[0x12]=1
struct.pack_into("<H",f,0x14,1084)
f[0x18]=1
f[0x20]=2
f[0x2A]=0xCC
f[0x2E]=1
f[0x30]=0
msg_len=24+len(pd)
struct.pack_into("<I",f,0x34,msg_len+1)
f[0x38]=1
f[0x3C]=1
f[0x3D]=msg_len
f[0x3E:0x44]=dest
f[0x44:0x4A]=SRC
f[0x4A]=1
f[0x4F]=cc
struct.pack_into(">H",f,0x50,pid)
f[0x52]=len(pd)
f[0x53:0x53+len(pd)]=pd
s=0xCC+sum(f[0x3C:0x53+len(pd)])
struct.pack_into(">H",f,0x53+len(pd),s&0xFFFF)
return bytes(f)
def uid64(b): return int.from_bytes(b,"big")
v=uid64(UID)
branch_pd=(v-1).to_bytes(6,"big")+(v+1).to_bytes(6,"big")
s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
s.settimeout(1.5)
s.bind(("192.168.68.1",0))
def probe(tag,frame,n=6):
ok=0
for i in range(n):
s.sendto(frame,DUT)
try:
d,a=s.recvfrom(2048)
rl=struct.unpack_from("<H",d,0x28)[0]
print("%s #%d reply %dB rlen=%d d0=%02x"%(tag,i,len(d),rl,d[0x2A]))
ok+=1
except socket.timeout:
print("%s #%d TIMEOUT"%(tag,i))
time.sleep(0.3)
print("%s: %d/%d replied"%(tag,ok,n))
probe("UNMUTE",build(b"\xff"*6,0x10,0x0003,b""))
probe("BRANCH",build(b"\xff"*6,0x10,0x0001,branch_pd))
probe("GET_DI",build(UID,0x20,0x0060,b""))
probe("BRANCH2",build(b"\xff"*6,0x10,0x0001,branch_pd))