android 蓝牙之:ibeacon

区别于传统蓝牙,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 "";
    }
}

你可能感兴趣的:(android 蓝牙之:ibeacon)