Пример #1
0
 def get_network_data(self, integrity=False):
     supervision_period = 0x2D0
     enrollment_sate = 1
     data = prutils.num_to_chars(self._long_id, 4, 0) + self._dev_type_code + \
         chr(self._short_id) + chr(enrollment_sate) # + prutils.num_to_chars(supervision_period, 2, 0)
     # data = prutils.str_l(data)
     log.write("network data = %s" % prutils.hexdump(data))
     if integrity:
         return prutils.crc_PGH_20(data)
     return data
Пример #2
0
    def get_application_data(self, fn_sniffer_wait, integrity=False):
        # use request to get configuration according to device type
        config_cache = {} 
        cur_seq = 0xff
        snum = 0xff
        data = ''
        for cfg in self._config_types:
            device_config_template = self._get_config_type(cfg)
            if device_config_template is None:
                log.write("Don't know how to get the 0x%04X device configuration" % cfg) 
                return None
            dpr_type = device_config_template[1]
            # log.write("ASK FOR dpr_type = %x" % dpr_type)
            if dpr_type in config_cache.keys():
                packet = config_cache[dpr_type]
            else:
                packet = self._Procedures.request_configuration_data(self._short_id, self._long_id, dpr_type)

                # filter out retransmittions
                while snum == cur_seq:
                    packet = fn_sniffer_wait(0x10)
                    if packet == False:
                        break
                    packet = packet[5:]  # dpr only
                    dprp = DPR_Packet(packet) 
                    snum = dprp.snum.value
                    if snum == 0xff:
                        break # special case

                cur_seq = snum
                if packet :
                    config_cache[dpr_type] = packet
                    self.send_response(0x07, dprp.snum.value)

            if packet:
                dprp = DPR_Packet(packet) 
                rcv_dpr_type = ord(packet[8])
                # if dpr_type != rcv_dpr_type:
                    # log.write("wrong TLDV:%d != %d" % (dpr_type, rcv_dpr_type))
                value_len_off = dprp.data_len.offset + 2
                value_len = ord(packet[value_len_off])
                # add config to cash
                # log.write("len = %d " % value_len)
                
                add = prutils.num_to_chars(cfg, 2, 0)
                # add +=  prutils.num_to_chars(cfg, 2, 0)
                # BF [07 05 01 00 01 00 08 20]
                if len(device_config_template) > 2 :
                    # extract the tldv parameter
                    offset = device_config_template[2][0]
                    size = device_config_template[2][1]
                    tldv_data = dprp.data[offset + 2: offset + size + 2]
                    # log.write("template:%s" % device_config_template)
                    # log.write("dpr data = %s" % prutils.hexdump(dprp.data))
                    # log.write("0x%X:%d extraction: %s" % (offset, size, prutils.hexdump(tldv_data)))
                    add += chr(len(tldv_data)) + tldv_data
                # log.write("TLDV:%s => %s" % (prutils.hexdump(packet[8:11]), prutils.hexdump(add)))
                else:
                    add += chr(value_len)
                    add += packet[value_len_off + 1: value_len_off + value_len + 1]

                data += add
                # data = chr(len(data)) + data
                time.sleep(0.3)
            else:
                return None
        log.write("application data = %s" % prutils.hexdump(data))
        if integrity == True:
            if len(self._config_types) != 0:
                data = prutils.crc_PGH_20(data)
            else:
                data = 0x0000
        return data