Esempio n. 1
0
 def get(dev_eui):
     """
     :param dev_eui: bytes
     :return:
     """
     Assertions.a_eui(dev_eui)
     info = db0.hgetall(ConstDB0.dev + hexlify(dev_eui).decode())
     Logger.info(info)
     try:
         addr = info[b'addr']
         app_eui = info[b'app_eui']
         nwkskey = info[b'nwkskey']
         appskey = info.get(b'appskey', b'')
         fcnt_up = int(info[b'fcnt_up'])
         fcnt_down = int(info[b'fcnt_down'])
         dev_class = ClassType(info[b'dev_class'].decode())
         adr = bool(int(info[b'adr']))
         check_fcnt = bool(int(info[b'check_fcnt']))
         return Device(dev_eui=dev_eui,
                       addr=addr,
                       app_eui=app_eui,
                       nwkskey=nwkskey,
                       appskey=appskey,
                       fcnt_up=fcnt_up,
                       fcnt_down=fcnt_down,
                       dev_class=dev_class,
                       adr=adr,
                       check_fcnt=check_fcnt)
     except Exception as error:
         Logger.error(action=Action.object,
                      type=IDType.device,
                      id=hexlify(dev_eui).decode(),
                      msg='Get Device ERROR: %s' % error)
Esempio n. 2
0
class RequestHandler(object):
    def __init__(self):
        self.logger = Logger().get_logger()

    def get(self, url, **kwargs):
        try:
            params = kwargs.get('params')
            headers = kwargs.get('headers')
            rsp = requests.get(url, params=params, headers=headers)
            time_consuming = rsp.elapsed.microseconds / 1000
            self.logger.info('请求耗时: %s ms' % (time_consuming))
            return rsp
        except Exception as e:
            self.logger.error('Get 请求 %s 错误: %s' % (url, e))

    def post(self, url, **kwargs):
        try:
            params = kwargs.get('params')
            data = kwargs.get('data')
            r_json = kwargs.get('json')
            headers = kwargs.get('headers')
            self.logger.info(f"请求地址: {url}")
            rsp = requests.post(url,
                                params=params,
                                data=data,
                                json=r_json,
                                headers=headers)
            time_consuming = rsp.elapsed.microseconds / 1000
            self.logger.info('请求耗时: %s ms' % (time_consuming))
            return rsp
        except Exception as e:
            self.logger.error('Post 请求 %s 错误: %s' % (url, e))
Esempio n. 3
0
 def get(self, gateway_id):
     reslut = None
     payload = {
         'key': self.REQUEST_KEY,
         'location': self.location_param,
         'output': 'JSON'
     }
     try:
         response = requests.get(self.REQUEST_URL,
                                 params=payload,
                                 timeout=self.TIMEOUT)
         if response.status_code == requests.codes.ok:
             response_data = response.json()
             if response_data['status'] == '1':
                 self.normal_req(response_data, gateway_id)
                 code = response_data['regeocode']['addressComponent'][
                     'adcode']
                 reslut = code
             else:
                 self.abnormal_req(response_data, gateway_id)
         else:
             Logger.warning(Action.get, 'Code API',
                            response.status_code, response.content)
     except requests.exceptions.Timeout as e:
         Logger.error(Action.get, 'Code API', '', 'ERROR: %s' % str(e))
     # except ValueError as e:
     #     print('ERROR: %s' % str(e))
     finally:
         return reslut
Esempio n. 4
0
def mic_verify(data, nwkskey, addr, fcnt, mic):
    """
    :param data: bytes
    :param nwkskey: bytes
    :param addr: int
    :param dir: Const.DIR_UP or Const.DIR_DOWN
    :param fcnt: tuple
    :param mic: bytes
    :return:
    """
    len_fcnt = len(fcnt)
    if len_fcnt == 1:
        mic_compute = LoRaCrypto.compute_mic(data, nwkskey, addr, Const.DIR_UP, fcnt[0])
        if mic_compute == mic:
            return fcnt[0]
        else:
            Logger.error(action=Action.mic, msg='fcnt:%s, data:%s, nwkskey:%s, addr:%s, dir_up:%s, mic_compute:%s, mic:%s' % (fcnt[0],data,nwkskey,addr,Const.DIR_UP, mic_compute,mic))
            raise MICError()
    elif len_fcnt == 2:
        mic_compute = LoRaCrypto.compute_mic(data, nwkskey, addr, Const.DIR_UP, fcnt[0])
        if mic_compute == mic:
            return fcnt[0]
        else:
            mic_compute = LoRaCrypto.compute_mic(data, nwkskey, addr, Const.DIR_UP, fcnt[1])
            if mic_compute == mic:
                return fcnt[1]
            else:
                Logger.error(action=Action.mic, msg='fcnt:%s, data:%s, nwkskey:%s, addr:%s, dir_up:%s, mic_compute:%s, mic:%s' % (fcnt[1],data,nwkskey,addr,Const.DIR_UP, mic_compute,mic))
                raise MICError()
    else:
        raise AssertionError('mic_verify Error')
