def __init__(self, port=9001): self.__setPort(port) if self.debug: print 'Creating socket for receiving' # Create the socket for receiving self.sock_receive = MulticastSocket(InetSocketAddress("0", port)) self.sock_receive.joinGroup(InetAddress.getByName(MCAST_IP)) self.sock_receive.setTimeToLive(2) self.sock_receive.setSoTimeout(0) #self.sock_receive.sock_impl.jsocket = jmultisock if self.debug: print 'Socket created, bound to ', port if self.debug: print 'Joining multicast group' if self.debug: print 'Init finished' print '' thread.start_new_thread(self.receiver, ())
class Receiver: callbacks = dict() __data = Data() SERVER_ADDRESS = () debug = True def __init__(self, port=9001): self.__setPort(port) if self.debug: print 'Creating socket for receiving' # Create the socket for receiving self.sock_receive = MulticastSocket(InetSocketAddress("0", port)) self.sock_receive.joinGroup(InetAddress.getByName(MCAST_IP)) self.sock_receive.setTimeToLive(2) self.sock_receive.setSoTimeout(0) #self.sock_receive.sock_impl.jsocket = jmultisock if self.debug: print 'Socket created, bound to ', port if self.debug: print 'Joining multicast group' if self.debug: print 'Init finished' print '' thread.start_new_thread(self.receiver, ()) def __setPort(self, port): if self.debug: print 'Setting receive port to ', port self.SERVER_ADDRESS = ('', port) def receiver(self): buf = " " * 1024; pack = DatagramPacket(buf, len(buf)); while True: try: if self.debug: print "Waiting for data" self.sock_receive.receive(pack); if self.debug: print "Got ", pack.getData().tostring().strip() self.parse(pack.getData().tostring()) except: pass def addCallback(self, tag, callbackFunction): self.callbacks.update({tag:callbackFunction}) if self.debug: print 'Added callback: ' + tag def removeCallback(self, tag): if self.debug: 'Removing callback: ' + tag return self.callbacks.pop(tag,False) def clearCallbacks(self): self.callbacks.clear() if self.debug: 'Clearing callbacks' def getData(self, whatData): if self.debug: print 'Getting ' + whatData + ' syncData' return getattr(self.__data, whatData) def parse(self, text): if self.debug: print 'Parsing' root = ET.XML(text) if root.tag == 'syncData': if self.debug: print 'Parsing syncData' for node in list(root): if self.debug: print 'Parsing syncData type: ' + node.tag nodeClass = Data() for dataNode in list(node): self.__addItem(nodeClass, dataNode) setattr(self.__data, node.tag, nodeClass) elif root.tag == 'asyncData': if self.debug: print 'Parsing asyncData' for node in list(root): tag = node.tag if self.debug: print 'Parsing asyncData: ' + tag if self.callbacks.has_key(tag): if self.debug: print 'Calling callback for packet: ' + node.tag if self.debug: print node.items() self.callbacks.get(tag)(**dict(node.items())) elif self.debug: print 'Callback not found for ' + node.tag def __addItem(self, root, node): if list(node) == []: if node.get('Type') == 'Integer': setattr(root, node.tag, int(node.text)) else: setattr(root, node.tag, node.text) else: newItem = Data() for subItem in list(node): self.__addItem(newItem, subItem) setattr(root, node.tag, newItem)