def discover(device=None): s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.settimeout(0.01) #10ms s.bind(('', 0)) s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) payload = struct.pack('>BBI',0x01,0x04,0x00000001) #Device Type Filter (tuner) payload += struct.pack('>BBI',0x02,0x04,0xFFFFFFFF) #Device ID Filter (any) header = struct.pack('>HH',0x0002,len(payload)) data = header + payload crc = crc32c.cksum(data) packet = data + struct.pack('>I',crc) print (' o-> Broadcast Packet({0})'.format(binascii.hexlify(packet))) responses = [] for attempt in (0,1): s.sendto(packet, ('<broadcast>', DEVICE_DISCOVERY_PORT)) end = time.time() + 0.25 #250ms while time.time() < end: try: message, address = s.recvfrom(8096) response = DiscoveryResponse(message,address) if (not device or device == response.device) and response.valid and not response in responses: responses.append(response) print ('<-o Response Packet({0})'.format(binascii.hexlify(message))) except (KeyboardInterrupt, SystemExit): raise except socket.timeout: pass except: traceback.print_exc() return responses
def createDevice(self, packet, address): try: header = packet[:4] data = packet[4:-4] chksum = packet[-4:] self.responseType, packetLength = struct.unpack('>HH', header) if not self.responseType == DISCOVER_RESPONSE: util.DEBUG_LOG('WRONG RESPONSE TYPE') return None if packetLength != len(data): util.DEBUG_LOG('BAD PACKET LENGTH') return None if chksum != struct.pack('>I', crc32c.cksum(header + data)): util.DEBUG_LOG('BAD CRC') return None except: traceback.print_exc() return None dataIO = StringIO.StringIO(data) tag, length = struct.unpack('>BB', dataIO.read(2)) deviceType = struct.unpack('>I', dataIO.read(length))[0] if deviceType == TUNER_DEVICE: return self.processData(TunerDevice(address), dataIO) elif deviceType == STORAGE_SERVER: return self.processData(StorageServer(address), dataIO) else: return self.processData(Device(address), dataIO)
def discover(self, device=None): import netif ifaces = netif.getInterfaces() sockets = [] for i in ifaces: if not i.broadcast: continue #if i.ip.startswith('127.'): continue s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.settimeout(0.01) #10ms s.bind((i.ip, 0)) s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) sockets.append((s, i)) payload = struct.pack('>BBI', 0x01, 0x04, 0xFFFFFFFF) #Device Type Filter (any) payload += struct.pack('>BBI', 0x02, 0x04, 0xFFFFFFFF) #Device ID Filter (any) header = struct.pack('>HH', 0x0002, len(payload)) data = header + payload crc = crc32c.cksum(data) packet = data + struct.pack('>I', crc) util.DEBUG_LOG(' o-> Broadcast Packet({0})'.format( binascii.hexlify(packet))) for attempt in (0, 1): for s, i in sockets: util.DEBUG_LOG(' o-> Broadcasting to {0}: {1}'.format( i.name, i.broadcast)) try: s.sendto(packet, (i.broadcast, DEVICE_DISCOVERY_PORT)) except: util.ERROR() end = time.time() + 0.25 #250ms while time.time() < end: for s, i in sockets: try: message, address = s.recvfrom(8096) added = self.add(message, address) if added: util.DEBUG_LOG( '<-o Response Packet[{0}]({1})'.format( i.name, binascii.hexlify(message))) elif added == False: util.DEBUG_LOG( '<-o Response Packet[{0}](Duplicate)'.format( i.name)) elif added == None: util.DEBUG_LOG( '<-o INVALID RESPONSE[{0}]({1})'.format( i.name, binascii.hexlify(message))) except socket.timeout: pass except: traceback.print_exc()
def processPacket(self,packet): try: header = packet[:4] self.responseType, packetLength = struct.unpack('>HH',header) if not self.responseType == DISCOVER_RESPONSE: print ('WRONG RESPONSE TYPE') return False data = packet[4:-4] chksum = packet[-4:] if packetLength != len(data): print ('BAD PACKET LENGTH') return False if chksum != struct.pack('>I',crc32c.cksum(header + data)): print ('BAD CRC') return False except: traceback.print_exc() return False self.processData(data) return True
def processPacket(self, packet): try: header = packet[:4] self.responseType, packetLength = struct.unpack('>HH', header) if not self.responseType == DISCOVER_RESPONSE: print('WRONG RESPONSE TYPE') return False data = packet[4:-4] chksum = packet[-4:] if packetLength != len(data): print('BAD PACKET LENGTH') return False if chksum != struct.pack('>I', crc32c.cksum(header + data)): print('BAD CRC') return False except: traceback.print_exc() return False self.processData(data) return True
def discover(device=None): s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.settimeout(0.01) #10ms s.bind(('', 0)) s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) payload = struct.pack('>BBI', 0x01, 0x04, 0x00000001) #Device Type Filter (tuner) payload += struct.pack('>BBI', 0x02, 0x04, 0xFFFFFFFF) #Device ID Filter (any) header = struct.pack('>HH', 0x0002, len(payload)) data = header + payload crc = crc32c.cksum(data) packet = data + struct.pack('>I', crc) print(' o-> Broadcast Packet({0})'.format(binascii.hexlify(packet))) responses = [] for attempt in (0, 1): s.sendto(packet, ('<broadcast>', DEVICE_DISCOVERY_PORT)) end = time.time() + 0.25 #250ms while time.time() < end: try: message, address = s.recvfrom(8096) response = DiscoveryResponse(message, address) if (not device or device == response.device ) and response.valid and not response in responses: responses.append(response) print('<-o Response Packet({0})'.format( binascii.hexlify(message))) except (KeyboardInterrupt, SystemExit): raise except socket.timeout: pass except: traceback.print_exc() return responses