Эх сурвалжийг харах

add: network namespaces, clear_loop, C-UDP example ...

micha 3 жил өмнө
parent
commit
5708f79405
10 өөрчлөгдсөн 419 нэмэгдсэн , 22 устгасан
  1. 90 20
      ArtNetProcessor.py
  2. BIN
      a.out
  3. 160 0
      graph.py
  4. 2 1
      map14_in_to0.sh
  5. 21 0
      netns.sh
  6. 18 0
      netns60.sh
  7. 80 0
      rcv.c
  8. 38 0
      rcv2.c
  9. 2 0
      start.sh
  10. 8 1
      start_ASP.sh

+ 90 - 20
ArtNetProcessor.py

@@ -93,9 +93,8 @@ class CursesDummy():
 
 
 
-class Manager():
+class Window():
     def __init__(self):
-
         self.myscreen = curses.initscr()
         #print( dir(self.myscreen))
         #print( self.myscreen.getmaxyx() ) 
@@ -103,6 +102,7 @@ class Manager():
         self.cmd = []
         if options.sendto:
             self.mode="ltp"
+            self.mode="stop"
         else:
             self.mode="dmx"
         self.sel_host=Pager()
@@ -112,7 +112,7 @@ class Manager():
         self.sel_mode=Pager()
         self.sel_mode.wrap=1
         if options.sendto:
-            self.sel_mode.data = ["ltp","dmx","mtx","main"] # mtx = matrix
+            self.sel_mode.data = ["stop","ltp","dmx","mtx","main"] # mtx = matrix
         else:
             self.sel_mode.data = ["dmx","main"] # mtx = matrix
         self.sel_mode.maxindex = len( self.sel_mode.data )-1
@@ -134,6 +134,9 @@ class Manager():
     def reinit(self):
         self.exit()
         print( "reinit",time.time())
+        self.myscreen = curses.initscr()
+        #time.sleep(5)
+        #self.__init()
         self.init()
         self.__reinit_time = time.time()
     def init(self):
@@ -214,6 +217,7 @@ class Manager():
         # input command buffer
         self.read()
         inp2=self.inp()
+        x=""
         if "q" == inp2:
             inp2=""
             self.exit()
@@ -221,22 +225,22 @@ class Manager():
         elif "?" == inp2:
             self.mode = "?"
         elif "," == inp2:
-            self.sel_mode.next()
+            x=self.sel_mode.next()
             inp2=""
         elif ";" == inp2:
-            self.sel_mode.prev()
+            x=self.sel_mode.prev()
             inp2=""
         elif "." == inp2:
-            self.sel_univ.next()
+            x=self.sel_univ.next()
             inp2=""
         elif ":" == inp2:
-            self.sel_univ.prev()
+            x=self.sel_univ.prev()
             inp2=""
         elif "-" == inp2:
-            self.sel_host.next()
+            x=self.sel_host.next()
             inp2=""
         elif "_" == inp2:
-            self.sel_host.prev()
+            x=self.sel_host.prev()
             inp2=""
         elif "#" == inp2:
             if "main" in self.sel_mode.data:
@@ -244,7 +248,9 @@ class Manager():
                 self.sel_mode.index = x
                 self.sel_mode.check()
             inp2=""
-
+        if x:
+             self.myscreen.addstr(0, 6,str(x) )
+        
         if inp2 == "\n":
             cmd2 = "".join( self.cmd).split()
             self.cmd=[]
@@ -285,10 +291,11 @@ class Manager():
         self.mode  = self.sel_mode.get()
 
         if time.time()-0.12 > self.ttime:
+            #if 1:
 
             lines = [ ]
             #print("cmd:",cmd)
-            lines.append(" host:"+ hostname +" CMD:" + "".join(self.cmd) )
+            lines.append(" host:"+ hostname +":"+netns+" CMD:" + "".join(self.cmd) )
             if self.mode=="help" or  self.mode=="?":
                 lines.append("HILFE[h]: " )
                 lines.append("MODE [m]: inp, in2 in1 " )
@@ -319,6 +326,8 @@ class Manager():
                         lines.append(str(self.ttime))
 
                 #screen.draw_lines(lines)
+            elif self.mode=="stop":
+                return 0
             elif self.mode=="mtx":
                 self.ttime = time.time()
                 dmx=self.ohost.get_mtx(host,univ=univ2)#univ=head_uni)
@@ -466,6 +475,7 @@ class UniversBuffer():
 
         self._next_frame(host)
 