Esempio n. 5
0
def analyze_mac_cmd_ans(device, mac_cmd):
    """
    :param mac_fhdr_fopts: bytes
    :return:dict
    """
    while len(mac_cmd) != 0:
        cid = mac_cmd[0]
        try:
            if 128 <= cid <= 255:
                Logger.info(action=Action.mac_cmd_get,
                            type=IDType.device,
                            id=hexlify(device.dev_eui).decode(),
                            msg='Proprietary MAC CMD:% cid' % cid)
                return
            cmd_payload_len = MACConst.mac_cmd_up_len[cid]
            cmd_payload = mac_cmd[1:cmd_payload_len + 1]
            mac_cmd = mac_cmd[cmd_payload_len + 1:]
            cid_switch(device, cid, cmd_payload)
        except KeyError as error:
            Logger.error(action=Action.mac_cmd_get,
                         type=IDType.device,
                         id=hexlify(device.dev_eui).decode(),
                         msg='ERROR: %s' % error)
            return
        except AssertionError as error:
            Logger.error(action=Action.mac_cmd_get,
                         type=IDType.device,
                         id=hexlify(device.dev_eui).decode(),
                         msg='ERROR: %s' % error)
            return
Esempio n. 6
0
def write_join_accept_data(dev_eui, data):
    join_device = JoiningDev.objects.get(dev_eui)
    if join_device:
        mac_addr_list = JoinDevGateway.list_mac_addr_by_score(dev_eui)
        for mac_addr in mac_addr_list:
            gateway = Gateway.objects.get(mac_addr)
            trans_params = JoinTransParams.objects.get(dev_eui,
                                                       gateway.mac_addr)
            pull_info = PullInfo.objects.get_pull_info(gateway.mac_addr)
            if len(trans_params) > 0 and pull_info is not None:
                txpk = pack_join_accept_data(trans_params, data,
                                             join_device.app.freq_plan)
                json_data = {'txpk': txpk}
                prot_ver = bytes([pull_info.prot_ver])
                packet = prot_ver + get_random_token(
                ) + Const.PULL_RESP_IDENTIFIER
                packet = packet + json.dumps(json_data).encode()
                msg_dn = OTAAMsgDn(app_eui=join_device.app.app_eui,
                                   dev_eui=join_device.dev_eui,
                                   trans_params=txpk,
                                   ts=time.time())
                msg_dn.publish()
                return packet, pull_info
    else:
        Logger.error(action=Action.otaa,
                     type=IDType.device,
                     id=dev_eui,
                     msg='JoiningDev does not exists')
Esempio n. 7
0
def base64_decode(data):
    missing_padding = 4 - len(data) % 4
    if missing_padding:
        data += '=' * missing_padding
    try:
        return a2b_base64(data)
    except binascii.Error:
        Logger.error(action=Action.rxpk, msg='Invalid base64 string: %s' % data)
        return None
Esempio n. 8
0
 def set_value(self, **kwargs):
     pipe = db0.pipeline()
     for name, value in kwargs.items():
         if name in DevInfo.fields:
             pipe.hset(self.key, name, value)
         else:
             Logger.error(action=Action.mac_cmd_get,
                          type=IDType.dev_info,
                          id=hexlify(self.dev_eui).decode(),
                          msg='DevInfo set_value unknow name:' % name)
             return
     pipe.execute()
Esempio n. 9
0
 def stat_rssi_snr(self, g_id=None, start_ts=0, end_ts=-1):
     info = []
     if end_ts == -1:
         end_ts = float('inf')
     if g_id is not None:
         g_id = hexlify(g_id).decode()
     cursor = 0
     while True:
         result = db15.scan(cursor=cursor,
                            match=ConstDB15.M + self.dev_eui + ':*')
         cursor = result[0]
         m_key_list = result[1]
         for m_key in m_key_list:
             try:
                 ts = int(m_key.decode().split(':')[2])
                 if start_ts < ts < end_ts:
                     lng, lat, alt = db15.hmget(m_key,
                                                ['lng', 'lat', 'alt'])
                     if g_id:
                         one = db15.hmget(
                             ConstDB15.G + self.dev_eui + ':' + g_id + ':' +
                             str(ts), ['rssi', 'lsnr'])
                         rssi = float(one[0])
                         lsnr = float(one[1])
                     else:
                         g_key_list = db2.zrevrange(
                             '%s%s:%s' %
                             (ConstDB2.up_gw_s, self.dev_eui, ts), 0, 0)
                         # pipe = db15.pipeline()
                         # for g_key in g_key_list:
                         #     pipe.hmget(g_key, ['rssi', 'lsnr'])
                         # hh = pipe.execute()
                         # best = max(hh, key=lambda x: float(x[0]))
                         # lsnr = float(best[1])
                         # rssi = float(best[0])
                         g_key = g_key_list[0].decode()
                         best = db15.hmget(
                             '%s%s:%s:%s' %
                             (ConstDB15.G, self.dev_eui, g_key, ts),
                             ['rssi', 'lsnr'])
                         rssi, lsnr = float(best[0]), float(best[1])
                     info.append({
                         'lng': float(lng),
                         'lat': float(lat),
                         'alt': float(alt),
                         'rssi': rssi,
                         'lsnr': lsnr
                     })
             except Exception as error:
                 Logger.error('LoRaMote: %s' % error)
         if cursor == 0:
             break
     return info
