Пример #1
0
    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
Пример #2
0
    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]
Пример #3
0
    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()
Пример #4
0
    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)
Пример #5
0
    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()
Пример #6
0
    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]
Пример #7
0
    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]
Пример #8
0
 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]
Пример #9
0
 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]
Пример #10
0
    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))
Пример #11
0
    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 []
Пример #12
0
    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()
Пример #13
0
    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()
Пример #14
0
    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]
Пример #15
0
 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))
Пример #16
0
    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
Пример #17
0
    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()
Пример #18
0
 def remove_all_lnss(self):
     """Remove all LNSs."""
     for euid in list(self.lnss):
         self.remove_lns(EUI64(euid).id6)
Пример #19
0
    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
Пример #20
0
 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)
Пример #21
0
    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