我正在尝试编写一个与iBeacons接口的android应用程序,但我需要在字节数组中找到UUID / major / minor特征的开头。通过查看包括this question在内的几个资源,看起来所有iBeacons都会在字节数组中传输一些与iBeacons相同的模式。
我最近提出了另一个问题并得到了一个有用的答案,link here但是1)我还没有能够测试它的功能(等待我的设备)和2)我想要知道它是如何工作的。
所以我的问题:这种模式是什么?我可以通过搜索该数组的模式来找到它吗?并且UUID / Major / Minor是否始终是阵列中预定义数量的点,来自该识别模式?
谢谢!
答案 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;
}