Esempio n. 10
0
 def get_pull_info(cls, mac_addr):
     key = ConstDB0.gateway_pull + hexlify(mac_addr).decode()
     info = db0.hgetall(key)
     try:
         ip_addr = PullInfo.ip_addr_str_to_tuple(
             info[b'ip_addr'].decode())
         prot_ver = int(info[b'prot_ver'])
         return PullInfo(mac_addr, ip_addr, prot_ver)
     except Exception as error:
         Logger.error(action=Action.object,
                      type=IDType.pull_info,
                      id=key,
                      msg=str(error))
Esempio n. 11
0
 def p_to_c(self, *args):
     pipe = db0.pipeline()
     for arg in args:
         value = db0.hget(self.key, 'p_' + arg)
         if value is not None:
             pipe.hset(self.key, arg, value)
             pipe.hdel(self.key, 'p_' + arg)
         else:
             Logger.error(action=Action.mac_cmd_send,
                          type=IDType.dev_info,
                          id=hexlify(self.dev_eui).decode(),
                          msg='No P value can be set to C: %s' % arg)
             return
     pipe.execute()
Esempio n. 12
0
 def get(mac_addr):
     info = db0.hmget(ConstDB0.gateway + hexlify(mac_addr).decode(),
                      Gateway.fields)
     try:
         user_id = int(info[0])
         freq_plan = FrequencyPlan(info[1].decode())
         public = bool(int(info[2]))
         disable = bool(int(info[3]))
         return Gateway(mac_addr, user_id, freq_plan, public, disable)
     except Exception as error:
         Logger.error(action=Action.object,
                      type=IDType.gateway,
                      id=hexlify(mac_addr).decode(),
                      msg='Get Gateway ERROR: %s' % error)
         return None
Esempio n. 13
0
def pack_down_data(trans_parms, data, rx_window, device):
    FREQ_PLAN = frequency_plan[device.app.freq_plan]
    tx_params = device.get_tx_params()
    s_time = 0
    txpk = {}
    txpk['rfch'] = FREQ_PLAN.RF_CH
    txpk['powe'] = 14
    txpk['modu'] = trans_parms['modu']
    if txpk['modu'] == 'LORA':
        txpk['codr'] = trans_parms['codr']
        txpk['ipol'] = True     # rossi support
    # elif txpk['modu'] == 'FSK':
    #     txpk['fdev'] = 3000
    txpk['prea'] = 8
    txpk['size'] = len(data)
    txpk['data'] = b2a_base64(data).decode().rstrip('\n')
    # txpk['ncrc'] = False
    if device.dev_class == ClassType.b:
        b_info = BTiming(ConstDB0.dev + hexlify(device.dev_eui).decode(), time.time())
        s_time = b_info.ping_time()
        txpk['time'] = datetime.utcfromtimestamp(s_time).isoformat() + 'Z'
        txpk['freq'] = FREQ_PLAN.b_freq()
        txpk['datr'] = FREQ_PLAN.DataRate(b_info.datr).name
    elif rx_window == 1:
        datr = FREQ_PLAN.DataRate[trans_parms['datr']]
        txpk['datr'] = FREQ_PLAN.rx1_datr(datr.value, tx_params['RX1DRoffset']).name
        txpk['freq'] = FREQ_PLAN.rx1_freq(float(trans_parms['freq']))
        txpk['tmst'] = int(trans_parms['tmst']) + tx_params['RxDelay'] * 1000000  # 1us step upadd;
        try:
            ts = iso_to_utc_ts(trans_parms['time'])
            s_time = ts + tx_params['RxDelay']
        except Exception as error:
            Logger.error(action=Action.downlink, type=IDType.device, id=device.dev_eui, msg=str(error))
    elif rx_window == 2:
        datr = FREQ_PLAN.DataRate(tx_params['RX2DataRate'])
        txpk['datr'] = datr.name
        txpk['freq'] = tx_params['RX2Frequency']
        if device.dev_class == ClassType.c:
            txpk['imme'] = True
            s_time = time.time()
        elif device.dev_class == ClassType.a:
            txpk['tmst'] = int(trans_parms['tmst']) + (tx_params['RxDelay'] + 1) * 1000000
            try:
                ts = iso_to_utc_ts(trans_parms['time'])
                s_time = ts + tx_params['RxDelay'] + 1
            except Exception as error:
                Logger.error(action=Action.downlink, type=IDType.device, id=device.dev_eui, msg=str(error))
    return txpk, s_time
