sábado, 8 de setembro de 2012

BM&FBOVESPA - UMDF and Python

 import socket  
 import struct  
 import sys  
   
 from threading import Thread  
 from Queue import Queue  
   
 class UmdfStream:  
      def __init__(self, grp, port):  
           self.grp = grp  
           self.port = port  
           self.q = Queue()  
           self.t = Thread(target=self.worker)  
           self.t.daemon = True  
           self.buff = ''  
           self.t.start()  
   
      def connect( self ):  
           sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)  
           sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)  
           sock.bind(('', self.port))  
           mreq = struct.pack("4sl", socket.inet_aton(self.grp), socket.INADDR_ANY)  
           sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)  
           while True:  
                 self.q.put( sock.recv(1500) )  
   
      def worker( self ):  
           needmore = False  
           while True:  
                if needmore:  
                     data = self.q.get()  
                     self.q.task_done()  
                     needmore = False  
   
                if self.buff == '':  
                     data = self.q.get()  
                     pkt_size = len( data )  
                     if pkt_size < 10:  
                          self.buff += data  
                     else:  
                          hdr_seq_num = struct.unpack('!i', data[0:4])[0]  
                          hdr_num_chucks = struct.unpack('!h', data[4:6])[0]  
                          hdr_cur_chuck = struct.unpack('!h', data[6:8])[0]  
   
                          print 'decoding msg seq:', hdr_seq_num, ' chuck: ', hdr_cur_chuck, '/', hdr_num_chucks  
   
                     self.q.task_done()  
   
   
   
 if __name__ == '__main__':  
      if len(sys.argv) < 3:  
           print 'Usage:', sys.argv[0], ' multicast ip, port'  
           sys.exit(1)  
   
      stream = UmdfStream( sys.argv[1], int(sys.argv[2]) )  
      stream.connect()  
   
Para usar: python umdf.py 233.252.8.57 10007 ( para ver as mensagens do canal de indice futuro chegando ) Este pedaço de codigo, auxilia identificar rapidamente se o sinal UMDF esta chegando ate a maquina ;)