Example #1
0
        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);
        }
Example #5
0
        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);
        }
Example #7
0
        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]);
        }