public void TestCanParseLocationBeacon() { double latitude = 38.93; double longitude = -77.23; var beacon = new Beacon.Builder() .SetManufacturer(0x0118) // Radius Networks .SetId1("1") // device sequence number .SetId2(String.Format("{0:X8}", (long)((latitude + 90) * 10000.0))) .SetId3(String.Format("{0:X8}", (long)((longitude + 180) * 10000.0))) .SetTxPower(-59) // The measured transmitter power at one meter in dBm .Build(); // TODO: make this pass if data fields are little endian or > 4 bytes (or even > 2 bytes) var p = new BeaconParser(). SetBeaconLayout("m:2-3=10ca,i:4-9,i:10-13,i:14-17,p:18-18"); var bytes = p.GetBeaconAdvertisementData(beacon); var headerBytes = HexStringToByteArray("02011a1bff1801"); var advBytes = new byte[bytes.Length + headerBytes.Length]; Array.Copy(headerBytes, 0, advBytes, 0, headerBytes.Length); Array.Copy(bytes, 0, advBytes, headerBytes.Length, bytes.Length); Beacon parsedBeacon = p.FromScanData(advBytes, -59, null); AssertEx.NotNull(String.Format("Parsed beacon from {0} should not be null", ByteArrayToHexString(advBytes)), parsedBeacon); double parsedLatitude = Int64.Parse(parsedBeacon.Id2.ToString().Substring(2), System.Globalization.NumberStyles.HexNumber) / 10000.0 - 90.0; double parsedLongitude = Int64.Parse(parsedBeacon.Id3.ToString().Substring(2), System.Globalization.NumberStyles.HexNumber) / 10000.0 - 180.0; long encodedLatitude = (long)((latitude + 90) * 10000.0); AssertEx.AreEqual("encoded latitude hex should match", string.Format("0x{0:x8}", encodedLatitude).ToLowerInvariant(), parsedBeacon.Id2.ToString().ToLowerInvariant()); AssertEx.AreEqual("device sequence num should be same", "0x000000000001", parsedBeacon.Id1.ToString()); AssertEx.AreEqual("latitude should be about right", latitude, parsedLatitude, 0.0001); AssertEx.AreEqual("longitude should be about right", longitude, parsedLongitude, 0.0001); }
public void TestDetectsEddystoneUID() { byte[] bytes = HexStringToByteArray("0201060303aafe1516aafe00e700010203040506070809010203040506000000000000000000000000000000000000000000000000000000000000000000"); BeaconParser parser = new BeaconParser().SetBeaconLayout(BeaconParser.EddystoneUidLayout); Beacon eddystoneUidBeacon = parser.FromScanData(bytes, -55, null, DateTime.UtcNow.Ticks); AssertEx.NotNull("Eddystone-UID should be not null if parsed successfully", eddystoneUidBeacon); }
public void TestDetectsGattBeacon2MaxLength() { byte[] bytes = HexStringToByteArray("020106030334121616341210ec007261646975736e6574776f726b7373070000000000000000000000000000000000000000000000000000000000000000"); BeaconParser parser = new BeaconParser().SetBeaconLayout("s:0-1=1234,m:2-2=10,p:3-3:-41,i:4-20v"); Beacon gattBeacon = parser.FromScanData(bytes, -55, null, DateTime.UtcNow.Ticks); AssertEx.NotNull("GattBeacon should be not null if parsed successfully", gattBeacon); AssertEx.AreEqual("GattBeacon identifier length should be proper length", 17, gattBeacon.Id1.ToByteArray().Length); }
public void TestDetectsGattBeaconWithCnn() { byte[] bytes = HexStringToByteArray("020106030334120a16341210ed00636e6e070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"); BeaconParser parser = new BeaconParser().SetBeaconLayout("s:0-1=1234,m:2-2=10,p:3-3:-41,i:4-20v"); Beacon gattBeacon = parser.FromScanData(bytes, -55, null, DateTime.UtcNow.Ticks); AssertEx.NotNull("GattBeacon should be not null if parsed successfully", gattBeacon); AssertEx.AreEqual("GattBeacon identifier length should be adjusted smaller if packet is short", 5, gattBeacon.Id1.ToByteArray().Length); }
public void testDetectsSBeacon() { byte[] bytes = HexStringToByteArray("02011a1bff1801031501000100c502000000000000000003"); SBeaconParser parser = new SBeaconParser(); SBeacon sBeacon = (SBeacon)parser.FromScanData(bytes, -55, null); AssertEx.NotNull("SBeacon should be not null if parsed successfully", sBeacon); AssertEx.AreEqual("id should be parsed", "0x000000000003", sBeacon.Id); AssertEx.AreEqual("group should be parsed", 1, sBeacon.Group); AssertEx.AreEqual("time should be parsed", 2, sBeacon.Time); AssertEx.AreEqual("txPower should be parsed", -59, sBeacon.TxPower); }
public void TestDetectsGattBeacon() { byte[] bytes = HexStringToByteArray("020106030334121516341200e72f234454f4911ba9ffa6000000000001000000000000000000000000000000000000000000000000000000000000000000"); BeaconParser parser = new BeaconParser().SetBeaconLayout("s:0-1=1234,m:2-2=00,p:3-3:-41,i:4-13,i:14-19"); AssertEx.NotNull("Service uuid parsed should not be null", parser.ServiceUuid); Beacon gattBeacon = parser.FromScanData(bytes, -55, null, DateTime.UtcNow.Ticks); AssertEx.NotNull("GattBeacon should be not null if parsed successfully", gattBeacon); AssertEx.AreEqual("id1 should be parsed", "0x2f234454f4911ba9ffa6", gattBeacon.Id1.ToString()); AssertEx.AreEqual("id2 should be parsed", "0x000000000001", gattBeacon.Id2.ToString()); AssertEx.AreEqual("serviceUuid should be parsed", 0x1234, gattBeacon.ServiceUuid); AssertEx.AreEqual("txPower should be parsed", -66, gattBeacon.TxPower); }
public void TestParseProblematicBeaconFromIssue229() { // Note that the length field below is 0x16 instead of 0x1b, indicating that the packet ends // one byte before the second identifier field starts var bytes = HexStringToByteArray("0201061bffe000beac7777772e626c756b692e636f6d000100010001abaa000000"); var parser = new BeaconParser(); parser.SetBeaconLayout("m:2-3=beac,i:4-19,i:20-21,i:22-23,p:24-24,d:25-25"); var beacon = parser.FromScanData(bytes, -55, null); AssertEx.NotNull("beacon should be parsed", beacon); }
public void TestDetectsUriBeacon() { //"https://goo.gl/hqBXE1" byte[] bytes = { 2, 1, 4, 3, 3, (byte)216, (byte)254, 19, 22, (byte)216, (byte)254, 0, (byte)242, 3, 103, 111, 111, 46, 103, 108, 47, 104, 113, 66, 88, 69, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; BeaconParser parser = new BeaconParser().SetBeaconLayout("s:0-1=fed8,m:2-2=00,p:3-3:-41,i:4-21v"); Beacon uriBeacon = parser.FromScanData(bytes, -55, null, DateTime.UtcNow.Ticks); AssertEx.NotNull("UriBeacon should be not null if parsed successfully", uriBeacon); AssertEx.AreEqual("UriBeacon identifier length should be correct", 14, uriBeacon.Id1.ToByteArray().Length); String urlString = UrlBeaconUrlCompressor.Uncompress(uriBeacon.Id1.ToByteArray()); AssertEx.AreEqual("URL should be decompressed successfully", "https://goo.gl/hqBXE1", urlString); }
public void testAllowsAccessToBase64EncodedTelemetryBytes() { var telemetryFields = new List <Java.Lang.Long>(); telemetryFields.Add(new Java.Lang.Long(0x01L)); // version telemetryFields.Add(new Java.Lang.Long(0x0212L)); // battery level telemetryFields.Add(new Java.Lang.Long(0x0313L)); // temperature telemetryFields.Add(new Java.Lang.Long(0x04142434L)); // pdu count telemetryFields.Add(new Java.Lang.Long(0x05152535L)); // uptime Beacon beaconWithTelemetry = new Beacon.Builder().SetId1("0x0102030405060708090a").SetId2("0x01020304050607").SetTxPower(-59).SetExtraDataFields(telemetryFields).Build(); byte[] telemetryBytes = new EddystoneTelemetryAccessor().GetTelemetryBytes(beaconWithTelemetry); String encodedTelemetryBytes = new EddystoneTelemetryAccessor().GetBase64EncodedTelemetry(beaconWithTelemetry); AssertEx.NotNull("Should not be null", telemetryBytes); }
public void TestDetectsGattBeacon2WithShortIdentifier() { byte[] bytes = HexStringToByteArray("020106030334121516341210ec007261646975736e6574776f726b7307000000000000000000000000000000000000000000000000000000000000000000"); BeaconParser parser = new BeaconParser().SetBeaconLayout("s:0-1=1234,m:2-2=10,p:3-3:-41,i:4-20v"); Beacon gattBeacon = parser.FromScanData(bytes, -55, null, DateTime.UtcNow.Ticks); AssertEx.NotNull("GattBeacon should be not null if parsed successfully", gattBeacon); AssertEx.AreEqual("GattBeacon identifier length should be adjusted smaller if packet is short", 16, gattBeacon.Id1.ToByteArray().Length); AssertEx.AreEqual("GattBeacon identifier should have proper first byte", (byte)0x00, gattBeacon.Id1.ToByteArray()[0]); AssertEx.AreEqual("GattBeacon identifier should have proper second to last byte", (byte)0x73, gattBeacon.Id1.ToByteArray()[14]); AssertEx.AreEqual("GattBeacon identifier should have proper last byte", (byte)0x07, gattBeacon.Id1.ToByteArray()[15]); }