예제 #1
0
    def tlm_encoder(self):
        encodedurl = []
        encodedurl.append(aios.NBytes("VBATT", 2))
        if "battery" in self.type_payload:
            encodedurl[-1].val = self.type_payload["battery"]
        else:
            encodedurl[-1].val = -128
        encodedurl.append(aios.Float88("Temperature"))
        if "temperature" in self.type_payload:
            encodedurl[-1].val = self.type_payload["temperature"]
        else:
            encodedurl[-1].val = -128

        encodedurl.append(aios.ULongInt("Count"))
        if "count" in self.type_payload:
            encodedurl[-1].val = self.type_payload["count"]
        else:
            encodedurl[-1].val = 0

        encodedurl.append(aios.ULongInt("Uptime"))
        if "uptime" in self.type_payload:
            encodedurl[-1].val = self.type_payload["uptime"]
        else:
            encodedurl[-1].val = 0
        return encodedurl
예제 #2
0
    def decode(self, packet):
        """Check a parsed packet and figure out if it is an Eddystone Beacon.
        If it is , return the relevant data as a dictionary.

        Return None, it is not an Eddystone Beacon advertising packet"""

        ssu = packet.retrieve("Complete uuids")
        found = False
        for x in ssu:
            if EDDY_UUID in x:
                found = True
                break
        if not found:
            return None

        found = False
        adv = packet.retrieve("Advertised Data")
        for x in adv:
            luuid = x.retrieve("Service Data uuid")
            for uuid in luuid:
                if EDDY_UUID == uuid:
                    found = x
                    break
            if found:
                break

        if not found:
            return None

        try:
            top = found.retrieve("Adv Payload")[0]
        except:
            return None
        # Rebuild that part of the structure
        found.payload.remove(top)
        # Now decode
        result = {}
        data = top.val
        etype = aios.EnumByte(
            "type",
            self.type.val,
            {
                ESType.uid.value: "Eddystone-UID",
                ESType.url.value: "Eddystone-URL",
                ESType.tlm.value: "Eddystone-TLM",
                ESType.eid.value: "Eddystone-EID",
            },
        )
        data = etype.decode(data)
        found.payload.append(etype)
        if etype.val == ESType.uid.value:
            power = aios.IntByte("tx_power")
            data = power.decode(data)
            found.payload.append(power)
            result["tx_power"] = power.val

            nspace = aios.Itself("namespace")
            xx = nspace.decode(
                data[:10]
            )  # According to https://github.com/google/eddystone/tree/master/eddystone-uid
            data = data[10:]
            found.payload.append(nspace)
            result["name space"] = nspace.val

            nspace = aios.Itself("instance")
            xx = nspace.decode(
                data[:6]
            )  # According to https://github.com/google/eddystone/tree/master/eddystone-uid
            data = data[6:]
            found.payload.append(nspace)
            result["instance"] = nspace.val

        elif etype.val == ESType.url.value:
            power = aios.IntByte("tx_power")
            data = power.decode(data)
            found.payload.append(power)
            result["tx_power"] = power.val

            url = aios.EnumByte(
                "type",
                0,
                {
                    0x00: "http://www.",
                    0x01: "https://www.",
                    0x02: "http://",
                    0x03: "https://",
                },
            )
            data = url.decode(data)
            result["url"] = url.strval
            for x in data:
                if bytes([x]) == b"\x00":
                    result["url"] += ".com/"
                elif bytes([x]) == b"\x01":
                    result["url"] += ".org/"
                elif bytes([x]) == b"\x02":
                    result["url"] += ".edu/"
                elif bytes([x]) == b"\x03":
                    result["url"] += ".net/"
                elif bytes([x]) == b"\x04":
                    result["url"] += ".info/"
                elif bytes([x]) == b"\x05":
                    result["url"] += ".biz/"
                elif bytes([x]) == b"\x06":
                    result["url"] += ".gov/"
                elif bytes([x]) == b"\x07":
                    result["url"] += ".com"
                elif bytes([x]) == b"\x08":
                    result["url"] += ".org"
                elif bytes([x]) == b"\x09":
                    result["url"] += ".edu"
                elif bytes([x]) == b"\x10":
                    result["url"] += ".net"
                elif bytes([x]) == b"\x11":
                    result["url"] += ".info"
                elif bytes([x]) == b"\x12":
                    result["url"] += ".biz"
                elif bytes([x]) == b"\x13":
                    result["url"] += ".gov"
                else:
                    result["url"] += chr(
                        x)  # x.decode("ascii") #Yep ASCII only
                    url = aios.String("url")
            url.decode(result["url"])
            found.payload.append(url)
        elif etype.val == ESType.tlm.value:
            myinfo = aios.IntByte("version")
            data = myinfo.decode(data)
            found.payload.append(myinfo)
            myinfo = aios.ShortInt("battery")
            data = myinfo.decode(data)
            result["battery"] = myinfo.val
            found.payload.append(myinfo)
            myinfo = aios.Float88("temperature")
            data = myinfo.decode(data)
            found.payload.append(myinfo)
            result["temperature"] = myinfo.val
            myinfo = aios.LongInt("pdu count")
            data = myinfo.decode(data)
            found.payload.append(myinfo)
            result["pdu count"] = myinfo.val
            myinfo = aios.LongInt("uptime")
            data = myinfo.decode(data)
            found.payload.append(myinfo)
            result["uptime"] = myinfo.val * 100  # in msecs
        # elif etype.val== ESType.tlm.eid:
        else:
            result["data"] = data
            xx = Itself("data")
            xx.decode(data)
            found.payload.append(xx)

        rssi = packet.retrieve("rssi")
        if rssi:
            result["rssi"] = rssi[-1].val
        mac = packet.retrieve("peer")
        if mac:
            result["mac address"] = mac[-1].val
        return result