______________________________________________________________
Android BLE 框架发布,功能全面,简单易用:
https://github.com/a1anwang/okble
______________________________________________________________
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如何来实现。
原文地址《android 扫描识别iBeacon设备》
发表评论