+        #if len(dmxframe) <= 512: #len(dmxframe_old):
         if len(dmxframe) <= 512: #len(dmxframe_old):
             for i,v in enumerate(dmxframe):
                 if dmxframe[i] != dmxframe_old[i]:
@@ -505,8 +515,6 @@ class UniversBuffer():
         return dmx
     def get_mtx(self,host=""):
         return self.__universes_matrix
-
-
     def info(self):
         return self.__universes_info
     def hosts(self):
@@ -571,6 +579,11 @@ class HostBuffer():
 # ============================================================   
 import socket, struct
 hostname = socket.gethostname()
+netns = "none"
+x = os.popen("ip netns identify $$")
+xx = x.read()
+if xx:
+    netns = xx.strip()
 import fcntl  #socket control
 import errno
 def toPrintable(nonprintable):
@@ -602,7 +615,12 @@ class Socket():
         self.__poll = 0
         self.__data = []
         self.__addr = "NONE"
+        #self.__hosts = {"host":{"9":[0]*512}}
+        self.__hosts = {}
+        self.hosts = self.__hosts
         self.open()
+        self._poll_clean_time = time.time()
+        self._poll_clean_count = 0
     def open(self):
         try:
             print("connecting to ArtNet bind:",self.__bind,"Port",self.__port)
@@ -616,6 +634,29 @@ class Socket():
             print("Socket ",self.__bind,self.__port, "ERR: {0} ".format(e.args))
             #raw_input()
             #sys.exit()
+    def poll_clean(self):
+        if self._poll_clean_time+(1/25.) <= time.time():
+            self._poll_clean_time = time.time()
+            self._poll_clean()
+            x = self._poll_clean_count 
+            self._poll_clean_count = 0
+            return x
+    def _poll_clean(self):
+        while 1:
+            try:
+                self.__data, self.__addr = self.sock.recvfrom(self.__port)
+                self._poll_clean_count += 1
+                #return 1
+            except socket.timeout as e:
+                err = e.args[0]
+                if err == 'timed out':
+                    time.sleep(1)
+                    print('recv timed out, retry later')
+                else:
+                    print(e)
+                break
+            except socket.error as e:
+                break
     def poll(self):
         if not self.__poll:
             try:
@@ -646,11 +687,22 @@ class Socket():
                     return 1
                 else:
                     self.__poll = 0
+                
+                addr = str(addr)
+                univ = str(univ)
+                if self.__poll:
+                    if addr not in self.__hosts:
+                        self.__hosts[addr] = {}
+                    if univ not in self.__hosts[addr]:
+                        self.__hosts[addr][univ] = {}
+			
+                    self.__hosts[addr][univ] = {"head":head,"addr":addr,"univ":univ,"dmx":rawdmx}
+                    self.hosts = self.__hosts
 
             except socket.timeout as e:
                 err = e.args[0]
                 if err == 'timed out':
-                    sleep(1)
+                    time.sleep(1)
                     print('recv timed out, retry later')
                 else:
                     print(e)
@@ -795,9 +847,11 @@ class Pager(): #scroll thru list
     def next(self):
         self.index += 1
         self.check(flag=1)
+        return self.get()
     def prev(self):
         self.index -= 1
         self.check(flag=1)
+        return self.get()
     def check(self,flag=0):
         if flag:
             if self.maxindex and self.maxindex <= len(self.data):
@@ -829,7 +883,7 @@ class Main():
     def loop(self):
         ohost = HostBuffer()
         
-        screen=Manager()
+        screen=Window()
         screen.exit()
         screen.ohost = ohost
                 
@@ -840,16 +894,21 @@ class Main():
             artnet = ArtNetNode(univ=options.testuniv)
             artnet._test_frame()
 
-        ysocket = Socket(bind='127.0.0.1' ,port=6555)
+        #ysocket = Socket(bind='127.0.0.1' ,port=6555)
         xsocket = Socket()
 
         send_time = time.time()
+        xt = time.time()
         try:
+            screen.exit()
             while 1:
+                poll_flag = 0
                 if options.testuniv:
                     artnet._test_frame()
                 #artnet_out._test_frame()
                 if xsocket.poll():
+                    xt = time.time()
+                    poll_flag = 1
                     x = xsocket.recive()
                     if x["host"] == options.recive:
                         try:
@@ -857,7 +916,8 @@ class Main():
                         except TypeError:
                             pass
                     ohost.update(x["host"],x["univ"],x["dmx"])     