Esempio n. 14
0
    def _iterate(strat_file_name, coin, tf_ind: str = '15m'):
        try:
            strat_class = utils.import_file('strategy',
                                            strat_file_name + '.py')
            # Create a cerebro entity
            # cerebro = bt.Cerebro(cheat_on_open=True)
            cerebro = bt.Cerebro()

            logger = Logger(logging.INFO, sys.stdout)
            # Add a strategy
            # cerebro.addstrategy(LiveBBStrategy, is_live=False)
            cerebro.addstrategy(strat_class, is_live=False)

            # Create a Data Feed
            dump = Dump('binance', coin)
            df = dump.get_data(tf_ind, hist_days)
            data = bt.feeds.PandasData(dataname=df)
            cerebro.adddata(data)

            df = dump.get_data('1m', hist_days)
            data = bt.feeds.PandasData(dataname=df)
            cerebro.adddata(data)
            # cerebro.resampledata(data, timeframe=bt.TimeFrame.Minutes, compression=tf_ind)

            # Set our desired cash start
            cerebro.broker.setcash(1000.0)

            # Add a FixedSize sizer according to the stake
            cerebro.addsizer(bt.sizers.PercentSizer, percents=95)

            # Set the commission
            cerebro.broker.setcommission(commission=0.001)

            # cerebro.addobserver(bt.observers.DrawDown)
            # Print out the starting conditions
            # print('Starting Portfolio Value: %.2f' % cerebro.broker.getvalue())

            # Run over everything
            strat = cerebro.run(maxcpus=1)

            res = int(strat[0].broker.getvalue())
            ret = (res, '%s, tf_ind=%s' % (coin, tf_ind))
            print(ret)
            return ret
        except Exception as e:
            logger.error(e)
            print(e)
            return (0, str(e))
Esempio n. 15
0
 def _run(self):
     result = write_join_accept_data(self.dev_eui, self.data)
     if not result:
         Logger.error(action=Action.otaa,
                      msg='No packet, pull_info return!!!')
         return
     packet = result[0]
     pull_info = result[1]
     if pull_info.prot_ver == 2:
         resend = ReSender(pull_info, packet, self.server)
         resend.start()
     self.server.sendto(packet, pull_info.ip_addr)
     Logger.info(action=Action.otaa,
                 type=IDType.ip_addr,
                 id='%s:%d' % pull_info.ip_addr,
                 msg='SENT JOIN ACCEPT %s' % packet)
Esempio n. 16
0
    def _iterate(*args):
        try:
            strat_file_name, coin, tf, kwargs = args
            # coin = args[1]
            # tf = args[2]
            strat_class = utils.import_file('strategy',
                                            strat_file_name + '.py')
            cerebro = bt.Cerebro()

            logger = Logger(logging.INFO, sys.stdout)
            kwargs['is_live'] = False
            cerebro.addstrategy(strat_class, **kwargs)

            # Create a Data Feed
            dump = Dump('binance', coin)
            df = dump.get_data(tf, hist_days)
            data = bt.feeds.PandasData(dataname=df)
            cerebro.adddata(data)

            df = dump.get_data('1m', hist_days)
            data = bt.feeds.PandasData(dataname=df)
            cerebro.adddata(data)

            # Set our desired cash start
            cerebro.broker.setcash(1000.0)

            # Add a FixedSize sizer according to the stake
            cerebro.addsizer(bt.sizers.PercentSizer, percents=95)

            # Set the commission
            cerebro.broker.setcommission(commission=0.001)

            # Run over everything
            strat = cerebro.run(maxcpus=1)

            res = int(strat[0].broker.getvalue())
            # ret = (res, '%s, coin=%s, tf=%s, stperiod=%s, mult=%s' % (res, coin, tf, kwargs['stperiod'], kwargs['mult']))
            ret = (res,
                   '%s, %s, %s' % (res, ', '.join(args[:-1]), str(kwargs)))
            print(ret)
            return ret
        except Exception as e:
            logger.error(e)
            print(e)
            return (0, str(e))
Esempio n. 17
0
def analyze_PingSlotFreqAns(device, cmd_payload):
    assert len(cmd_payload) == 1, "WRONG MAC CMD PAYLOAD OF PingSlotFreqAns"
    status = cmd_payload[0]
    ch_ack = status & 0b1
    dr_ack = status >> 1 & 0b1
    rfu = status >> 2
    if ch_ack & dr_ack == 1:
        Logger.info(action=Action.mac_cmd_get,
                    type=IDType.device,
                    id=hexlify(device.dev_eui).decode(),
                    msg='PingSlotFreqAns Success: %s, ch_ack: %s, dr_ack: %s' %
                    (cmd_payload, ch_ack, dr_ack))
    else:
        Logger.error(action=Action.mac_cmd_get,
                     type=IDType.device,
                     id=hexlify(device.dev_eui).decode(),
                     msg='PingSlotFreqAns Fqil: %s, ch_ack: %s, dr_ack: %s' %
                     (cmd_payload, ch_ack, dr_ack))
