您的足迹:首页 > 蓝牙BLE >android 扫描识别iBeacon设备

android 扫描识别iBeacon设备

iBeacon其实就是在BLE的基础上把广播包的数据格式化了一下。

贴上一张iBeacon广播协议:


就是规定了广播数据。


说到底iBeacon也是一个BLE设备,所以扫描方法也是 BLE的扫描

先看一下扫描代码:

 bluetoothAdapter.startLeScan( leScanCallback);  
 private LeScanCallback leScanCallback=new LeScanCallback() { 
         @Override 
         public void onLeScan(BluetoothDevice bluetoothdeivce, int rssi, byte[] scandata) {
                //把byte数组转成16进制字符串,方便查看 
                Log.e("TAG","scandata:"+ Bytes2HexString(scandata) +" rssi:"+rssi);
         } 
 };

这个扫描方法在android5.0以上显示过期了,新的替代扫描使用请看我另一片文章android BLE 扫描BLE设备 BluetoothLeScanner,为了向下兼容,我们还是使用旧的扫描方法。

扫描回调里的 byte[] scandata 就是BLE设备的广播包了,可以根据这个byte[]来判断出 这个设备是不是iBeacon设备,并且解析出uuid,major,minor,等信息。


解析很简单,直接上代码:


if(scandata[5]==0x4C&&scandata[6]==0x00&&scandata[7]==0x02&&scandata[8]==0x15) {
			byte[] uuidValue=new byte[16];
			System.arraycopy(scandata, 9, uuidValue, 0, 16);
			String uuid="";
			String hexStr=CYUtils.Bytes2HexString(uuidValue);
			uuid=hexStr.substring(0, 8);
			uuid+="-";
			uuid+=hexStr.substring(8, 12);
			uuid+="-";
			uuid+=hexStr.substring(12, 16);
			uuid+="-";
			uuid+=hexStr.substring(16, 20);
			uuid+="-";
			uuid+=hexStr.substring(20, 32);
			int major=CYUtils.byteToInt(scandata[25], scandata[26]);
			int minor=CYUtils.byteToInt(scandata[27], scandata[28]);
                        int measuredPower= scandata[29];
}

通过 5,6,7,8这4个字节来判断这个BLE设备是不是iBeacon设备,然后分别对UUID,和major,minor进行解析。

有同学可能注意到上面的 if 语句里面 scandata[5]==0x4C&&scandata[6]==0x00 和图片上的协议 5-6字节 0x004C 是倒过来的,没错,就是倒过来的,关于广播数据的详细分析可以看我另一篇文章《android BLE Peripheral 手机模拟设备发出BLE广播 BluetoothLeAdvertiser


好了,下面是福利时间,对iBeacon扫描做了一个封装,使用起来非常简单:


public class MainActivity extends AppCompatActivity implements BeaconManager.BeaconListener {
    
    BeaconManager beaconManager;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        beaconManager = new BeaconManager(this);
        beaconManager.setBeaconListener(this);
        
    }


    public void scanAction(View v) {
        beaconManager.startScanBeacon();
    }

    //扫描回调
    @Override
    public void onScanBeacon(Beacon beacon) {
        Log.e(TAG, "  beacon设备:" + beacon.toString());
    }

}
ok,下面奉上Beacon扫描仪的源代码 下载地址:http://pan.baidu.com/s/1c2EJ6Y

预览图:


关于iBeacon, ios里面还有区域CLBeaconRegion,退出区域,进入区域的概念,这个后面给大家讲解android如何来实现。


本博客所有文章如无特别注明均为原创。作者:AlanWang复制或转载请以超链接形式注明转自 AlanWang的博客-专注android和蓝牙BLE技术分享
原文地址《android 扫描识别iBeacon设备

相关推荐

发表评论

路人甲 表情
看不清楚?点图切换 Ctrl+Enter快速提交

网友评论(0)