android 从4.3系统开始可以连接BLE设备,这个大家都知道了。iOS是从7.0版本开始支持BLE。
android 进入5.0时代时,开放了一个新功能,手机可以模拟设备发出BLE广播, 这个新功能其实是 对标于 iOS系统的手机模拟iBeacon设备。
先介绍一下BLE的广播, BLE设备之所以能被手机扫描到,是因为 BLE设备一直在每隔 一段时间广播一次,这个广播里面包含很多数据。
手机扫描BLE设备代码如下:
public void startScan(){
bluetoothAdapter.startLeScan(leScanCallback);
}
public void stopScan(){
bluetoothAdapter.stopLeScan(leScanCallback);
}
private LeScanCallback leScanCallback=new LeScanCallback() {
@Override
public void onLeScan(BluetoothDevice bluetoothdeivce, int rssi, byte[] scandata) {
//把byte数组转成16进制字符串,方便查看
Log.e("TAG","scandata:"+ CYUtils.Bytes2HexString(scandata));
}
};
ok,这段代码大家在做连接BLE设备进行通讯的时候,已经很熟悉了。其中的 byte数组 scandata就是 BLE设备的广播数据。
那么接下来,我们开始使用 手机1 模拟成BLE设备来发送广播,然后用手机2 来进行扫描查看广播数据 scandata
首先获取 BluetoothAdapter, 熟悉的代码:
BluetoothManager bluetoothManager = (BluetoothManager)getSystemService(Context.BLUETOOTH_SERVICE);
bluetoothAdapter = bluetoothManager.getAdapter();
进行广播的时候需要用到BluetoothLeAdvertiser,进行实例化:
mBluetoothLeAdvertiser = bluetoothAdapter.getBluetoothLeAdvertiser();
实例化好之后就可以进行广播数据了,开启广播方法是:
BluetoothLeAdvertiser:
public void startAdvertising(AdvertiseSettings settings,
AdvertiseData advertiseData, final AdvertiseCallback callback)
其中, AdvertiseSettings 是广播的一些设置,比如,广播间隔,是否可以连接等等; AdvertiseData 就是广播数据了, AdvertiseCallback是广播回调,会告诉你广播成功还是失败。
先给一段完整广播代码如下:
public void startAction(View v){
byte[] broadcastData ={0x34,0x56};
mBluetoothLeAdvertiser.startAdvertising(createAdvSettings(true, 0), createAdvertiseData(broadcastData), mAdvertiseCallback);
}
public void stopAction(View v) {
mBluetoothLeAdvertiser.stopAdvertising(mAdvertiseCallback);
}
public AdvertiseSettings createAdvSettings(boolean connectable, int timeoutMillis) {
AdvertiseSettings.Builder mSettingsbuilder = new AdvertiseSettings.Builder();
mSettingsbuilder.setAdvertiseMode(AdvertiseSettings.ADVERTISE_MODE_LOW_LATENCY);
mSettingsbuilder.setConnectable(connectable);
mSettingsbuilder.setTimeout(timeoutMillis);
AdvertiseSettings mAdvertiseSettings = mSettingsbuilder.build();
return mAdvertiseSettings;
}
public AdvertiseData createAdvertiseData(byte[] data) {
AdvertiseData.Builder mDataBuilder = new AdvertiseData.Builder();
mDataBuilder.addManufacturerData(0x01AC, data);
AdvertiseData mAdvertiseData = mDataBuilder.build();
return mAdvertiseData;
}
private AdvertiseCallback mAdvertiseCallback = new AdvertiseCallback() {
@Override
public void onStartSuccess(AdvertiseSettings settingsInEffect) {
super.onStartSuccess(settingsInEffect);
ToastUtils.showToast(MainActivity.this, "开启广播成功", 2000);
}
@Override
public void onStartFailure(int errorCode) {
super.onStartFailure(errorCode);
ToastUtils.showToast(MainActivity.this, "开启广播失败 errorCode:" + errorCode, 2000);
}
};
其中,广播数据broadcastData 我暂时直接先定死为2个字节 0x3456,同样在createAdvertiseData里面
也有定死的数据 0x01AC . 开启成功之后
我们使用手机2 来扫描看下广播的数据是什么: