什么是/如何找到通用ibeacon标识符?

时间:2014-07-25 18:03:14

标签: android bytearray bluetooth-lowenergy ibeacon

我正在尝试编写一个与iBeacons接口的android应用程序,但我需要在字节数组中找到UUID / major / minor特征的开头。通过查看包括this question在内的几个资源,看起来所有iBeacons都会在字节数组中传输一些与iBeacons相同的模式。

我最近提出了另一个问题并得到了一个有用的答案,link here但是1)我还没有能够测试它的功能(等待我的设备)和2)我想要知道它是如何工作的。

所以我的问题:这种模式是什么?我可以通过搜索该数组的模式来找到它吗?并且UUID / Major / Minor是否始终是阵列中预定义数量的点,来自该识别模式?

谢谢!

1 个答案:

答案 0 :(得分:0)

所以在浏览了几个不同的网站后,我发现有3个人将他们的模式列为

 02 01 06 1A FF 4C 00 02 15

 02 01 1A 1A FF 4C 00 02 15 

这并不是非常有用,因为4C 00似乎只是Apple标识符,我假设可以根据制造商(Estimote,GE,Apple等)进行切换。但是,它似乎是

02 15

是静态的,所以我使用它。我找到它的解决方案基本上只是搜索第一次出现的2字节序列时得到的字节数组,然后从那里开始我将下一个16作为UUID,接下来的2作为Major,然后之后的下一个2作为未成年人。所以用代码来澄清:

   //adPacket is an array I created to represent an iBeacon ad for testing
 byte[] adPacket = {(byte) 0xd6, (byte) 0xbe, (byte) 0x89, (byte) 0x8e, 0x40, 0x24, 0x05, (byte) 0xa2, 
            0x17, 0x6e, 0x3d, 0x71, 0x02, 0x01, 0x06, 0x1A, (byte) 0xFF, 0x4C, 0x00, 0x02, 0x15, (byte) 0xe2,
            (byte) 0xc5, 0x6d, (byte) 0xb5, (byte) 0xdf, (byte) 0xfb, 0x48, (byte) 0xd2, (byte) 0xb0, 0x60, (byte) 0xd0,
            (byte) 0xf5, (byte) 0xa7, 0x10, (byte) 0x96, (byte) 0xe0, 0x00, 0x00, 0x00, 0x00, (byte) 0xc5, 0x52, (byte) 0xab, (byte) 0x8d, 0x38, (byte) 0xa5};
    byte[] pattern = {0x02, 0x15};
    int startIndex = findAdPacketEnd(adPacket, pattern) + 1;
    if(startIndex == 0){ System.out.println("Pattern not found"); return;}
    int endIndex = startIndex + 21;
    ArrayList<Byte> tempArray = new ArrayList<Byte>();
    for(int i = startIndex; i<endIndex; i++){
        tempArray.add(adPacket[i]);
    }
    byte[] proxUUID = new byte[16];
    for(int i = 0; i<16; i++){
        proxUUID[i] = tempArray.get(i);
    }
    byte[] major = new byte[2];
    major[0] = tempArray.get(16);
    major[1] = tempArray.get(17);

    byte[] minor = new byte[2];
    minor[0] = tempArray.get(18);
    minor[1] = tempArray.get(19);
 ... 

我的findAdPacketEnd函数在哪里(效率最高但效果不错):

    private static int findAdPacketEnd(byte[] adPacket, byte[] pattern){
    //return -1 if pattern is too long
    if(adPacket.length < pattern.length)
        return -1;
    //iterate over  adPacket
    for(int i = 0; i<adPacket.length - pattern.length; i++){
        System.out.println("Searching Ad Packet");
        //iterate over pattern
        for(int j = 0; j<pattern.length; j++){
            //compare wherever you are in the adpacket to the pattern, break if it doesn't match
            if(adPacket[i+j] != pattern[j])
                break;
            // if you get to the end of the pattern and there wasn't a mismatch, return the index
            if(j == pattern.length-1)
                return i+pattern.length-1;
        }
    }
    //pattern not found
    return -1;
}