-                if ysocket.poll():
+                if 0:#ysocket.poll():
+                    poll_flag = 1
                     x = ysocket.recive()
                     if x["host"] == options.recive:
                         try:
@@ -869,7 +929,11 @@ class Main():
                 screen.sel_univ.data = ohost.univs()
                 screen.sel_host.data = ohost.hosts()
 
+                #if x:
+                #     #screen.exit()
+                #     print( "poll_clean",x)
                 if send_time +(1/30.) < time.time() and options.sendto:
+                    x= xsocket.poll_clean()
 
                     send_time = time.time()
                     #x=ohost.get(univ=univ2)
@@ -892,11 +956,17 @@ class Main():
                         #    print( str(univ)+" " + json.dumps([j,""]) )
                         #    for k in info[i][j]:
                         #        print( str(univ)+ "   "+str(k).ljust(5," ")+": " + json.dumps( info[i][j][k]) )
-                screen.loop()
 
-                time.sleep(.001)
+                if not poll_flag: 
+                    time.sleep(.01)
+                else:
+                    pass
+                    #screen.exit()
+                    #print( int((time.time()-xt)*10000),poll_flag)
+                screen.loop()
         finally:
-            screen.exit()
+            pass
+            #screen.exit()
             #print(dir(curses))
 
 


+ 160 - 0
graph.py

@@ -0,0 +1,160 @@
+
+import os
+import sys
+import fcntl  #socket control
+import socket
+import time
+
+
+
+from optparse import OptionParser
+parser = OptionParser()
+parser.add_option("-r", "--recive", dest="recive",
+                  help="set recive ip like --recive 10.")
+parser.add_option("-s", "--sendto", dest="sendto",
+                  help="set sender ip like --sendto 2.255.255.255")
+parser.add_option("-t", "--test", dest="testuniv",
+                  help="set test univers like --test [0-16]")
+parser.add_option("", "--inmap", dest="inmap",
+                  help="set test univers like --test [0-16]")
+#parser.add_option("-q", "--quiet",
+#                  action="store_false", dest="verbose", default=True,
+#                  help="don't print status messages to stdout")
+
+(options, args) = parser.parse_args()
+print("option",options)
+print(options.sendto)
+
+
+from collections import OrderedDict
+
+def unpack_art_dmx(data):
+    dmx = []
+    for i in range(len(data[18:]) ):
+        x=data[18+i]
+        #print("x",x)
+        #print( "data",b'!B', data[18+i])
+        #x=struct.unpack( b'!B',data[18+i])
+        #print( "data",b'!B', data[18+i],x)
+        #x=x[0]
+        dmx += [x]
+    return dmx
+
+import struct
+class Socket():
+    def __init__(self,bind='',port=6454):
+        self.__port =port
+        self.__bind =bind
+        self.__poll = 0
+        self.__data = []
+        self.__addr = "NONE"
+        self.head = [-1]*18 # /255 # /512  # * 512
+        self.open()
+        self._head_error = 0
+    def open(self):
+        try:
+            print("connecting to ArtNet bind:",self.__bind,"Port",self.__port)
+            self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
+            
+            self.sock.bind((self.__bind, self.__port))
+            fcntl.fcntl(self.sock, fcntl.F_SETFL, os.O_NONBLOCK)
+            #self.sock.setblocking(0)
+            
+        except socket.error as e:
+            print("Socket ",self.__bind,self.__port, "ERR: {0} ".format(e.args))
+            #raw_input()
+            #sys.exit()
+    def __del__(self):
+        print( self,"head_error",self._head_error)
+    def poll(self):
+        if not self.__poll:
+            try:
+                self.__data, self.__addr = self.sock.recvfrom(self.__port)
+
+
+                data, addr = (self.__data,self.__addr)
+                self.host = addr[0]
+                head    = data[:18]
+                rawdmx  = data[18:]
+                #print([head],addr)
+                self.univ = -1
+                #print( struct.unpack("B",head) )
+                #print(type(head),[head],len(head))
+                if len(head) != 18:
+                    self._head_error += 1
+                    return 0
+                self.head = struct.unpack("!8sHBBBBHBB" , head )
+                #try:
+                #    self.head = struct.unpack("!8sHBBBBHBB" , head )
+                #except Exception as e:
+                #    pass#print( "======E09823" , e)
+                univ = self.head[6]/255 # /512  # * 512
+                self.univ = int(univ)
+                #print(univ)
+
+                if self.host.startswith("127."): #allways recive localhost on port 
+                    self.__poll = 1
+                    return 1
+                elif not options.recive:
+                    self.__poll = 1
+                    return 1
+                elif self.host.startswith(options.recive): 
+                    self.__poll = 1
+                    return 1
+                else:
+                    self.__poll = 0
+
+            except socket.timeout as e:
+                err = e.args[0]
+                if err == 'timed out':
+                    sleep(1)
+                    print('recv timed out, retry later')
+                else:
+                    print(e)
+            except socket.error as e:
+                pass
+    
+    def recive(self):
+        if self.__poll:
+            self.__poll = 0
+
+            data, addr = (self.__data,self.__addr)
+            #print( self.univ,self.head)
+
+            self.dmx  = unpack_art_dmx(data)
+
+            return { "host":self.host,"dmx":self.dmx,"univ":self.univ,"head":self.head,"data":data,"addr":addr}
+        
+
+if __name__ == "__main__":
+    x = Socket()
+    print(x)
+    sstamp = time.time()
+    xstamp = 0
+    xxstamp = 0
+    while 1:
+        if x.poll():
+            estamp = time.time()
+            xstamp = estamp-sstamp
+            xstamp = int(xstamp*10000)
+            r=x.recive()
+            #print( r["host"])
+            #print(r.keys(),r["addr"],r["univ"],r["head"])
+            flag=0
+            #if "2.0.0.14" == r["host"] and r["univ"] == 7:flag=1 
+            #if "2.0.0.1"   == r["host"] and r["univ"] == 0:flag=1
+            if r["host"].startswith("2.0.0.") and r["univ"] == 0:flag=1
+            #if r["host"].startswith("10.0.25.") :flag=1# and r["univ"] != 0:flag=1 #:flag=1
+
+            if flag:
+                string = ""
+                string += "{: 6}".format(xstamp)
+                string += "{: 6}".format(int(xstamp-xxstamp))
+                string += "{}".format(r["host"].rjust(12) )
+                string += "{: 6}".format(r["univ"])
+                string += "{:}".format(str(r["dmx"][200:221]))
+                #print("{: 6} {: 10} {} {} {}".format(xstamp,int(xstamp-xxstamp),r["host"].ljust(" ",10),r["univ"], r["dmx"][200:221] ) )
+                print(string)
+            xxstamp=xstamp
+        time.sleep(0.001)
+

