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
def RSL10v3_decode( packet, RSL10_UUID=bytes.fromhex('53ac89d1ec355ebb84e18dadb5d4db84')): """Check a parsed packet and figure out if it is a RSL10V3 Beacon. If it is , return the relevant data as a dictionary. Return None, it is not a RSL10V3 Beacon advertising packet""" found = False adv = packet.retrieve("Advertised Data") for x in adv: luuid = x.retrieve("Service Data uuid") for uuid in luuid: if RSL10_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 print(data.hex()) # temperature myinfo = aiobs.ShortInt("temperature", endian='little') data = myinfo.decode(data) result["temperature"] = myinfo.val / 100 # humidity in percentage myinfo = aiobs.UShortInt("humidity", endian='little') data = myinfo.decode(data) result["humidity"] = myinfo.val / 100 # Pressure myinfo_lo = aiobs.UShortInt("pressure_lo", endian='little') data = myinfo_lo.decode(data) myinfo_hi = aiobs.UIntByte("pressure_hi") data = myinfo_hi.decode(data) result["pressure"] = (myinfo_lo.val + myinfo_hi.val * 65536) / 100 # format version, no need to save myinfo = aiobs.IntByte("version") data = myinfo.decode(data) # tilt_x value myinfo = aiobs.IntByte("tilt_x") data = myinfo.decode(data) result["tilt_x"] = myinfo.val # tilt_y value myinfo = aiobs.IntByte("tilt_y") data = myinfo.decode(data) result["tilt_y"] = myinfo.val # return RSSI value rssi = packet.retrieve("rssi") if rssi: result["rssi"] = rssi[-1].val mac = packet.retrieve("peer") # return MAC address if mac: result["mac address"] = mac[-1].val return result