Esempio n. 18
0
def analyze_NewChannelAns(device, cmd_payload):
    assert len(cmd_payload) == 1, 'WRONG MAC CMD PAYLOAD OF NewChannelAns'
    # logger.info(ConstLog.mac_cmd+'analyze_NewChannelAns')
    status = cmd_payload[0]
    ch_ack = status & 0b1
    dr_ack = status >> 1 & 0b1
    rfu = status >> 2
    if ch_ack & dr_ack == 1:
        Logger.info(action=Action.mac_cmd_get,
                    type=IDType.device,
                    id=hexlify(device.dev_eui).decode(),
                    msg='DevStatusAns Success: %s, ch_ack: %d, dr_ack: %d' %
                    (cmd_payload, ch_ack, dr_ack))
    else:
        Logger.error(action=Action.mac_cmd_get,
                     type=IDType.device,
                     id=hexlify(device.dev_eui).decode(),
                     msg='DevStatusAns Fail: %s, ch_ack: %d, dr_ack: %d' %
                     (cmd_payload, ch_ack, dr_ack))
Esempio n. 19
0
class AssertSetIF(object):
    def __init__(self, project):
        self.project = project
        self.failList = []
        self.logger = Logger(self.project).get_logger()

    def assertIn(self, member, container, msg=''):
        try:
            if member in container:
                self.logger.info('测试通过: %s' % msg)
            else:
                raise AssertionError
        except Exception:
            expectedMsg = '预期结果: %s' % (member)
            failMsg = ('测试未通过: %s, %s' % (msg, expectedMsg))
            self.logger.error(failMsg)
            self.failList.append(failMsg)

    def assertEqual(self, par1, par2, msg=''):
        try:
            if par1 == par2:
                self.logger.info('测试通过: %s' % msg)
            else:
                raise AssertionError
        except Exception:
            expectedMsg = '预期结果: %s' % (par1)
            failMsg = ('测试未通过: %s, %s' % (msg, expectedMsg))
            self.logger.error(failMsg)
            self.failList.append(failMsg)

    def assertNotIn(self, member, container, msg=''):
        try:
            if member not in container:
                self.logger.info('测试通过: %s' % msg)
            else:
                raise AssertionError
        except Exception:
            expectedMsg = '预期结果: %s' % (member)
            failMsg = ('测试未通过: %s, %s' % (msg, expectedMsg))
            self.logger.error(failMsg)
            self.failList.append(failMsg)

    def assertNotEqual(self, par1, par2, msg=''):
        try:
            if par1 != par2:
                self.logger.info('测试通过: %s' % msg)
            else:
                raise AssertionError
        except Exception:
            expectedMsg = '预期结果: %s' % (par1)
            failMsg = ('测试未通过: %s, %s' % (msg, expectedMsg))
            self.logger.error(failMsg)
            self.failList.append(failMsg)
Esempio n. 20
0
    def _run(strat_file_name, coin, tf, kwargs):
        # def _run(*args):
        try:
            # strat_file_name, coin, tf, kwargs = args
            strat_class = utils.import_file('strategy',
                                            strat_file_name + '.py')
            cerebro = bt.Cerebro()

            logger = Logger(logging.INFO, sys.stdout)
            kwargs['is_live'] = False
            cerebro.addstrategy(strat_class, **kwargs)

            # Create a Data Feed
            dump = Dump('binance', coin)
            df = dump.get_data(tf, hist_days)
            data = bt.feeds.PandasData(dataname=df)
            cerebro.adddata(data)

            df = dump.get_data('1m', hist_days)
            data = bt.feeds.PandasData(dataname=df)
            # cerebro.adddata(data)

            # Set our desired cash start
            cerebro.broker.setcash(1000.0)

            # Add a FixedSize sizer according to the stake
            cerebro.addsizer(bt.sizers.PercentSizer, percents=95)

            # Set the commission
            cerebro.broker.setcommission(commission=0.001)

            # Run over everything
            strat = cerebro.run(maxcpus=1)

            # Print out the final result
            print('Final Portfolio Value: %.2f' % cerebro.broker.getvalue())

            # Plot the result
            cerebro.plot()
        except Exception as e:
            logger.error(e)
            print(e)
