Example #1
0
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
Example #2
0
    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)
Example #3
0
    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()
Example #4
0
    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
Example #5
0
    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
Example #6
0
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