# -*- coding: utf-8 -*- """ Valid-License-Identifier: GPL-2.0-only SPDX-URL: https://spdx.org/licenses/GPL-2.0-only.html (c) 2012 micha@librelight.de """ import time import socket, struct import sys import os import _thread as thread import copy import random import traceback sys.stdout.write("\x1b]2;Nodescan\x07") def UDP_Socket(bind=False,ip='',port=6454): sock = False try: sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) if bind: sock.bind((ip, port)) except socket.error as e: print("Socket 6454 ", "ERR: {0} ".format(e.args)) sock = False return sock def ArtPoll(sock=None,ip="2.255.255.255",port=6454): print("ArtPoll",ip,port) if not sock: sock=UDP_Socket() #port=6454 #ip="2.255.255.255" PKG=b'Art-Net\x00\x00 \x00\x0e\x06\x00' print("SEND:",[PKG]) sock.sendto(PKG,(ip,port)) # ArtPol / ping sock.close() def convert_mac(MAC): #MAC = data[201:201+6] _MAC = [] for x in MAC: #x = hex(ord(x))[2:] x = hex(x)[2:] x = x.rjust(2,"0") _MAC.append(x) _MAC = ":".join(_MAC) return _MAC def convert_bin(d): return bin(d)[2:].rjust(8,"0") def convert_ip(d): IP="[0,0,0,0]" _ip = [] try: _ip.append( d[0] ) _ip.append( d[1] ) _ip.append( d[2] ) _ip.append( d[3] ) IP = str(_ip) except:pass return IP def convert_to_hex(x,d): out = b"" try: a = struct.unpack(x, d)[0] #out = hex(a) out = "{0:#0{1}x}".format(a,6) except: pass return out def ArtNet_decode_pollreplay(data): debug = 0 node = {} if len(data) < 10: #min opcode return node opcode=convert_to_hex("H',"oem":'>H',"esta":" 0x2100, Low Byte first content.append(struct.pack('H', 200)) # Net and subnet of this node net = 0 subnet = 0 content.append(chr(net)) content.append(chr(subnet)) # OEM Code (E:Cue 1x DMX Out) content.append(struct.pack('>H', 0x0360)) # UBEA Version -> Nope -> 0 content.append(chr(0)) # Status1 content.append(struct.pack('>H', 0b11010000)) # Manufacture ESTA Code content.append(chr(0)) hostname=os.popen("hostname").read().strip() # Short Name, len == 30 content.append(hostname.ljust(18,"\x00")[:30]) # Long Name, len == 64 content.append(("LibreLight "+hostname).ljust(64,"\x00")[:64] ) content2=[] for c in content: if type(c) is not bytes: c= bytes(c,"ascii") content2.append(c) content = b''.join(content2) fill = 240-len(content)-1 print() if fill > 0: content = content + b"\x00"*fill def inject(i,v,content): content = content[:i]+ v + content[i+1:] return content def create_ip(IP,content): #CONF["IP"] = [10,14+1] x=[] j=10 for i in IP.split("."): i = 33 _ip = struct.pack("B",int(i)) # content = content[:10+j]+ _ip + content[10+j:] content = inject(j,_ip,content) j+=1 x.append([_ip,i]) print(IP,x) #CONF["MAC"] = [201,201+6] content = inject(201,b"\xfa",content) content = inject(201+1,b"\xfa",content) content = inject(201+2,b"\xfa",content) content = inject(201+3,b"\xfa",content) content = inject(201+4,b"\xfa",content) content = inject(201+5,b"\xfa",content) #CONF["oem"] = [20,21+1] content = inject(20,b"\x11",content) content = inject(20+1,b"\x10",content) content = inject(100,b"\x11",content) print() IP="2.0.0.255" create_ip(IP,content) sock.sendto(content, (IP, port)) IP="10.10.10.255" content = [0]*(282-42) # new PKG content[0:0] = b"Art-Net\x00" content[8:9+1] = b"\x00\x21" # Protocol 0x2100 content[10:13+1] = b"\xaa\xaa\xaa\xaa" # IP content[20:21+1] = b"\x11\x10" # oem content[26] = ord("A") # SHORT NAME content[26+18] = ord("B") #0x42 # LONG NAME content[108:108] = b"HalloX" #0x42 # MSG 26+18+64 print("send" ,[content]) j=0 content2 = content[:] for i in IP.split("."): content2[10+j] = int(i) j+=1 content2 = bytes(content2) #create_ip(IP,content) sock.sendto(content2, (IP, port)) print("send" ,[content]) IP="192.168.2.255" j=0 content2 = content[:] for i in IP.split("."): content2[10+j] = int(i) j+=1 #create_ip(IP,content) content2 = bytes(content2) sock.sendto(content2, (IP, port)) IP="2.0.0.255" j=0 content2 = content[:] for i in IP.split("."): content2[10+j] = int(i) j+=1 #create_ip(IP,content) content2 = bytes(content2) sock.sendto(content2, (IP, port)) print("send" ,[content2]) #print(dir(sock),sock.getsockname()) def main(): print("start main()") sock = UDP_Socket(bind=True,ip='',port=6454) print("-- loop --") while sock: data, addr = sock.recvfrom(300) opcode="" if len(data) >= 10: opcode=convert_to_hex("