Esempio n. 21
0
 def obj_to_dict(self):
     dd = {
         FieldDevice.name: self.name,
         FieldDevice.dev_eui: hexlify(self.dev_eui).decode(),
         FieldDevice.app_eui: hexlify(self.app_eui).decode(),
         FieldDevice.active_mode: self.active_mode.value,
         'freq_plan': self.app.freq_plan.value,
     }
     if self.join_device:
         dd[FieldDevice.appkey] = hexlify(self.join_device.appkey).decode()
     if self.active_at:
         dd[FieldDevice.active_at] = self.active_at.isoformat()
         dd[FieldDevice.addr] = hexlify(self.addr).decode()
         dd[FieldDevice.nwkskey] = hexlify(self.nwkskey).decode()
         dd[FieldDevice.appskey] = hexlify(self.appskey).decode()
         dd[FieldDevice.fcnt_up] = self.fcnt_up
         dd[FieldDevice.fcnt_down] = self.fcnt_down
         dd[FieldDevice.dev_class] = self.dev_class.value
         if self.dev_class == ClassType.b:
             dd[FieldDevice.datr] = self.datr
             dd[FieldDevice.periodicity] = self.periodicity
         dd[FieldDevice.adr] = self.adr
         dd[FieldDevice.check_fcnt] = self.check_fcnt
         dd['que_down'] = self.que_down.len()
         last_up_link = getattr(
             self.trans_status, 's_time',
             getattr(self.trans_status, 'time',
                     None)) if self.trans_status else 'No Connection'
         if last_up_link == '':
             Logger.error(action=Action.get,
                          resource=Resource.trans_params,
                          id=self.dev_eui,
                          msg=str(self.trans_params))
         dd['last_up_link'] = last_up_link
         dd[FieldInfo.MaxDutyCycle] = self.MaxDutyCycle
         dd[FieldInfo.RX1DRoffset] = self.RX1DRoffset
         dd[FieldInfo.RX2DataRate] = self.RX2DataRate
         dd[FieldInfo.RX2Frequency] = self.RX2Frequency
         dd[FieldInfo.RxDelay] = self.RxDelay
         dd[FieldInfo.battery] = self.battery
         dd[FieldInfo.snr] = self.snr
     return dd
Esempio n. 22
0
def adr_base_on_pk_stg(device):
    mac_addr = Gateway.objects.best_mac_addr(device.dev_eui)
    if mac_addr is None:
        Logger.error(action=Action.adr,
                     type=IDType.device,
                     id=hexlify(device.dev_eui).decode(),
                     msg="Gateway.objects.best_mac_addr return None")
        return
    tran_params = TransParams.objects.get(device.dev_eui, mac_addr)
    pk_stg = float(tran_params['rssi']) + float(tran_params['lsnr']) * 0.25
    FREQ_PLAN = frequency_plan[device.app.freq_plan]
    recent_datr = FREQ_PLAN.DataRate[tran_params['datr']].value
    required_datr = FREQ_PLAN.adr_schema(pk_stg, recent_datr)
    if recent_datr < required_datr:
        shift_to(device.dev_eui, recent_datr + 1, FREQ_PLAN)
    elif recent_datr > required_datr:
        shift_to(device.dev_eui, recent_datr - 1, FREQ_PLAN)
    else:
        Logger.info(action=Action.adr,
                    type=IDType.device,
                    id=hexlify(device.dev_eui).decode(),
                    msg="do not need to shift")
Esempio n. 23
0
 def _run(self):
     self.ps.subscribe(CHANNEL_TX_ACK)
     try:
         for i in range(0, 3):
             start = time.time()
             while time.time() - start < 0.1:
                 sleep(0.05)
                 for item in self.ps.listen():
                     # item = self.ps.get_message(timeout=0.05)
                     Logger.debug(action=Action.resend,
                                  type=IDType.ip_addr,
                                  id=self.pull_info.ip_addr,
                                  msg='Get Publish TX, %s' % item)
                     if item is not None and item['data'] == self.token:
                         Logger.info(action=Action.resend,
                                     type=IDType.ip_addr,
                                     id=self.pull_info.ip_addr,
                                     msg='Get Publish TX, %s' % item)
                         self.ps.unsubscribe()
                         self.ps.close()
                         return
             self.server.sendto(self.packet, self.pull_info.ip_addr)
             Logger.error(action=Action.resend,
                          type=IDType.ip_addr,
                          id=self.pull_info.ip_addr,
                          msg='Resend data %s : %s' % (i, self.packet))
         Logger.error(
             action=Action.resend,
             type=IDType.gateway,
             id=self.pull_info.ip_addr,
             msg='No TX_ACK got, PULL_RESP may not received by gateway')
     except Exception as error:
         logger.error(str(error))
     finally:
         try:
             self.ps.unsubscribe()
             self.ps.close()
         except Exception as error:
             logger.error(str(error))
Esempio n. 24
0
def analyze_RXParamSetupAns(device, cmd_payload):
    assert len(cmd_payload) == 1, 'WRONG MAC CMD PAYLOAD OF RXParamSetupAns'
    status = cmd_payload[0]
    channel_ack = status & 0b1
    RX2DataRate_ack = status >> 1 & 0b1
    RX1DRoffset_ack = status >> 2 & 0b1
    rfu = status >> 3
    if channel_ack & RX1DRoffset_ack & RX2DataRate_ack == 1:
        Logger.info(action=Action.mac_cmd_get,
                    type=IDType.device,
                    id=hexlify(device.dev_eui).decode(),
                    msg='RXParamSetupAns Success: %s' % cmd_payload)
        DevInfo(device.dev_eui).p_to_c('RX1DRoffset', 'RX2DataRate',
                                       'RX2Frequency')
    else:
        Logger.error(
            action=Action.mac_cmd_get,
            type=IDType.device,
            id=hexlify(device.dev_eui).decode(),
            msg=
            'RXParamSetupAns Fail: %s, channel_ack: %d, RX1DRoffset_ack: %d, RX2DataRate_ack: %d'
            % (cmd_payload, channel_ack, RX1DRoffset_ack, RX2DataRate_ack))