+ 2 - 1
map14_in_to0.sh

@@ -1 +1,2 @@
-python3 ArtNetProcessor.py -s 10.10.10.255 -r 2.0.0.14 --inmap 0
+netns=$(ip netns identify $$)
+python3 ArtNetProcessor.py -s 10.10.10.255 -r 2.0.0.14 --inmap 1 netns=$netns

+ 21 - 0
netns.sh

@@ -0,0 +1,21 @@
+nr="2$1"
+echo $1
+#exit 
+ip netns del "blue$nr"
+ip l del veth0$nr
+
+ip netns add "blue$nr"
+ip netns list
+#ip link add veth0$nr type veth peer name veth1$nr
+ip link add veth0$nr type veth peer name veth1$nr netns "blue$nr"
+ip link set dev veth0$nr up
+ip netns exec "blue$nr" ip link set dev veth1$nr up
+ip link set veth0$nr master br0
+ip link list
+#ip link set veth1$nr netns "blue$nr"
+
+ip netns exec "blue$nr" ip addr add 10.10.10.$nr/24 dev veth1$nr
+ip netns exec "blue$nr" ip addr add 10.0.25.$nr/24 dev veth1$nr
+ip netns exec "blue$nr" ip addr add 2.0.0.$nr/8 dev veth1$nr:1
+#ip netns exec "blue$nr" 'su - user' 
+ip netns exec "blue$nr" su - user

+ 18 - 0
netns60.sh

@@ -0,0 +1,18 @@
+nr="60"
+ip netns del "blue$nr"
+ip l del veth0$nr
+
+ip netns add "blue$nr"
+ip netns list
+#ip link add veth0$nr type veth peer name veth1$nr
+ip link add veth0$nr type veth peer name veth1$nr netns "blue$nr"
+ip link set dev veth0$nr up
+ip netns exec "blue$nr" ip link set dev veth1$nr up
+ip link set veth0$nr master br0
+ip link list
+#ip link set veth1$nr netns "blue$nr"
+
+ip netns exec "blue$nr" ip addr add 10.10.10.$nr/24 dev veth1$nr
+ip netns exec "blue$nr" ip addr add 2.0.0.$nr/8 dev veth1$nr:1
+#ip netns exec "blue$nr" 'su - user' 
+ip netns exec "blue$nr" su - user

