干货分享:Android BLE 框架,简单易用,可能是迄今为止功能最全面的
https://github.com/a1anwang/okble
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);
}
};
//这里使用的android 4.3的API,android 5.0开始扫描API做了一点变化,为了获得更大的兼容性,我们依然使用的4.3的API。
//不需要兼容4.3的推荐使用android 5.0 的API,官方已经帮助我们封装了很多,使用起来更简单
这样扫描到的是所有的BLE设备,接下来要识别BLE设备是不是iBeacon设备
识别
识别就是通过扫描回调里的byte[] scandata来进行判断,判断依据就是苹果公司规定的iBeacon的广播格式:
iBeacon的广播格式
这个广播格式规定了iBeacon的广播数据是30个字节,第0,1,2字节是BLE4.0的协议固定格式,第3字节 length ,0x1A(16进制的1A等于10进制26)表示后面的数据是26个字节长度(3+1+26=30没毛病)。
再看第4字节名称是Type,数据0xFF,也是BLE4.0协议里的,顾名思义,0xFF表示的是一个类型,是厂商数据类型,表示后面的25个字节就是厂商数据(Manufacturer Data,BLE设备厂商可以自定义这部分数据,Manufacturer Data 由两部分构成:厂商id和数据部分)。Manufacturer Data里的前2个字节也就是第5-6字节,是厂商的id,固定占2个字节,苹果的公司id是0x004C(苹果公司向世界蓝牙组织申请的,不同的公司有