区别于传统蓝牙,ibeacon是一项低耗能蓝牙技术,要求 安卓4.3以上版本,蓝牙4.0。
如果用传统蓝牙的代码,是搜索不到ibeacon设备的。而手机自带的蓝牙,一般都是传统蓝牙。所以有必要写写ibencon相关的code。
mAdapter.startLeScan(new BluetoothAdapter.LeScanCallback() {
public void onLeScan(final BluetoothDevice device, final int rssi, final byte[] scanRecord) {//code}
});
每搜索到一个ibeacon,就回掉onLeScan方法一次。startLeScan属于耗时操作,最好不要放在UI线程中。
关闭搜索的code:
mAdapter.stoptLeScan(BluetoothAdapter.LeScanCallback);从onLeScan方法的参数看,BluetoothDevice是搜索到的蓝牙设备,rssi是信号强度,scanRecord暂时不了解,不过通过它可以获取uuid。
通过rssi信号强度可以估计出大概的距离:
int absRssi = Math.abs(rssi); float power = (absRssi-59)/(10*2.0f); //59代表相隔一米时的rssi, 2.0代表环境衰减因子,需根据实际测试给出合适值。那如何获取uuid呢?
public String parseUUID(byte[] scanRecord) { int startByte = 2; boolean patternFound = false; while(startByte <=5 ) { if ( ((int) scanRecord[startByte + 2] & 0xff) == 0x02 && //Identifies an iBeacon ((int) scanRecord[startByte + 3] & 0xff) == 0x15) { //Identifies correct data length patternFound = true; break; } startByte++; } if (patternFound) { byte[] uuidBytes = new byte[16]; System.arraycopy(scanRecord,startByte+4,uuidBytes,0,16); String hexString = bytesToHexString(uuidBytes); String uuid = hexString.substring(0,8)+"-"+ hexString.substring(8,12)+"-"+ hexString.substring(12,16)+"-"+ hexString.substring(16,20)+"-"+ hexString.substring(20,32); return uuid; } else { return ""; } }