graph.py 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. import os
  2. import sys
  3. import fcntl #socket control
  4. import socket
  5. import time
  6. from optparse import OptionParser
  7. parser = OptionParser()
  8. parser.add_option("-r", "--recive", dest="recive",
  9. help="set recive ip like --recive 10.")
  10. parser.add_option("-s", "--sendto", dest="sendto",
  11. help="set sender ip like --sendto 2.255.255.255")
  12. parser.add_option("-t", "--test", dest="testuniv",
  13. help="set test univers like --test [0-16]")
  14. parser.add_option("", "--inmap", dest="inmap",
  15. help="set test univers like --test [0-16]")
  16. #parser.add_option("-q", "--quiet",
  17. # action="store_false", dest="verbose", default=True,
  18. # help="don't print status messages to stdout")
  19. (options, args) = parser.parse_args()
  20. print("option",options)
  21. print(options.sendto)
  22. from collections import OrderedDict
  23. def unpack_art_dmx(data):
  24. dmx = []
  25. for i in range(len(data[18:]) ):
  26. x=data[18+i]
  27. #print("x",x)
  28. #print( "data",b'!B', data[18+i])
  29. #x=struct.unpack( b'!B',data[18+i])
  30. #print( "data",b'!B', data[18+i],x)
  31. #x=x[0]
  32. dmx += [x]
  33. return dmx
  34. import struct
  35. class Socket():
  36. def __init__(self,bind='',port=6454):
  37. self.__port =port
  38. self.__bind =bind
  39. self.__poll = 0
  40. self.__data = []
  41. self.__addr = "NONE"
  42. self.head = [-1]*18 # /255 # /512 # * 512
  43. self.open()
  44. self._head_error = 0
  45. def open(self):
  46. try:
  47. print("connecting to ArtNet bind:",self.__bind,"Port",self.__port)
  48. self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
  49. self.sock.bind((self.__bind, self.__port))
  50. fcntl.fcntl(self.sock, fcntl.F_SETFL, os.O_NONBLOCK)
  51. #self.sock.setblocking(0)
  52. except socket.error as e:
  53. print("Socket ",self.__bind,self.__port, "ERR: {0} ".format(e.args))
  54. #raw_input()
  55. #sys.exit()
  56. def __del__(self):
  57. print( self,"head_error",self._head_error)
  58. def poll(self):
  59. if not self.__poll:
  60. try:
  61. self.__data, self.__addr = self.sock.recvfrom(self.__port)
  62. data, addr = (self.__data,self.__addr)
  63. self.host = addr[0]
  64. head = data[:18]
  65. rawdmx = data[18:]
  66. #print([head],addr)
  67. self.univ = -1
  68. #print( struct.unpack("B",head) )
  69. #print(type(head),[head],len(head))
  70. if len(head) != 18:
  71. self._head_error += 1
  72. return 0
  73. self.head = struct.unpack("!8sHBBBBHBB" , head )
  74. #try:
  75. # self.head = struct.unpack("!8sHBBBBHBB" , head )
  76. #except Exception as e:
  77. # pass#print( "======E09823" , e)
  78. univ = self.head[6]/255 # /512 # * 512
  79. self.univ = int(univ)
  80. #print(univ)
  81. if self.host.startswith("127."): #allways recive localhost on port
  82. self.__poll = 1
  83. return 1
  84. elif not options.recive:
  85. self.__poll = 1
  86. return 1
  87. elif self.host.startswith(options.recive):
  88. self.__poll = 1
  89. return 1
  90. else:
  91. self.__poll = 0
  92. except socket.timeout as e:
  93. err = e.args[0]
  94. if err == 'timed out':
  95. sleep(1)
  96. print('recv timed out, retry later')
  97. else:
  98. print(e)
  99. except socket.error as e:
  100. pass
  101. def recive(self):
  102. if self.__poll:
  103. self.__poll = 0
  104. data, addr = (self.__data,self.__addr)
  105. #print( self.univ,self.head)
  106. self.dmx = unpack_art_dmx(data)
  107. return { "host":self.host,"dmx":self.dmx,"univ":self.univ,"head":self.head,"data":data,"addr":addr}
  108. if __name__ == "__main__":
  109. x = Socket()
  110. print(x)
  111. sstamp = time.time()
  112. xstamp = 0
  113. xxstamp = 0
  114. while 1:
  115. if x.poll():
  116. estamp = time.time()
  117. xstamp = estamp-sstamp
  118. xstamp = int(xstamp*10000)
  119. r=x.recive()
  120. #print( r["host"])
  121. #print(r.keys(),r["addr"],r["univ"],r["head"])
  122. flag=0
  123. #if "2.0.0.14" == r["host"] and r["univ"] == 7:flag=1
  124. #if "2.0.0.1" == r["host"] and r["univ"] == 0:flag=1
  125. if r["host"].startswith("2.0.0.") and r["univ"] == 0:flag=1
  126. #if r["host"].startswith("10.0.25.") :flag=1# and r["univ"] != 0:flag=1 #:flag=1
  127. if flag:
  128. string = ""
  129. string += "{: 6}".format(xstamp)
  130. string += "{: 6}".format(int(xstamp-xxstamp))
  131. string += "{}".format(r["host"].rjust(12) )
  132. string += "{: 6}".format(r["univ"])
  133. string += "{:}".format(str(r["dmx"][200:221]))
  134. #print("{: 6} {: 10} {} {} {}".format(xstamp,int(xstamp-xxstamp),r["host"].ljust(" ",10),r["univ"], r["dmx"][200:221] ) )
  135. print(string)
  136. xxstamp=xstamp
  137. time.sleep(0.001)