Esempio n. 25
0
 def init_on_load(self):
     if self.active_at:
         info = db0.hgetall(ConstDB.dev + hexlify(self.dev_eui).decode())
         try:
             self.addr = info[b'addr']
             self.nwkskey = info[b'nwkskey']
             self.appskey = info.get(b'appskey', b'')
             self.fcnt_up = int(info[b'fcnt_up'])
             self.fcnt_down = int(info[b'fcnt_down'])
             self.dev_class = ClassType(info[b'dev_class'].decode())
             self.adr = bool(int(info[b'adr']))
             self.check_fcnt = bool(int(info[b'check_fcnt']))
             self.que_down = QueDownDev(self.dev_eui)
             self.trans_status = TransStatus.objects.best(self.dev_eui)
             self.__get_more_info()
             if self.dev_class == ClassType.b:
                 self.get_b_info()
         except (KeyError, TypeError) as error:
             Logger.error(action=Action.get,
                          resource=Resource.device,
                          id=self.dev_eui,
                          msg=str(error))
Esempio n. 26
0
def read_push_data(json_data, gateway, *args):
    if isinstance(json_data, dict):
        if 'rxpk' in json_data:
            for data_raw in json_data['rxpk']:
                gateway.frequency_statistics(data_raw['freq'])
                data = base64_decode(data_raw.pop('data'))
                if data is not None:
                    major = data[0] & 0b11
                    if major != 0:
                        Logger.error(action=Action.uplink, msg='ERROR: Major != 0, Major = %s' % major)
                        continue
                    mtype = data[0] >> 5
                    if mtype == MType.JOIN_REQUEST:
                        try:
                            otaa = OTAAJoin(request_msg=data, trans_params=data_raw, gateway=gateway)
                            otaa.start()
                        except Exception as error:
                            Logger.error(action=Action.otaa, msg='REQUEST: %s; ERROR: %s' % (data, error))
                    elif mtype == MType.UNCONFIRMED_DATA_UP or mtype == MType.CONFIRMED_DATA_UP:
                        dev_addr = endian_reverse(data[1:5])
                        device = Device.objects.get_device_by_addr(dev_addr)
                        if device is None:
                            Logger.error(action=Action.data_up, type=IDType.dev_addr, id=hexlify(dev_addr).decode(), msg='Can\'t Find Device for this DevAddr')
                            continue
                        if gateway.public is not True and device.app.user_id != gateway.user_id:
                            Logger.error(action=Action.data_up, msg='Gateway %s is not Public and device % s is not belong to the same user' % (gateway.mac_addr, device.dev_eui))
                            continue
                        ReadDataUp(device.dev_eui, gateway, data_raw, mtype, data, *args).start()
                    elif mtype == MType.PTY:
                        dev_addr == endian_reverse(data[1:5])
                        device = Device.objects.get_device_by_addr(dev_addr)
                        if device is None:
                            Logger.error(action=Action.proprietary, type=IDType.dev_addr, id=hexlify(dev_addr).decode(), msg='Can\'t Find Device for this DevAddr')
                        ReadPTY(dev_eui=device.dev_eui, gateway=gateway, trans_params=data_raw, mtype=mtype, data=data).start()
        if 'stat' in json_data:
            stat = json_data['stat']
            gateway_stat = GatewayStatus(gateway.mac_addr, stat['lati'], stat['long'], stat['alti'])
            gateway_stat.save()
Esempio n. 27
0
class ReadData(object):

    root_dir = os.path.abspath("test_data")

    def __init__(self, file_name):
        self.file_path = f"{self.root_dir}/{file_name}"
        self.logger = Logger().get_logger()

    def read_json(self):
        try:
            with open(self.file_path, encoding="utf-8") as file:
                json_data = json.loads(file.read())
            return json_data
        except Exception as e:
            self.logger.error(f"读取json文件错误: {e}")
    
    def read_excel(self):
        try:
            data = list()
            book = xlrd.open_workbook(self.file_path)
            sheet = book.sheet_by_index(0)
            rows = sheet.nrows
            cols = sheet.ncols
            # 第一行是标题, 从第二行读取
            for r in range(1, rows):
                row_data = list()
                for c in range(cols):
                    ctype = sheet.cell(r, c).ctype # 表格的数据类型
                    cell = sheet.cell_value(r, c)
                    if ctype == 2 and cell % 1 == 0: # 整型
                        cell = int(cell)
                    elif ctype == 3:
                        # 转成datetime对象
                        date = datetime(*xldate_as_tuple(cell, 0))
                        cell = date.strftime('%Y/%d/%m %H:%M:%S')
                    elif ctype == 4:
                        cell = True if cell == 1 else False
                    row_data.append(cell)
                data.append(row_data)
            return data
        except Exception as e:
            self.logger.error(f"读取excel错误: {e}")

    def read_csv(self):
        try:
            data = list()
            with open(self.file_path, "r") as file:
                reader = csv.reader(file)
                # 忽略第一行title
                next(reader)
                for item in reader:
                    data.append(item)
                return data
        except Exception as e:
            self.logger.error(f"读取csv错误: {e}")

    def read_ymal(self):
        return
