Пример #1
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);
        }
Пример #2
0
            //private static final String TAG = "SBeaconParser";

            public override Beacon FromScanData(byte[] scanData, int rssi, Android.Bluetooth.BluetoothDevice device)
            {
                int startByte = 2;

                while (startByte <= 5)
                {
                    // "m:2-3=0203,i:2-2,i:7-8,i:14-19,d:10-13,p:9-9"
                    if (((int)scanData[startByte + 3] & 0xff) == 0x03 &&
                        ((int)scanData[startByte + 4] & 0xff) == 0x15)
                    {
                        //BeaconManager.logDebug(TAG, "This is a SBeacon beacon advertisement");
                        // startByte+0 company id (2 bytes)
                        // startByte+2 = 02 (1) byte header
                        // startByte+3 = 0315 (2 bytes) header
                        // startByte+5 = Beacon Type 0x01
                        // startByte+6 = Reserved (1 bytes)
                        // startByte+7 = Security Code (2 bytes) => Major little endian
                        // startByte+9 = Tx Power => Tx Power
                        // startByte+10 = Timestamp (4 bytes) => Minor (2 LSBs) little endian
                        // startByte+14 = Beacon ID (6 bytes) -> UUID little endian
                        int grouping = (scanData[startByte + 8] & 0xff) * 0x100 + (scanData[startByte + 7] & 0xff);
                        int clock    = (scanData[startByte + 13] & 0xff) * 0x1000000 + (scanData[startByte + 12] & 0xff) * 0x10000 + (scanData[startByte + 11] & 0xff) * 0x100 + (scanData[startByte + 10] & 0xff);
                        int txPower  = (int)(sbyte)scanData[startByte + 9];  // this one is signed

                        byte[] beaconId = new byte[6];
                        //Java.Lang.JavaSystem.Arraycopy(scanData, startByte+14, beaconId, 0, 6);
                        Array.Copy(scanData, startByte + 14, beaconId, 0, 6);
                        String        hexString = BytesToHex(beaconId);
                        StringBuilder sb        = new StringBuilder();
                        sb.Append(hexString.Substring(0, 12));
                        String id             = "0x" + sb.ToString();
                        int    beaconTypeCode = (scanData[startByte + 3] & 0xff) * 0x100 + (scanData[startByte + 2] & 0xff);


                        String mac = null;
                        if (device != null)
                        {
                            mac = device.Address;
                        }
                        Beacon beacon = new SBeacon(grouping, id, clock, txPower, rssi, beaconTypeCode, mac);
                        return(beacon);
                    }
                    startByte++;
                }
                return(null);
            }