def url_encoder(self): encodedurl = [] encodedurl.append(aios.IntByte("Tx Power", self.power)) asisurl = "" myurl = urlparse(self.type_payload) myhostname = myurl.hostname mypath = myurl.path if (myurl.scheme, myhostname.startswith("www.")) in url_schemes: encodedurl.append( aios.IntByte( "URL Scheme", url_schemes.index( (myurl.scheme, myhostname.startswith("www."))), )) if myhostname.startswith("www."): myhostname = myhostname[4:] extval = None if myhostname.split(".")[-1] in url_domain: extval = url_domain.index(myhostname.split(".")[-1]) myhostname = ".".join(myhostname.split(".")[:-1]) if extval is not None and not mypath.startswith("/"): extval += 7 else: if myurl.port is None: if extval is not None: mypath = mypath[1:] else: extval += 7 encodedurl.append(aios.String("URL string")) encodedurl[-1].val = myhostname if extval is not None: encodedurl.append(aios.IntByte("URL Extention", extval)) if myurl.port: asisurl += ":" + str(myurl.port) + mypath asisurl += mypath if myurl.params: asisurl += ";" + myurl.params if myurl.query: asisurl += "?" + myurl.query if myurl.fragment: asisurl += "#" + myurl.fragment encodedurl.append(aios.String("Rest of URL")) encodedurl[-1].val = asisurl tlength = 0 for x in encodedurl: # Check the payload length tlength += len(x) if tlength > 19: # Actually 18 but we have tx power raise Exception("Encoded url too long (max 18 bytes)") self.service_data_length.val += tlength # Update the payload length return encodedurl
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