Esempio n. 28
0
def analyze_LinkADRAns(device, cmd_payload):
    assert len(cmd_payload) == 1, 'WRONG MAC CMD PAYLOAD OF LinkADRAns'
    cmd_payload = cmd_payload[0]
    channel_mask_ack = cmd_payload & 0b1
    data_rate_ack = cmd_payload >> 1 & 0b1
    power_ack = cmd_payload >> 2 & 0b1
    rfu = cmd_payload >> 3
    if channel_mask_ack & data_rate_ack & power_ack == 1:
        Logger.info(
            action=Action.mac_cmd_get,
            type=IDType.device,
            id=hexlify(device.dev_eui).decode(),
            msg=
            'LinkADRAns Success: %s, power_ack: %d, channel_mask_ack: %d, data_rate_ack: %d'
            % (cmd_payload, power_ack, channel_mask_ack, data_rate_ack))
    else:
        Logger.error(
            action=Action.mac_cmd_get,
            type=IDType.device,
            id=hexlify(device.dev_eui).decode(),
            msg=
            'LinkADRAns Fail: %s, power_ack: %d, channel_mask_ack: %d, data_rate_ack: %d'
            % (cmd_payload, power_ack, channel_mask_ack, data_rate_ack))
Esempio n. 29
0
 def handle(self, data, address):
     t0 = time.time()
     protocol_version = data[0]
     token = data[1:3]
     data_type = data[3]
     gateway_mac_addr = data[4:12]
     gateway = Gateway.objects.get(gateway_mac_addr)
     if gateway is not None:
         p_token = g_token.get(gateway.mac_addr)
         g_token[gateway.mac_addr] = token
         gateway.set_time(time.time())
         if data_type == Const.PUSH_DATA_IDENTIFIER:
             try:
                 datagram = json.loads(data[12:].decode())
             except Exception as error:
                 Logger.error(msg='%s' % error,
                              type=IDType.gateway,
                              action=Action.push_data,
                              id='%s' % hexlify(gateway.mac_addr).decode())
                 return
             push_ack = write_push_ack(token, protocol_version)
             self.socket.sendto(push_ack, address)
             t1 = time.time()
             Logger.info(msg='%s' % push_ack,
                         type=IDType.gateway,
                         action=Action.push_ack,
                         id='%s' % hexlify(gateway.mac_addr).decode())
             if p_token != token:
                 Logger.info(msg='NEW: %s ' % data,
                             type=IDType.gateway,
                             action=Action.push_data,
                             id='%s' % hexlify(gateway.mac_addr).decode())
                 read_push_data(datagram, gateway, t0, t1)
             else:
                 Logger.info(msg='UDP_RETRANSMISSION: %s' % data,
                             type=IDType.gateway,
                             action=Action.push_data,
                             id='%s' % hexlify(gateway.mac_addr).decode())
         else:
             Logger.error(msg='Get Unknow Data_type: %s' % data_type,
                          type=IDType.gateway,
                          action=Action.got,
                          id='%s' % hexlify(gateway.mac_addr).decode())
     else:
         Logger.error(msg='Not Imported',
                      type=IDType.gateway,
                      action=Action.pull_ack,
                      id='%s' % hexlify(gateway_mac_addr).decode())
Esempio n. 30
0
class Assertions(object):
    def __init__(self):
        self.logger = Logger().get_logger()

    def assert_code(self, expected_code, code):
        '''
        校验response code
        '''
        try:
            assert expected_code == code
            return True
        except Exception as e:
            self.logger.error(
                'Error happened in assert_code func, meet error: %s' % e)
            raise

    def assert_body(self, body, expected_key):
        '''
        校验response是否包含指定字段
        '''
        try:
            keys = body.keys()
            assert expected_key in keys
        except Exception as e:
            self.logger.error(
                'Error happened in assert_body func, meet error: %s' % e)
            raise

    def assert_value(self, body, expected_value, key):
        '''
        校验response指定字段的值是否正确
        '''
        try:
            actual_value = body[key]
            assert actual_value == expected_value
        except Exception as e:
            self.logger.error(
                'Error happened in assert_text func, meet error: %s' % e)
            raise