def test_exposure_notification(self): exposure_packet = b"\x02\x01\x1a\x03\x03\x6f\xfd\x17\x16\x6f\xfd\x0d\x3b\x4f" \ b"\x65\x58\x4c\x58\x21\x60\x57\x1d\xd1\x90\x10\xd4\x1c\x26" \ b"\x60\xee\x34\xd1" frame = parse_packet(exposure_packet) self.assertIsInstance(frame, ExposureNotificationFrame) self.assertEqual("0d3b4f65584c582160571dd19010d41c", frame.identifier) self.assertEqual(b"\x26\x60\xee\x34", frame.encrypted_metadata)
def test_eddystone_url(self): """Test URL frame.""" url_packet = b"\x03\x03\xAA\xFE\x13\x16\xAA\xFE\x10\xF8\x03github\x00citruz" frame = parse_packet(url_packet) self.assertIsInstance(frame, EddystoneURLFrame) self.assertEqual(frame.url, "https://github.com/citruz") self.assertEqual(frame.tx_power, -8) self.assertIsNotNone(str(frame))
def test_eddystone_eid(self): """Test EID frame.""" eid_packet = b"\x02\x01\x06\x03\x03\xaa\xfe\x0d\x16\xaa\xfe\x30\xe3" \ b"\x45\x49\x44\x5f\x74\x65\x73\x74" frame = parse_packet(eid_packet) self.assertIsInstance(frame, EddystoneEIDFrame) self.assertEqual(frame.tx_power, -29) self.assertEqual(frame.eid, b'EID_test') self.assertIsNotNone(str(frame))
def test_eddystone_tlm_enc(self): """Test encrypted TLM frame.""" enc_tlm_packet = b"\x02\x01\x06\x03\x03\xaa\xfe\x11\x16\xaa\xfe\x20\x01\x41\x41\x41" \ b"\x41\x41\x41\x41\x41\x41\x41\x41\x41\xDE\xAD\xBE\xFF" frame = parse_packet(enc_tlm_packet) self.assertIsInstance(frame, EddystoneEncryptedTLMFrame) self.assertEqual(frame.encrypted_data, b'AAAAAAAAAAAA') self.assertEqual(frame.salt, 44510) self.assertEqual(frame.mic, 65470) self.assertIsNotNone(str(frame))
def test_eddystone_tlm(self): """Test TLM frame.""" tlm_packet = b"\x02\x01\x06\x03\x03\xaa\xfe\x11\x16\xaa\xfe\x20\x00\x0b\x18\x13\x00\x00" \ b"\x00\x14\x67\x00\x00\x2a\xc4\xe4" frame = parse_packet(tlm_packet) self.assertIsInstance(frame, EddystoneTLMFrame) self.assertEqual(frame.voltage, 2840) self.assertEqual(frame.temperature, 19) self.assertEqual(frame.advertising_count, 5223) self.assertEqual(frame.seconds_since_boot, 10948) self.assertIsNotNone(str(frame))
def test_ibeacon(self): """Test iBeacon advertisement.""" ibeacon_packet = b"\x02\x01\x06\x1a\xff\x4c\x00\x02\x15\x41\x42\x43\x44\x45\x46\x47\x48"\ b"\x49\x40\x41\x42\x43\x44\x45\x46\x00\x01\x00\x02\xf8" frame = parse_packet(ibeacon_packet) self.assertIsInstance(frame, IBeaconAdvertisement) self.assertEqual(frame.uuid, "41424344-4546-4748-4940-414243444546") self.assertEqual(frame.major, 1) self.assertEqual(frame.minor, 2) self.assertEqual(frame.tx_power, -8) self.assertIsNotNone(str(frame))
def test_estimote_nearable(self): nearable_packet = b"\x02\x01\x04\x03\x03\x0f" \ b"\x18\x17\xff\x5d\x01\x01\x1e\xfe\x42\x7e" \ b"\xb6\xf4\xbc\x2f\x04\x01\x68\xa1\xaa\xfe" \ b"\x05\xc1\x45\x25\x53" frame = parse_packet(nearable_packet) self.assertIsInstance(frame, EstimoteNearable) self.assertEqual("1efe427eb6f4bc2f", frame.identifier) self.assertEqual(22.5, frame.temperature) self.assertEqual(1, frame.firmware_version) self.assertEqual(4, frame.hardware_version) self.assertFalse(frame.is_moving)
def test_cypress_beacon(self): """Test Cypress Cyalkit-E02 Sensor Beacon advertisement.""" cypress_packet = b"\x02\x01\x04\x1a\xff\x4c\x00\x02\x15\x00\x05\x00\x01\x00\x00\x10\x00"\ b"\x80\x00\x00\x80\x5f\x9b\x01\x31\x00\x02\x6c\x66\xc3" frame = parse_packet(cypress_packet) self.assertIsInstance(frame, IBeaconAdvertisement) self.assertEqual(frame.uuid, "00050001-0000-1000-8000-00805f9b0131") self.assertEqual(frame.major, 2) self.assertEqual(int(frame.cypress_temperature * 100), 2316) self.assertEqual(int(frame.cypress_humidity * 100), 4673) self.assertEqual(frame.tx_power, -61) self.assertIsNotNone(str(frame))
def test_bad_packets(self): """Test if random data results in a None result.""" tests = [ b"0000000", b"", b"\x02\x01\x06\x03\x03", b"\x12\x34\x67\x89\x01\x00\x00\x00\x00\x00\x01\x00\x00", b"\x02\x01\x06\x03\x03\xaa\xfe\x17\x16\xaa\xfe\x01\xe3\x12\x34\x56\x78\x90" \ b"\x12\x34\x67\x89\x01\x00\x00\x00\x00\x00\x01\x00\x00" ] for test in tests: frame = parse_packet(test) self.assertIsNone(frame)
def test_estimote_telemetry_b3(self): telemetry_b_packet = b"\x02\x01\x04\x03\x03\x9a\xfe\x17\x16\x9a\xfe\x02\x47\xa0\x38\xd5"\ b"\xeb\x03\x26\x40\x01\xd8\x42\xed\x73\x49\x25\x66\xbc\x2e\x53" frame = parse_packet(telemetry_b_packet) self.assertIsInstance(frame, EstimoteTelemetryFrameB) self.assertEqual(frame.identifier, "47a038d5eb032640") self.assertEqual(frame.protocol_version, 0) self.assertEqual(frame.magnetic_field, (-0.3125, 0.515625, -0.1484375)) self.assertEqual(frame.ambient_light, 276.48) self.assertEqual(frame.uptime, 4870800) self.assertEqual(frame.temperature, 25.5) self.assertEqual(frame.has_firmware_error, True) self.assertEqual(frame.has_clock_error, True) self.assertEqual(frame.battery_level, None) self.assertIsNotNone(str(frame))
def test_bad_packets(self): """Test if random data results in a None result.""" tests = [ b"0000000", b"", b"\x02\x01\x06\x03\x03", b"\x02\x01\x06\x03\x03\xab\xfe\x17\x16\xaa\xfe\x00\xe3\x12\x34\x56\x78\x90" \ b"\x12\x34\x67\x89\x01\x00\x00\x00\x00\x00\x01\x00\x00", b"\x02\x01\x06\x03\x03\xaa\xfe\x17\x16\xaa\xfe\x01\xe3\x12\x34\x56\x78\x90" \ b"\x12\x34\x67\x89\x01\x00\x00\x00\x00\x00\x01\x00\x00" ] for test in tests: frame = parse_packet(test) self.assertIsNone(frame)
def test_eddystone_uid(self): """Test UID frame.""" uid_packet = b"\x02\x01\x06\x03\x03\xaa\xfe\x17\x16\xaa\xfe\x00\xe3\x12\x34\x56\x78\x90" \ b"\x12\x34\x67\x89\x01\x00\x00\x00\x00\x00\x01\x00\x00" frame = parse_packet(uid_packet) self.assertIsInstance(frame, EddystoneUIDFrame) self.assertEqual(frame.namespace, "12345678901234678901") self.assertEqual(frame.instance, "000000000001") self.assertEqual(frame.tx_power, -29) self.assertEqual(frame.properties, { "namespace":"12345678901234678901", "instance":"000000000001", }) self.assertIsNotNone(str(frame))
def test_estimote_telemetry_a3(self): telemetry_a_packet = b"\x02\x01\x04\x03\x03\x9a\xfe\x17\x16\x9a\xfe\x02\x47\xa0\x38\xd5"\ b"\xeb\x03\x26\x40\x00\x00\x01\x41\x44\x47\xf0\x01\x00\x00\x00" frame = parse_packet(telemetry_a_packet) self.assertIsInstance(frame, EstimoteTelemetryFrameA) self.assertEqual(frame.identifier, "47a038d5eb032640") self.assertEqual(frame.protocol_version, 0) self.assertEqual(frame.acceleration, (0, 2 / 127.0, 130 / 127.0)) self.assertEqual(frame.is_moving, False) self.assertEqual(frame.current_motion_state, 420) self.assertEqual(frame.previous_motion_state, 240) self.assertEqual(frame.gpio_states, (1, 1, 1, 1)) self.assertEqual(frame.has_firmware_error, None) self.assertEqual(frame.has_clock_error, None) self.assertEqual(frame.pressure, None) self.assertIsNotNone(str(frame))
def on_message(mosq, obj, msg): for d in msgpack.unpackb(msg.payload)[b'devices']: #parse iBeacon data advData = d[8:] adv = parse_packet(advData) if adv == None: continue print("=============================================") print "mac:{:02X}{:02X}{:02X}{:02X}{:02X}{:02X}".format( ord(d[1]), ord(d[2]), ord(d[3]), ord(d[4]), ord(d[5]), ord(d[6])) print "rssi:", ord(d[7]) - 256 print("UUID: %s" % adv.uuid) print("Major: %d" % adv.major) print("Minor: %d" % adv.minor) print("TX Power: %d" % adv.tx_power)
def on_message(mosq, obj, msg): for d in msgpack.unpackb(msg.payload, raw=True)[b'devices']: #parse iBeacon data advData = d[8:] adv = parse_packet(advData) print("=============================================") print("mac: {:02X}{:02X}{:02X}{:02X}{:02X}{:02X}".format( (d[1]), (d[2]), (d[3]), (d[4]), (d[5]), (d[6]))) print("rssi:", (d[7]) - 256) if adv == None: print("adv:", advData) else: if hasattr(adv, "uuid"): print("UUID: %s" % adv.uuid) print("Major: %d" % adv.major) print("Minor: %d" % adv.minor) print("TX Power: %d" % adv.tx_power)
# -*- coding: utf-8 -*- from beacontools import parse_packet # Eddystone UID packet uid_packet = b"\x02\x01\x06\x03\x03\xaa\xfe\x17\x16\xaa\xfe\x00\xe3\x12\x34\x56\x78\x90\x12" \ b"\x34\x67\x89\x01\x00\x00\x00\x00\x00\x01\x00\x00" uid_frame = parse_packet(uid_packet) print("Namespace: %s" % uid_frame.namespace) print("Instance: %s" % uid_frame.instance) print("TX Power: %s" % uid_frame.tx_power) print("-----") # Eddystone URL packet url_packet = b"\x03\x03\xAA\xFE\x13\x16\xAA\xFE\x10\xF8\x03github\x00citruz" url_frame = parse_packet(url_packet) print("TX Power: %d" % url_frame.tx_power) print("URL: %s" % url_frame.url) print("-----") # Eddystone TLM packet (unencrypted) tlm_packet = b"\x02\x01\x06\x03\x03\xaa\xfe\x11\x16\xaa\xfe\x20\x00\x0b\x18\x13\x00\x00\x00" \ b"\x14\x67\x00\x00\x2a\xc4\xe4" tlm_frame = parse_packet(tlm_packet) print("Voltage: %d mV" % tlm_frame.voltage) print("Temperature: %d °C" % tlm_frame.temperature) print("Temperature (8.8 fixed point): %f °C" % tlm_frame.temperature_fixed_point) print("Advertising count: %d" % tlm_frame.advertising_count) print("Seconds since boot: %d" % tlm_frame.seconds_since_boot)
def print_list(packet): #global uid_frame uid_frame = parse_packet(packet) d = dict() try: d['Namespace'] = uid_frame.namespac except: pass try: d['Instance'] = uid_frame.instance except: pass try: d['TX Power'] = uid_frame.tx_power except: pass try: d['TX Power'] = uid_frame.tx_power except: pass try: d['URL'] = uid_frame.url except: pass try: d['Voltage'] = uid_frame.voltage except: pass try: d['Temperature'] = uid_frame.temperature except: pass try: d['Temperature (8.8 fixed point)'] = uid_frame.temperature_fixed_point except: pass try: d['Advertising count'] = uid_frame.advertising_count except: pass try: d['Seconds since boot'] = uid_frame.seconds_since_boot except: pass try: d['Data'] = uid_frame.encrypted_data except: pass try: d['Salt'] = uid_frame.salt except: pass try: d['Mic'] = uid_frame.mic except: pass try: d['UUID'] = uid_frame.uuid except: pass try: d['Major'] = uid_frame.major except: pass try: d['Minor'] = uid_frame.minor except: pass try: d['TX Power'] = uid_frame.tx_power except: pass try: print("UUID: %s" % uid_frame.uuid) #d['Instance'] = uid_frame.instance except: pass try: print("Major: %d" % uid_frame.major) #d['Instance'] = uid_frame.instance except: pass try: d['Temperature cypress'] = uid_frame.cypress_temperature except: pass try: d['Humidity cypress'] = uid_frame.cypress_humidity except: pass try: d['Identifier'] = uid_frame.identifier except: pass try: d['Protocol Version'] = uid_frame.protocol_version except: pass try: d['Acceleration (g)'] = uid_frame.acceleration except: pass try: d['Is moving'] = uid_frame.is_moving except: pass try: print("Identifier: %s" % uid_frame.identifier) #d['Instance'] = uid_frame.instance except: pass try: d['Protocol Version'] = uid_frame.protocol_version except: pass try: d['Magnetic field'] = uid_frame.magnetic_field except: pass return d
# -*- coding: utf-8 -*- from beacontools import parse_packet # Eddystone UID packet uid_packet = b"\x02\x01\x06\x03\x03\xaa\xfe\x17\x16\xaa\xfe\x00\xe3\x12\x34\x56\x78\x90\x12" \ b"\x34\x67\x89\x01\x00\x00\x00\x00\x00\x01\x00\x00" uid_frame = parse_packet(uid_packet) print("Namespace: %s" % uid_frame.namespace) print("Instance: %s" % uid_frame.instance) print("TX Power: %s" % uid_frame.tx_power) print("-----") # Eddystone URL packet url_packet = b"\x03\x03\xAA\xFE\x13\x16\xAA\xFE\x10\xF8\x03github\x00citruz" url_frame = parse_packet(url_packet) print("TX Power: %d" % url_frame.tx_power) print("URL: %s" % url_frame.url) print("-----") # Eddystone TLM packet (unencrypted) tlm_packet = b"\x02\x01\x06\x03\x03\xaa\xfe\x11\x16\xaa\xfe\x20\x00\x0b\x18\x13\x00\x00\x00" \ b"\x14\x67\x00\x00\x2a\xc4\xe4" tlm_frame = parse_packet(tlm_packet) print("Voltage: %d mV" % tlm_frame.voltage) print("Temperature: %d °C" % tlm_frame.temperature) print("Advertising count: %d" % tlm_frame.advertising_count) print("Seconds since boot: %d" % tlm_frame.seconds_since_boot) print("-----")
# -*- coding: utf-8 -*- from beacontools import parse_packet # Eddystone UID packet uid_packet = b"\x02\x01\x06\x03\x03\xaa\xfe\x17\x16\xaa\xfe\x00\xe3\x12\x34\x56\x78\x90\x12" \ b"\x34\x67\x89\x01\x00\x00\x00\x00\x00\x01\x00\x00" uid_frame = parse_packet(uid_packet) print("Namespace: %s" % uid_frame.namespace) print("Instance: %s" % uid_frame.instance) print("TX Power: %s" % uid_frame.tx_power) print("-----") # Eddystone URL packet url_packet = b"\x03\x03\xAA\xFE\x13\x16\xAA\xFE\x10\xF8\x03github\x00citruz" url_frame = parse_packet(url_packet) print("TX Power: %d" % url_frame.tx_power) print("URL: %s" % url_frame.url) print("-----") # Eddystone TLM packet (unencrypted) tlm_packet = b"\x02\x01\x06\x03\x03\xaa\xfe\x11\x16\xaa\xfe\x20\x00\x0b\x18\x13\x00\x00\x00" \ b"\x14\x67\x00\x00\x2a\xc4\xe4" tlm_frame = parse_packet(tlm_packet) print("Voltage: %d mV" % tlm_frame.voltage) print("Temperature: %f °C" % tlm_frame.temperature) print("Advertising count: %d" % tlm_frame.advertising_count) print("Seconds since boot: %d" % tlm_frame.seconds_since_boot)
from beacontools import parse_packet if __name__ == "__main__": while (True): ibeacon_packet = b"\x02\x01\x06\x1a\xff\x4c\x00\x02\x15\x41\x41\x41\x41\x41\x41\x41\x41\x41" \ b"\x41\x41\x41\x41\x41\x41\x41\x00\x01\x00\x01\xf8" adv = parse_packet(ibeacon_packet) print("UUID: %s" % adv.uuid) print("Major: %d" % adv.major) print("Minor: %d" % adv.minor) print("TX Power: %d" % adv.tx_power) f = open("beaconstatus.txt", "w") if (adv): f.write("Successful") break else: f.write("Unsuccessful") f.close()
# -*- coding: utf-8 -*- from beacontools import parse_packet tlm_packet = b"\x02\x01\x03\x01\xb9\xa4\xa9\xc8\xdb\xcc\x1e\x02\x01\x06\x1a\xffL\x00\x02\x15\xf7\x82m\xa6O\xa2N\x98\x80$\xbc[q\xe0\x89>zY\xab\xf5\xb3\xbf" tlm_frame = parse_packet(tlm_packet) print("tlm_frame", tlm_frame) print("Voltage: %d mV" % tlm_frame.voltage) print("Temperature: %d °C" % tlm_frame.temperature) print("Advertising count: %d" % tlm_frame.advertising_count) print("Seconds since boot: %d" % tlm_frame.seconds_since_boot)
# -*- coding: utf-8 -*- from beacontools import parse_packet # Eddystone UID packet uid_packet = b"\x02\x01\x06\x03\x03\xaa\xfe\x17\x16\xaa\xfe\x00\xe3\x12\x34\x56\x78\x90\x12" \ b"\x34\x67\x89\x01\x00\x00\x00\x00\x00\x01\x00\x00" uid_frame = parse_packet(uid_packet) print("Namespace: %s" % uid_frame.namespace) print("Instance: %s" % uid_frame.instance) print("TX Power: %s" % uid_frame.tx_power) print("-----") # Eddystone URL packet url_packet = b"\x03\x03\xAA\xFE\x13\x16\xAA\xFE\x10\xF8\x03github\x00citruz" url_frame = parse_packet(url_packet) print("TX Power: %d" % url_frame.tx_power) print("URL: %s" % url_frame.url) print("-----") # Eddystone TLM packet (unencrypted) tlm_packet = b"\x02\x01\x06\x03\x03\xaa\xfe\x11\x16\xaa\xfe\x20\x00\x0b\x18\x13\x00\x00\x00" \ b"\x14\x67\x00\x00\x2a\xc4\xe4" tlm_frame = parse_packet(tlm_packet) print("Voltage: %d mV" % tlm_frame.voltage) print("Temperature: %d °C" % tlm_frame.temperature) print("Advertising count: %d" % tlm_frame.advertising_count) print("Seconds since boot: %d" % tlm_frame.seconds_since_boot) print("-----")