def add_lgtw(self, **kwargs): """Add new lgtw.""" if 'lns_euid' not in kwargs: raise ValueError("lns_euid must be present") if 'lgtw_euid' not in kwargs: raise ValueError("lgtw_euid must be present") lns_euid = EUI64(kwargs.get("lns_euid")).id6 lgtw_euid = EUI64(kwargs.get("lgtw_euid")).id6 try: lns = self.lnss[lns_euid] except KeyError: raise KeyError("%s not registered, register lns first" % lns_euid) except: raise if lgtw_euid not in lns.lgtws: if lns.lgtws: lns.lgtws.append(lgtw_euid) else: lns.lgtws = [lgtw_euid] lns.save() self.lnss[lgtw_euid] = lns return lgtw_euid
def add_lns(self, lns_euid, **kwargs): """Add new lns.""" try: lns_euid = EUI64(lns_euid).id6 except: raise ValueError("LNS euid (lns_euid) not valid") desc = kwargs.get("desc", "Generic LNS") uri = kwargs.get("uri") lgtws = kwargs.get("lgtws", []) if lgtws: try: lgtws = [EUI64(lgtw).id6 for lgtw in lgtws] except: raise ValueError("lGTW euid (lgtw_euid=%s) not valid" % str(lgtws)) if lns_euid in self.lnss: raise ValueError( "LNS %s already registered in the LNS Discovery Server" % lns_euid) if lgtws: lns = LNS(uri=uri, euid=lns_euid, desc=desc, lgtws=lgtws).save() else: lns = LNS(uri=uri, euid=lns_euid, desc=desc).save() self.lnss[lns_euid] = lns return self.lnss[lns_euid]
def update_lns(self, lns_euid, **kwargs): """Update lns data.""" lns_euid = EUI64(lns_euid).id6 desc = kwargs.get("desc") uri = kwargs.get("uri") lgtws = [EUI64(lgtw).id6 for lgtw in kwargs.get("lgtws", [])] try: lns = self.lnss[lns_euid] except KeyError: raise KeyError("%s not registered, register lns first" % lns_euid) except: raise if lgtws: for lgtw in lgtws: if lgtw not in lns.lgtws: lns.lgtws.append(lgtws) if uri: lns.uri = uri if desc: lns.desc = desc lns.save()
def delete(self, *args, **kwargs): """Delete one or all LoRaWAN GTW from LSN Discovery Server. Args: [0]: the lnss euid [1]: the lgtw euid Example URLs: DELETE /api/v1/lnsd/lnss/0000:0000:0000:0001/lgtws DELETE /api/v1/lnsd/lnss/0000:0000:0000:0001/lgtws/b827:ebff:fee7:7681 """ lns_euid = None lgtw_euid = None if args[0]: try: lns_euid = EUI64(args[0]).id6 except ValueError as err: self.set_status(400) self.finish({ "status_code": 400, "title": "Value error (lns_euid)", "detail": str(err) }) if len(args) == 2: if args[1]: try: lgtw_euid = EUI64(args[1]).id6 except ValueError as err: self.set_status(400) self.finish({ "status_code": 400, "title": "Value error (lgtw_euid)", "detail": str(err) }) if len(args) == 2 and lns_euid and lgtw_euid: self.service.remove_lgtw(lns_euid, lns_euid) elif len(args) == 2 and not lns_euid and args[1]: self.service.remove_lgtw(lns_euid) elif lns_euid: lns_euid = lns_euid print(self.service.lgtws) for lgtw_euid in self.service.lgtws: self.service.remove_lgtw(lgtw_euid, lns_euid) else: for lns_euid in self.service.lnss: for lgtw_euid in self.service.lgtws: self.service.remove_lgtw_from_lns(lgtw_euid, lns_euid)
def delete(self, *args, **kwargs): """Delete one or all devices. Args: [0]: the lnss euid Example URLs: DELETE /api/v1/lnsd/lnss DELETE /api/v1/lnsd/lnss/00-0D-B9-2F-56-64 """ if args: try: self.service.remove_lns(EUI64(args[0]).id6) except ValueError as err: self.set_status(400) self.finish({ "status_code": 400, "title": "Value error", "detail": str(err) }) except: self.set_status(500) self.finish({ "status_code": 500, "title": "Server error", "detail": "unknown internal error" }) else: self.service.remove_all_lnss()
def update_lgtw(self, lgtw_euid, **kwargs): desc = kwargs.get("desc", "Generic GTW") name = kwargs.get("name", "lgtw") owner = str(EUI64(kwargs.get("owner", lnsp.DEFAULT_OWNER))) lgtw_config = kwargs.get("lgtw_config", LGTW_CONFIG_EU863_6CH) if lgtw_euid not in self.lgtws: raise ValueError("GTW %s not registered in the LNS Server" % lgtw_euid) try: lgtw = self.lgtws[lgtw_euid] except KeyError: raise KeyError("%s not registered, register lgtw first" % lgtw_euid) except: raise if owner: name.lgtw_config = owner if lgtw_config: name.lgtw_config = lgtw_config if name: name.uri = name if desc: lgtw.desc = desc self.lgtws[lgtw_euid] = lgtw.save() return self.lgtws[lgtw_euid]
def update_lenddev(self, devEUI, **kwargs): """Add new End Device.""" desc = kwargs.get("desc", "Generic End Device") joinEUI = str(EUI64(kwargs.get("joinEUI", ""))) appKey = kwargs.get("appKey") nwkKey = kwargs.get("nwkKey") try: lenddev = self.lenddevs[devEUI] except KeyError: raise KeyError("End Device %s not registered in the LNS Server" % devEUI) except: raise if joinEUI: lenddev.joinEUI = joinEUI if appKey: lenddev.appKey = appKey if nwkKey: lenddev.nwkKey = nwkKey if desc: lenddev.desc = desc lenddev.save() self.lenddevs[devEUI] = lenddev return self.lenddevs[devEUI]
def remove_lenddev(self, devEUI): """Remove End Device.""" devEUI = str(EUI64(devEUI)) if devEUI not in self.lenddevs: raise KeyError("End Device %s not registered" % devEUI) lenddev = self.lenddevs[devEUI] lenddev.delete() del self.lenddevs[devEUI]
def remove_lgtw(self, lgtw_euid): """Remove GTW.""" lgtw_euid = EUI64(lgtw_euid).eui if lgtw_euid not in self.lgtws: raise KeyError("GTW %s not registered" % lgtw_euid) lgtw = self.lgtws[lgtw_euid] lgtw.delete() del self.lgtws[lgtw_euid]
def post(self, *args, **kwargs): """Add a new LoRaWAN GTW to the LNS Discovery Server Database. Args: [0]: the lnss euid (optional) [1]: the lgtw euid (optional) Request: version: protocol version (1.0) Example URLs: POST /api/v1/lnsd/lnss/0000:0000:0000:0001/lgtws/b827:ebff:fee7:7681 """ lns_euid = None lgtw_euid = None if args[0]: try: lns_euid = EUI64(args[0]).id6 except ValueError as err: self.set_status(400) self.finish({ "status_code": 400, "title": "Value error (lns_euid)", "detail": str(err) }) if args[1]: try: lgtw_euid = EUI64(args[1]).id6 except ValueError as err: self.set_status(400) self.finish({ "status_code": 400, "title": "Value error (lgtw_euid)", "detail": str(err) }) self.service.add_lgtw(**{"lns_euid": lns_euid, "lgtw_euid": lgtw_euid}) print("/api/v1/lnsd/lnss/%s/lgtws/%s" % (lns_euid, lgtw_euid)) self.set_header( "Location", "/api/v1/lnsd/lnss/%s/lgtws/%s" % (lns_euid, lgtw_euid))
def get(self, *args, **kwargs): """List LoRaWAN Gateways. Args: [0]: the LoRaWAN Gateway EUID (optional) Example URLs: GET /api/v1/lns/lgtws [ {"lgtw_euid": "b8:27:eb:ff:fe:e7:76:81", "desc": "iC880A Concentrator", "state": "disconnected", "owner": "00:00:00:00:00:00:00:00", "lgtw_version": [...], "lgtw_config": [...], "last_seen": "2020-02-18 12:40:52", "last_seen_ts": 1582026052.0, "connection": null}, {[...]}, ] GET /api/v1/lns/lgtws/b8:27:eb:ff:fe:e7:76:81 { "lgtw_euid": "b8:27:eb:ff:fe:e7:76:81", "desc": "iC880A Concentrator", "state": "disconnected", "owner": "00:00:00:00:00:00:00:00", "lgtw_version": [...], "lgtw_config": [...], "last_seen": "2020-02-18 12:40:52", "last_seen_ts": 1582026052.0, "connection": null } """ if len(args) == 0: desc = self.get_argument("desc", None) out = [] for key in self.service.lgtws: if desc and desc not in self.service.lgtws[key].to_dict( )["desc"]: continue out.append(self.service.lgtws[key].to_dict()) return out else: try: lgtw_euid = EUI64(args[0]).eui except ValueError as err: self.set_status(400) self.finish({ "status_code": 400, "title": "lgtw_id wrong format", "detail": str(err) }) if lgtw_euid in self.service.lgtws: return [self.service.lgtws[lgtw_euid].to_dict()] else: return []
def delete(self, *args, **kwargs): """Delete one or all LoRaWAN end devices. Args: [0]: devEUI Example URLs: DELETE /api/v1/lns/lenddevs DELETE /api/v1/lns/lenddevs/00:28:A1:54:B8:91:72:D2 """ if args: self.service.remove_lenddev(EUI64(args[0])) else: self.service.remove_all_lenddevs()
def delete(self, *args, **kwargs): """Delete one or all LoRaWAN end devices. Args: [0]: the lGTW euid Example URLs: DELETE /api/v1/lns/lgtws DELETE /api/v1/lns/lgtws/08:27:eb:ff:fe:e7:76:91 """ if args: self.service.remove_lgtw(EUI64(args[0]).eui) else: self.service.remove_all_lgtws()
def add_lgtw(self, lgtw_euid, **kwargs): desc = kwargs.get("desc", "Generic GTW") name = kwargs.get("name", "lgtw") owner = str(EUI64(kwargs.get("owner", lnsp.DEFAULT_OWNER))) lgtw_config = kwargs.get("lgtw_config", LGTW_CONFIG_EU863_6CH) if lgtw_euid in self.lgtws: raise ValueError("GTW %s already registered in the LNS Server" % lgtw_euid) self.lgtws[lgtw_euid] = LoRaWANgtw(lgtw_euid=lgtw_euid, desc=desc, owner=owner, lgtw_config=lgtw_config, name=name).save() return self.lgtws[lgtw_euid]
def open(self, lgtw_euid): """On socket opened get LoRa GTW ID from url.""" lgtw_euid = EUI64(lgtw_euid).id6 try: self.lgtw = self.server.lgtws[lgtw_euid] except: LOG.info("Unregistered lora gtw (%s), closing connection", lgtw_euid) self.stream.close() return """ save lGTW IP address """ self.lgtw.ipaddr = self.request.remote_ip self.lgtw.last_seen_ts = datetime.now().timestamp() self.lgtw.save() ##REVIEW test """ save lGTW connection """ self.lgtw.connection = self """ set lGTW state to CONNECTED """ self.lgtw.set_connected() LOG.info("Connected to LGTW %s", str(self.lgtw.lgtw_euid))
def handle_message(self, msg): """Handle incoming message.""" try: self.lgtw_id = EUI64(msg['router']).id6 except KeyError: LOG.error( "Bad message formatting, 'router' information (Radio GTW EUI) missing" ) #self.stream.close() return LOG.info("New LNS discovery request from %s: %s", self.lgtw_id, json.dumps(msg)) #for tenant in RUNTIME.tenants.values(): # for app in tenant.components.values(): # app.lgtw_new_lns_discovery_request(self.lgtw_id) # defined in app.py or event.py self.send_lns_discovery_request_replay() return
def get(self, *args, **kwargs): """List LoRaWAN End devices. Args: [0]: devEUI (optional) Example URLs: GET /api/v1/lns/lenddevs [ { "devEUI": "0028A154B89172D2" "devAddr": "0028A154B89172D2", "desc": "End Device XXX" } ] GET /api/v1/lns/lenddevs/00:28:A1:54:B8:91:72:D2 { "devAddr": "0028A154B89172D2", "desc": "End Device XXX" } """ if not args: out = [] for key in self.service.lenddevs: out.append(self.service.lenddevs[key].to_dict()) return out else: try: devEUI = EUI64(args[0]).eui except ValueError as err: self.set_status(400) self.finish({ "status_code": 400, "title": "devEUI wrong format", "detail": str(err) }) return self.service.lenddevs[devEUI].to_dict()
def remove_all_lnss(self): """Remove all LNSs.""" for euid in list(self.lnss): self.remove_lns(EUI64(euid).id6)
def get(self, *args, **kwargs): """List devices. Args: [0]: the lns euid (optional) Example URLs: GET /api/v1/lnsd/lnss [ { "euid":"::1", "uri":"ws://0.0.0.0:6038/router-", "desc": "LNS XXX" } ] GET /api/v1/lnsd/lnss/::1 { "euid":"::1", "uri":"ws://0.0.0.0:6038/router-", "desc": "LNS XXX" } """ if not args: out = [] desc = self.get_argument("desc", None) state = self.get_argument("state", None) lgtw_euid = self.get_argument("lgtw_euid", None) for key in self.service.lnss: """ only if string in description """ if desc and desc not in self.service.lnss[key].to_dict( )["desc"]: continue """ only if state matches """ if state and state != self.service.lnss[key].to_dict( )["state"]: continue """ only if manages lgtw_id """ if lgtw_euid and lgtw_euid not in self.service.lnss[ key].to_dict()["lgtws"]: continue """ all """ out.append(self.service.lnss[key].to_dict()) return out else: try: lnss = self.service.lnss[EUI64(args[0]).id6].to_dict() except KeyError as err: self.set_status(400) self.finish({ "status_code": 400, "title": "LNS not found", "detail": str(err) }) else: return lnss
def handle_add_lgtw(self, euid): """ Save whe the lEndDev is seen by a new lGTW.""" if str(EUI64(euid)) not in self.lgtws_range: self.lgtws_range.append(euid)
def get(self, *args, **kwargs): """List devices. Args: [0]: the lnss euid (optional) [1]: the lgtw euid (optional) Example URLs: GET /api/v1/lnsd/lnss/0000:0000:0000:0001/lgtws { "0000:0000:0000:0001":{ "lgtw_euid": ["b827:ebff:fee7:7681"], "lns_euid": "0000:0000:0000:0001" } } GET /api/v1/lnsd/lnss/0000:0000:0000:0001/lgtws/b827:ebff:fee7:7681 { "lgtw_euid": "b827:ebff:fee7:7681", "lns_euid": "0000:0000:0000:0001" } """ lns_euid = None lgtw_euid = None if args[0]: try: lns_euid = EUI64(args[0]).id6 except ValueError as err: self.set_status(400) self.finish({ "status_code": 400, "title": "Value error (lns_euid)", "detail": str(err) }) if len(args) == 2: if args[1]: try: lgtw_euid = EUI64(args[1]).id6 except ValueError as err: self.set_status(400) self.finish({ "status_code": 400, "title": "Value error (lgtw_euid)", "detail": str(err) }) if len(args) == 2 and lns_euid and lgtw_euid: if lns_euid in self.service.lnss and lgtw_euid in self.service.lnss[ lns_euid].lgtws: return { "lns_euid": lns_euid, "lgtw_euid": self.service.lnss[lns_euid].lgtws } else: return {} elif len(args) == 2 and not lns_euid and lgtw_euid: out = [] if lgtw_euid in self.service.lgtws: for key in self.service.lgtws[lgtw_euid]: out.append({"lns_euid": key, "lgtw_euid": [lgtw_euid]}) return out elif len(args) == 1 and lns_euid: if lns_euid in self.service.lnss: return { "lns_euid": lns_euid, "lgtw_euid": self.service.lnss[lns_euid].lgtws } else: return {} else: out = [] for key in self.service.lnss: out.append({ "lns_euid": key, "lgtw_euid": self.service.lnss[key].lgtws }) return out