nodescan.py 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780
  1. #! /usr/bin/python
  2. # -*- coding: utf-8 -*-
  3. """
  4. Valid-License-Identifier: GPL-2.0-only
  5. SPDX-URL: https://spdx.org/licenses/GPL-2.0-only.html
  6. (c) 2012 micha@librelight.de
  7. """
  8. print("suche ArtNet Nodes ")
  9. import time
  10. import socket, struct
  11. import sys
  12. import _thread as thread
  13. import copy
  14. import random
  15. import traceback
  16. sys.stdout.write("\x1b]2;Nodescan\x07")
  17. print(socket.AF_INET)
  18. is_running = 1
  19. class socket_warp():
  20. def __init__(self):
  21. self.sock = None
  22. self.connected = 0
  23. self._connect()
  24. def _connect(self):
  25. print(sys._getframe().f_code.co_name)
  26. self.connected = 0
  27. try:
  28. ip_port = ('',6454)
  29. self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
  30. self.sock.bind(ip_port)
  31. self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
  32. print(__file__,"BIND",ip_port)
  33. self.connected = 1
  34. except socket.error as e:
  35. print("Socket 6454 ", "ERR: {0} ".format(e.args))
  36. #sys.exit()
  37. def sendto(self,bdata,ip_port=('0.0.0.0',9999)):
  38. ip,port = ip_port
  39. print(sys._getframe().f_code.co_name)
  40. #,sock.sendto(b'Art-Net\x00\x00 \x00\x0e\x06\x00',(ip,port)) # ArtPol / ping
  41. self.sock.sendto(bdata,(ip,port)) # ArtPol / ping
  42. def recvfrom(self,leng):
  43. #print(sys._getframe().f_code.co_name,data)
  44. data = b"err"
  45. addr = '0.0.0.0'
  46. try:
  47. data, addr = self.sock.recvfrom(leng)
  48. except Exception as e:
  49. print(__file__,"ERR",e)
  50. time.sleep(1)
  51. #if data:
  52. # print(sys._getframe().f_code.co_name,data)
  53. return data, addr
  54. def close(self):
  55. self.sock.close()
  56. def rcv(self):
  57. print(sys._getframe().f_code.co_name)
  58. sock = socket_warp()
  59. try:
  60. sock2 = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
  61. sock2.bind(('', 6455))
  62. sock2.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
  63. except socket.error as e:
  64. print("Socket2 6455 ", "ERR: {0} ".format(e.args))
  65. #sys.exit()
  66. print(socket.AF_INET)
  67. sock_cmd = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
  68. def bind_cmd_node():
  69. global sock_cmd
  70. try:
  71. sock_cmd.bind(('', 7601)) #7601
  72. #sock_cmd.bind(('', 49737))
  73. sock_cmd.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
  74. except socket_cmd.error as e:
  75. print("Socket 6454 ", "ERR: {0} ".format(e.args))
  76. sys.exit()
  77. if __name__ == "__main__":
  78. bind_cmd_node()
  79. def ArtNet_poll(ip,port=6454):
  80. print("POLL",[ip,port],end="")
  81. #traceback.print_exception()
  82. #try:
  83. if 1:
  84. sock.sendto(b'Art-Net\x00\x00 \x00\x0e\x06\x00',(ip,port)) # ArtPol / ping
  85. print(" OK ;",end="")
  86. #send_node_cmd(ip=(2,255,255,255),cmd="CMD GT ")
  87. #except Exception as e:
  88. # print("Exception ArtNet-POLL",e,)
  89. print()
  90. def ArtPollReplyDelay():
  91. time.sleep(1)
  92. ArtPollReply()
  93. def ArtPollReply():
  94. print("ArtPollReply()")
  95. port = 6454
  96. content = []
  97. header = []
  98. # Name, 7byte + 0x00
  99. content.append("Art-Net\x00")
  100. # OpCode ArtPollReply -> 0x2100, Low Byte first
  101. content.append(struct.pack('<H', 0x2100))
  102. # Protocol Version 14, High Byte first
  103. content.append(struct.pack('>H', 14))
  104. # IP
  105. #ip = [int(i) for i in self.own_ip.split('.')]
  106. ip = [2, 0, 0, 10]
  107. content += [chr(i) for i in ip]
  108. # Port
  109. content.append(struct.pack('<H', 0x1936))
  110. # Firmware Version
  111. content.append(struct.pack('>H', 200))
  112. # Net and subnet of this node
  113. net = 0
  114. subnet = 0
  115. content.append(chr(net))
  116. content.append(chr(subnet))
  117. # OEM Code (E:Cue 1x DMX Out)
  118. content.append(struct.pack('>H', 0x0360))
  119. # UBEA Version -> Nope -> 0
  120. content.append(chr(0))
  121. # Status1
  122. content.append(struct.pack('>H', 0b11010000))
  123. # Manufacture ESTA Code
  124. content.append('LL')
  125. # Short Name
  126. content.append('LOOP-OpPollReplay\x00')
  127. # Long Name
  128. content.append('LOOP-OpPollReplay_ArtNet_Node' + '_' * 34 + '\x00')
  129. content.append('\x00'*100)
  130. # stitch together
  131. content = ''.join(content)
  132. #print(self.lang['send_ArtPollReply'])
  133. #self.s.sendto(content, ("<broadcast>", self.__port))
  134. print("send" ,[content])
  135. sock.sendto(content, ("<broadcast>", port))
  136. sock.sendto(content, ("2.0.0.255", port))
  137. sock.sendto(content, ("10.10.10.255", port))
  138. sock.sendto(content, ("192.168.2.255", port))
  139. #sock.sendto(content, ("2.0.0.255", port))
  140. #sock.sendto
  141. def testBounce(ip,port):
  142. print(("TESTBOUNCE", (ip, port)))
  143. try:
  144. sock.sendto("TESTBOUNCE " +ip, (ip, port))
  145. except socket.error as e:
  146. print("Socket", "ERR: {0} ".format(e.args))
  147. print(("TESTBOUNCE", (ip, port)))
  148. def reciveBounce(timeout=10):
  149. start = time.time()
  150. while is_running:
  151. data = sock.recv(500)
  152. print("bounce",data)
  153. #data, addr = sock.recvfrom(500)
  154. if data:
  155. #print(addr)
  156. print("rBounte:",data)
  157. print()
  158. if time.time() > start+timeout:
  159. print("timeout stopping reciveBounce ")
  160. break
  161. def poll():
  162. port = 6454
  163. #ip = "255.255.255.255"
  164. #ArtNet_poll(ip)
  165. #ip = "<broadcast>"
  166. #ArtNet_poll(ip)
  167. ip = "192.168.0.255"
  168. ArtNet_poll(ip)
  169. ip = "192.168.0.99"
  170. ArtNet_poll(ip)
  171. ip = "2.255.255.255"
  172. ArtNet_poll(ip)
  173. ip = "2.0.0.255"
  174. ArtNet_poll(ip)
  175. ip = "2.255.255.255"
  176. ArtNet_poll(ip)
  177. #ip = "2.0.0.255"
  178. #ArtNet_poll(ip)
  179. #ip = "2.255.255.255"
  180. #ArtNet_poll(ip)
  181. print("")
  182. class ArtNetNodes():
  183. def __init__(self):
  184. print("CONSTRUCKT:",self)
  185. self.__nodes = []
  186. self.__nodes_mac = []
  187. self.__lock = thread.allocate_lock()
  188. self.__tick = 0
  189. #self.__lock.acquire()
  190. #self.__lock.release()
  191. def clear(self):
  192. self.__lock.acquire()
  193. self.__nodes = []
  194. self.__lock.release()
  195. def add(self,add_node):
  196. #print("ArtNetNodes.add()",add_node)
  197. #for i in add_node:
  198. # print(i,[add_node[i]])
  199. #print()
  200. #print("add",add_node)
  201. try:
  202. self.__lock.acquire()
  203. update_node = 0
  204. if "MSG" in add_node and "BOOT" in add_node["MSG"].upper():
  205. BOOT = time.time()
  206. print(" BOOOOOOOOT")
  207. else:
  208. BOOT = 0
  209. #self.__nodes_mac = []
  210. for node in self.__nodes:
  211. info = node["MAC"],node["IP"].ljust(16," "),[node["SwIn"],node["SwOut"],node["PortTypes"]]
  212. node_match = 1
  213. keys = ["MAC","SwOut","SwIn","PortTypes"]
  214. for i in keys:
  215. if node[i] != add_node[i]:
  216. node_match = 0
  217. break
  218. if node_match: # NODE MAC
  219. update_node = 0
  220. for i in add_node:
  221. UPDATECOUNTER = node["UPDATECOUNTER"]
  222. #print("update i:",i,add_node[i])
  223. if i not in node:
  224. node[i] = ""
  225. if node[i] != add_node[i]:
  226. node_match = 0
  227. update_node += 1
  228. node[i] = add_node[i]
  229. UPDATECOUNTER +=1
  230. self.__tick += 1
  231. #break
  232. if update_node:
  233. node["UPDATECOUNTER"] = UPDATECOUNTER
  234. node["UPDATESTAMP"] = time.time()
  235. node["REFRESHSTAMP"] = time.time()
  236. if BOOT:
  237. node["BOOT"] = BOOT
  238. print("UPDATE NODE".ljust(16," "),info)
  239. else:
  240. #print("NODE NOT CHANGE".ljust(16," "),info)
  241. node["REFRESHSTAMP"] = time.time()
  242. update_node = 1
  243. update_node = 0
  244. #print("x-node:",update_node,add_node)
  245. if not update_node: # ADD NEW NODE
  246. node = add_node
  247. if node:
  248. #print("add_node",node)
  249. node["BOOT"] = BOOT
  250. info = node["MAC"],node["IP"].ljust(16," "),[node["SwIn"],node["SwOut"],node["PortTypes"]]
  251. node["UPDATECOUNTER"] = 1
  252. node["REFRESHSTAMP"] = time.time()
  253. node["UPDATESTAMP"] = time.time()
  254. print("ADD NEW NODE".ljust(16," "),node["UPDATECOUNTER"],info)
  255. self.__tick += 1
  256. self.__nodes += [node]
  257. for node in self.__nodes:
  258. print("Node: ")
  259. for k,v in node.items():
  260. print(" -",[k,v])
  261. print("")
  262. finally:
  263. #print("release lock")
  264. self.__lock.release()
  265. def tick(self):
  266. self.__lock.acquire()
  267. x = self.__tick
  268. self.__lock.release()
  269. return x
  270. return random.randint(0,1000)
  271. def get(self):
  272. self.__lock.acquire()
  273. out = []
  274. #out = {}
  275. if self.__nodes:
  276. out = copy.deepcopy(self.__nodes)
  277. #for node in self.__nodes:
  278. # out[node["MAC"]] = node
  279. self.__lock.release()
  280. return out
  281. def recive(self):
  282. print("-- NODE READ LOOP START ---")
  283. print()
  284. while is_running:
  285. data, addr = sock.recvfrom(300)
  286. new_node = ArtNet_decode_pollreplay( data )
  287. #print("rvc loop",addr)
  288. if new_node:
  289. #print("rcv 333",new_node)
  290. self.add(new_node)
  291. time.sleep(0.001)
  292. print("-- NODE READ LOOP END ---")
  293. print()
  294. def loop(self):
  295. thread.start_new_thread(self.recive, () )
  296. Reciver = ArtNetNodes
  297. def ArtNet_decode_pollreplay(data):
  298. debug = 0
  299. node = {}
  300. if len(data) >= 10: #min opcode
  301. opcode = data[8:9+1]
  302. #print([opcode])
  303. #if opcode != struct.pack("<H",0x5000): #OpPollReplay
  304. if opcode == struct.pack("<H",0x2100): #OpPollReplay
  305. if len(data) >= 207: #Mal
  306. #if debug:print("-----------------------------------------")
  307. print("===================================================================-")
  308. print("decode",data[:13])
  309. if debug:print([opcode] ,"OpPollReplay")
  310. _ip = []
  311. #print("data[10]",data[10])
  312. _ip.append( data[10] )
  313. _ip.append( data[11] )
  314. _ip.append( data[12] )
  315. _ip.append( data[13] )
  316. node["IP"] = str(_ip)
  317. if debug:print([_ip])
  318. _port = struct.unpack("<H",data[14:15+1] )
  319. #Versinfo = struct.unpack("<H",data[16:17+1] )
  320. Versinfo = data[16:17+1]
  321. node["port"] = _port
  322. if debug:print("_port :", [_port ])
  323. node["version"] = Versinfo
  324. if debug:print("Version:",[Versinfo])
  325. NetSwitch = data[18]
  326. node["NetSwitch"] = NetSwitch
  327. if debug:print("NetSwitch:",[NetSwitch])
  328. SubSwitch = data[19]
  329. node["SubSwitch"] = SubSwitch
  330. if debug:print("SubSwitch:",[SubSwitch])
  331. #oem = struct.unpack("<H",data[19:20+1] )
  332. oem = data[20:21+1]
  333. node["oem"] = oem
  334. if debug:print("oem",[oem])
  335. ubea = data[22]
  336. node["ubea"] = ubea
  337. if debug:print("ubea ver.",[ubea])
  338. stat = data[23]
  339. node["status"] = stat
  340. if debug:print("Status1 ",[stat])
  341. esta = data[24:25+1]
  342. node["esta"] = esta
  343. if debug:print("esta Manuf",[esta])
  344. sname = data[26:26+17]
  345. #if debug:print(len(sname) #17+1)
  346. sname = sname.strip(b"\x00")
  347. node["sname"] = sname
  348. lname = data[44:44+43]
  349. #if debug:print(len(lname) #43+1)
  350. lname = lname.strip(b"\x00")
  351. node["lname"] = lname
  352. NodeReport = data[108:108+20]
  353. NodeReport = NodeReport.strip(b"\x00")
  354. #if debug:print("Node",node_nr,addr)
  355. if debug:print("43r:",[sname,lname,NodeReport])
  356. NumPort = data[173]
  357. node["NumPort"] = NumPort
  358. if debug:print("NumPort",[NumPort])
  359. PortTypes = data[174:174+4]
  360. node["PortTypes"] = PortTypes
  361. if debug:print("PortTypes",[PortTypes])
  362. GoodInput = data[178:178+4]
  363. node["GoodInput"] = GoodInput
  364. if debug:print("GoodInput",[GoodInput])
  365. GoodOutput = data[182:182+4]
  366. node["GoodOutput"] = GoodOutput
  367. if debug:print("GoodOutput",[GoodOutput])
  368. SwIn = data[186:186+4]
  369. node["SwIn"] = SwIn
  370. if debug:print("SwIn",[SwIn])
  371. SwOut = data[190:190+4]
  372. node["SwOut"] = SwOut
  373. if debug:print("SwOut",[SwOut])
  374. msg = data[108:108+40]
  375. node["MSG"] = msg.replace(b"\x00",b"")#.decode(errors="ignore")
  376. if debug:print("MSG",[msg])
  377. MAC = data[201:201+6]
  378. _MAC = []
  379. for x in MAC:
  380. #x = hex(ord(x))[2:]
  381. x = hex(x)[2:]
  382. x = x.rjust(2,"0")
  383. _MAC.append(x)
  384. #hex(ord("\xf9"))[2:]
  385. if debug:print("MAC",[":".join(_MAC)])
  386. node["MAC"] = ":".join(_MAC)
  387. #node_nr += 1
  388. #if debug:print([addr,data])
  389. #print()
  390. for k,v in node.items():
  391. if type(node[k]) is bytes:
  392. node[k] = v.decode(errors="ignore")
  393. else:
  394. print(opcode, len(data))
  395. return node
  396. def ArtAddress(ip="192.168.0.99" ,ShortName="ShortName", LongName="LongName",Port="",Universes=0,raw=0):
  397. node_nr = 1
  398. #send port
  399. port = 7600
  400. port = 6454
  401. print( ip)
  402. data = [] # [struct.pack('<B', 0)]*150
  403. header = []
  404. # Name, 7byte + 0x00
  405. header.append(b"Art-Net\x00")
  406. # OpCode ArtDMX -> 0x6000, Low Byte first
  407. header.append(struct.pack('<H', 0x6000))
  408. # Protocol Version 14, High Byte first
  409. header.append(struct.pack('>H', 14))
  410. data = header[:]
  411. # NetSwitch
  412. data.append(struct.pack('<B',128)) # no change 0x7f
  413. data.append(struct.pack('<B', 0)) # filler
  414. #Short Name
  415. sname = ShortName[:17]
  416. sname = sname.ljust(18,"\x00")
  417. data.append( sname )
  418. lname = LongName[:63]
  419. lname = lname.ljust(64,"\x00")
  420. #lname = lname[:-2]+"X\x00"
  421. data.append( lname )
  422. print( "len sname:lname",len(sname),len(lname))
  423. #SwIn 4; Port-Adress
  424. # univers 0-f == \x80 - \x8f
  425. i = 4
  426. i=int(Universes)+1 #random.randint(0,99)
  427. data.append(struct.pack('<B', 127+i))
  428. data.append(struct.pack('<B', 127+i))
  429. data.append(struct.pack('<B', 127+i))
  430. data.append(struct.pack('<B', 127+i))
  431. #SwOut 4; Port-Adress
  432. data.append(struct.pack('<B', 127+i))
  433. data.append(struct.pack('<B', 127+i))
  434. data.append(struct.pack('<B', 127+i))
  435. data.append(struct.pack('<B', 127+i))
  436. #SubSwitch comination with Swin[] SwOut[]
  437. data.append(struct.pack('<B', 0)) # SubSwitch Write 128
  438. data.append(struct.pack('<B', 255))
  439. data.append(struct.pack('<B', 0))
  440. data.append(struct.pack('<B', 0))
  441. #data.append("\xf4")
  442. #print( ["ArtAdress SEND:",data,(ip,port)] )
  443. data2 = b""
  444. for d in data:
  445. #print(d,type(d))
  446. if type(d) is str:
  447. data2+=bytes(d,"utf-8")
  448. elif type(d) is bytes:
  449. data2+=d
  450. else:
  451. data2+=bytes(str(d),"ascii")
  452. print(data2)
  453. if raw:
  454. return data2,(ip,port)
  455. sock.sendto(data2 ,(ip,port))
  456. def set_ip4(cur_ip=(2,0,0,91),new_ip=(2,0,0,201),new_netmask=(255,0,0,0)):
  457. #send ip
  458. port = 7600
  459. #print(ip)
  460. data = []
  461. #New ip
  462. #_ip = [192, 168, 2, 91]
  463. _ip = [ 2, 0, 0, 181] # CLASS C NET
  464. _ip = [ 2, 0, 0, 101] # CLASS C NET
  465. #_ip = [192, 168, 0, 91]
  466. _ip = new_ip
  467. print("NEW NODE _ip:", _ip)
  468. data.append(struct.pack('<B', _ip[0]))
  469. data.append(struct.pack('<B', _ip[1]))
  470. data.append(struct.pack('<B', _ip[2]))
  471. data.append(struct.pack('<B', _ip[3]))
  472. #_ip = [255, 255, 255, 255] # cange all nodes in Network to the same _ip ! DANGER !
  473. #_ip = [002, 000, 000, 255] # cange all nodes in subnet to the same _ip ! DANGER !
  474. _ip = [ 2, 0, 0, 199] # CLASS A NET
  475. _ip = [192, 168, 0, 91]
  476. #_ip = [ 2, 0, 0, 191] # CLASS C NET
  477. _ip = cur_ip
  478. print("OLD NODE _ip:", _ip)
  479. #OLD _ip , Target Node to change
  480. data.append(struct.pack('<B', _ip[0]))
  481. data.append(struct.pack('<B', _ip[1]))
  482. data.append(struct.pack('<B', _ip[2]))
  483. data.append(struct.pack('<B', _ip[3]))
  484. ip = ".".join(str(x) for x in _ip)
  485. #print("send to ip:", ip)
  486. # NETMASK
  487. MASK = []
  488. netmask = [255, 255, 255 , 0] #fast CLASS C funktioniert
  489. #netmask = [255, 0, 0 , 0] #CLASS C funkioniert nicht
  490. netmask = new_netmask
  491. print("NEW NODE net:",netmask)
  492. MASK.append(struct.pack('<B', netmask[0]))
  493. MASK.append(struct.pack('<B', netmask[1]))
  494. MASK.append(struct.pack('<B', netmask[2]))
  495. MASK.append(struct.pack('<B', netmask[3]))
  496. data += MASK
  497. data += [struct.pack('<B', 255)]*11
  498. print("------------------------------")
  499. data = b'CMD IP '+ b"".join(data)
  500. print("SENDING TO ",(ip,port))
  501. print([data]) #, cur_ip=(2,0,0,91))
  502. #sock.sendto(data ,(ip,port))
  503. sock.sendto(data ,(ip,port))
  504. def send_cmd(ip=(2,0,0,91),cmd=""):
  505. node_nr = 1
  506. port = 7600
  507. print(ip)
  508. data = []
  509. _ip = [ 2, 0, 0, 91] # CLASS C NET
  510. print("NEW NODE _ip:", _ip)
  511. data.append(struct.pack('<B', _ip[0]))
  512. data.append(struct.pack('<B', _ip[1]))
  513. data.append(struct.pack('<B', _ip[2]))
  514. data.append(struct.pack('<B', _ip[3]))
  515. #_ip = [255, 255, 255, 255] # cange all nodes in Network to the same _ip ! DANGER !
  516. #_ip = [002, 000, 000, 255] # cange all nodes in subnet to the same _ip ! DANGER !
  517. _ip = [ 2, 0, 0, 199] # CLASS A NET
  518. _ip = [ 2, 0, 0, 91] # CLASS A NET
  519. #_ip = [192, 168, 0, 91]
  520. _ip = [ 2, 0, 0, 255] # CLASS C NET
  521. #_ip = [ 2, 255, 255, 255] # CLASS C NET
  522. print("OLD NODE _ip:", _ip)
  523. #OLD _ip , Target Node to change
  524. data.append(struct.pack('<B', _ip[0]))
  525. data.append(struct.pack('<B', _ip[1]))
  526. data.append(struct.pack('<B', _ip[2]))
  527. data.append(struct.pack('<B', _ip[3]))
  528. ip = ".".join(str(x) for x in ip)
  529. print("send to ip:", ip)
  530. # NETMASK
  531. MASK = []
  532. netmask = [255, 255, 255 , 0] #fast CLASS C funktioniert
  533. netmask = [255, 0, 0 , 0] #CLASS C funkioniert nicht
  534. print("NEW NODE net:",netmask)
  535. MASK.append(struct.pack('<B', netmask[0]))
  536. MASK.append(struct.pack('<B', netmask[1]))
  537. MASK.append(struct.pack('<B', netmask[2]))
  538. MASK.append(struct.pack('<B', netmask[3]))
  539. data += MASK
  540. data += [struct.pack('<B', 255)]*11
  541. print("------------------------------")
  542. data = 'CMD '+cmd+' '+ "".join(data)
  543. print("SENDING TO ",(ip,port))
  544. print([data] )
  545. #sock.sendto(data ,(ip,port))
  546. sock.sendto(data ,(ip,port))
  547. def pack_ip(_ip):
  548. data = [b"\x00",b"\x00", b"\x00", b"\x00"]
  549. if _ip:
  550. data[0] = struct.pack('<B', int(_ip[0]))
  551. data[1] = struct.pack('<B', int(_ip[1]))
  552. data[2] = struct.pack('<B', int(_ip[2]))
  553. data[3] = struct.pack('<B', int(_ip[3]))
  554. return data
  555. def send_node_cmd(ip="",ip2="",cmd=""):
  556. print()
  557. port = 7600
  558. data = []
  559. print("send_node_cmd",ip,ip2,cmd,port)
  560. data = pack_ip(ip[:])
  561. print("ip",ip,ip2)
  562. if len(ip2) == 4:
  563. ip = ip2
  564. if len(ip) == 4:
  565. ip = ".".join(map(str,ip))
  566. print("send to ip:", ip)
  567. data2=""
  568. if not cmd:
  569. data2 = 'CMD GT'
  570. data2 = 'CMD ST'
  571. data2 = 'DMX OUT STORE'
  572. data2 = 'CMD DMX=IN '
  573. data2 = 'CMD DMX=OUT '
  574. data2 = 'CMD DMX=PIN '
  575. if type(cmd) == bytes:
  576. data2 = cmd
  577. else:
  578. data2 = bytes(str(cmd),"ascii",errors="ignore")
  579. print([data2],type(data2) )
  580. data2 = data2.ljust(20,b" ") + b"".join(data)
  581. print("SENDING COMMAND TO ",[data2],(ip,port))
  582. sock.sendto(data2 ,(ip,port))
  583. node_cmd_buf_list = []
  584. def node_cmd_recive():
  585. global node_cmd_buf_list
  586. #sock.sendto('\x00\x00\x00\x00\x00',(ip,port)) # ArtPol / ping
  587. is_running = 1
  588. while is_running:
  589. data, addr = sock_cmd.recvfrom(5000)
  590. #print(len(data))
  591. #print([addr,data])
  592. if len(data) == 207:
  593. print()
  594. else:
  595. print("NODE CMD RESPONSE:", [addr,data])
  596. node_cmd_buf_list = [addr,data]
  597. #print([data])
  598. pass
  599. time.sleep(0.05)
  600. #send_node_cmd(ip="",cmd="CMD DMX=IN")
  601. #send_node_cmd(ip="",cmd="CMD DMX=OUT")
  602. #send_node_cmd(ip=(2,0,0,91),cmd="CMD DMX=PIN")
  603. #send_node_cmd(ip=(2,0,0,91),cmd="DMX OUT STORE")
  604. #send_node_cmd(ip=(2,0,0,255),cmd="DMX OUT STORE")
  605. #send_node_cmd(ip=(2,0,0,201),cmd="DMX OUT STORE")
  606. #send_node_cmd(ip=(2,0,0,255),ip2=(2,255,255,255),cmd="DMX OUT STORE")
  607. #send_node_cmd(ip=(2,0,0,201),ip2=(2,255,255,255),cmd="DMX OUT STORE")
  608. #send_node_cmd(ip=(2,0,0,255),ip2=(2,0,0,201),cmd="DMX OUT STORE")
  609. #send_node_cmd(ip=(2,0,0,201),ip2=(2,0,0,201),cmd="DMX OUT STORE")
  610. #send_node_cmd(ip=(2,0,0,201),ip2=(255,255,255,255),cmd="DMX OUT STORE")
  611. #send_node_cmd(ip=(255,255,255,255),ip2=(255,255,255,255),cmd="DMX OUT STORE")
  612. #exit()
  613. #
  614. node_list2 = []
  615. if __name__ == "__main__":
  616. thread.start_new_thread(node_cmd_recive, () )
  617. #send_node_cmd(ip=(2,0,0,91),cmd="DMX OUT STORE")
  618. send_node_cmd(ip=(2,255,255,255),cmd="CMD GT ")
  619. rx = ArtNetNodes()
  620. rx.loop()
  621. z = 0
  622. while 1:
  623. nodes = rx.get()
  624. #print(len(nodes))
  625. node_list2.extend(nodes)
  626. print(node_list2)
  627. if z % 10 == 0:
  628. print()
  629. pass
  630. print("node count",len(nodes),rx.tick(),2 )
  631. #for i in nodes:
  632. #print(i)
  633. z += 1
  634. time.sleep(0.2)
  635. print()
  636. print("time out")
  637. raw_input("ENDE")