+ 80 - 0
rcv.c

@@ -0,0 +1,80 @@
+/************* UDP CLIENT CODE *******************/
+
+#include <stdio.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <string.h>
+
+#define STR(num) #num
+
+int main(){
+  int clientSocket, portNum, nBytes;
+  char buffer[1024];
+  struct sockaddr_in serverAddr;
+  socklen_t addr_size;
+
+  /*Create UDP socket*/
+  clientSocket = socket(PF_INET, SOCK_DGRAM, 6454);
+
+  /*Configure settings in address struct*/
+  //serverAddr.sin_family = AF_INET;
+  //serverAddr.sin_port = htons(7891);
+  //serverAddr.sin_port = htons(6454);
+  //serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
+  //serverAddr.sin_addr.s_addr = inet_addr("2.0.0.1");
+  //memset(serverAddr.sin_zero, '\0', sizeof serverAddr.sin_zero);  
+
+  /*Initialize size variable to be used later on*/
+  //addr_size = sizeof serverAddr;
+
+  while(1){
+    //printf("Type a sentence to send to server:\n");
+    //fgets(buffer,1024,stdin);
+    //printf("You typed: %s",buffer);
+
+    nBytes = strlen(buffer) + 1;
+    
+    /*Send message to server*/
+    //sendto(clientSocket,buffer,nBytes,0,(struct sockaddr *)&serverAddr,addr_size);
+
+    /*Receive message from server*/
+    //nBytes = recvfrom(clientSocket,buffer,1024,0,NULL, NULL);
+    nBytes = recvfrom(clientSocket,buffer,512,0,NULL, NULL);
+    //printf(": %s\n",nBytes);
+    
+    /*
+    printf(": %s\n",(&buffer));
+    
+    int i = atoi(buffer);
+    printf("%d\n", i);
+
+    int ii;
+    sscanf(buffer, "%d", &ii);
+    */
+
+    //# printf("%s\n", buffer);
+    printf(STR(buffer)": ");
+    for (int i = 0; i < 512; ++i) {
+       //printf("%c, ", buffer[i]);
+        //printf("%u, ", buffer[i]);
+        //if( i > 500 & i < 512 ){
+        printf("%i, ", buffer[i]);
+	//}
+    }
+    printf("\b\b\n");
+  
+  /*
+  unsigned int x = 0x76543210;
+  char *c = (char*) &x;
+ 
+  printf ("*c is: 0x%x\n", *c);
+  if (*c == 0x10){
+    printf ("Underlying architecture is little endian. \n");
+  }else{
+    printf ("Underlying architecture is big endian. \n");
+  }
+  */
+  }
+
+  return 0;
+}

+ 38 - 0
rcv2.c

@@ -0,0 +1,38 @@
+/************* UDP CLIENT CODE *******************/
+
+#include <stdio.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <string.h>
+#include <unistd.h>
+
+#define STR(num) #num
+
+int main(){
+  int clientSocket, portNum, nBytes;
+  char buffer[530];
+  //unsigned short  buffer[512];
+  struct sockaddr_in serverAddr;
+  socklen_t addr_size;
+
+  /*Create UDP socket*/
+  clientSocket = socket(AF_INET, SOCK_DGRAM, 6454);
+
+  while(1){
+    nBytes = recvfrom(clientSocket,buffer,530,0,NULL, NULL);
+
+    printf(STR(buffer)": \n");
+    unsigned int value = 0;
+    int c = 0;
+    
+    for (int i = 0; i < 530; ++i) {
+        c |= ((0xff & value) << 24);
+        value = buffer[i];
+        printf("%02X", (char)value);
+  
+    }
+    printf("\b\b\n");
+
+  }
+  return 0;
+}

+ 2 - 0
start.sh

@@ -0,0 +1,2 @@
+netns=$(ip netns identify $$)
+python3 ArtNetProcessor.py netns=$netns

+ 8 - 1
start_ASP.sh

@@ -1,3 +1,10 @@
 echo "sleep 5"
 #sleep 5
-python3 /home/pi/ASP/ArtNetProcessor.py --recive 10. --sendto 2.255.255.255
+netns=$(ip netns identify $$)
+
+
+python3 /home/pi/ASP/ArtNetProcessor.py --recive 10. --sendto 2.255.255.255 netns=$netns
+if [ $? != 0 ]; then
+     python3 /home/user/ASP/ArtNetProcessor.py --recive 10. --sendto 2.255.255.255 netns=$netns
+  
+fi