之前的代码研究,Android主要是做为中央设备存在的,而且官方的例子好象也是基于Central的,抽一个时间研究了一下作为Peripheral的情况下,是如何编写代码的,Google查找了一番,发现作为Peripheral相对更简单多了,只是做个简单的广播,下面就几个点说一下,
- 权限设置同之前的一样,不变,
- 用之前IOS或者Android写的Central进行连接,我用的是IOS,Android没有测试,我相信应该是可以的,
这里面主要是一个MockServerCallBack的逻辑处理,可以参考后面的代码参考,主要的Activity的代码,参考如下:
private void initBroadCast(){
final BluetoothManager bluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
mBluetoothAdapter = bluetoothManager.getAdapter();
if(!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)){
Toast.makeText(this, R.string.ble_not_supported, Toast.LENGTH_SHORT).show();
}
//打开蓝牙的套路
if ((mBluetoothAdapter == null) || (!mBluetoothAdapter.isEnabled())) {
Toast.makeText(this, R.string.unknown_service, Toast.LENGTH_SHORT).show();
Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
this.startActivityForResult(enableBtIntent,0);
}
if (mBluetoothAdvertiser == null) {
mBluetoothAdvertiser = mBluetoothAdapter.getBluetoothLeAdvertiser();
}
mMockServerCallBack = new MockServerCallBack();
mGattServer = bluetoothManager.openGattServer(this, mMockServerCallBack);
try {
mMockServerCallBack.setupServices(mGattServer);
mBluetoothAdvertiser.startAdvertising(createAdvSettings(true, 0), createFMPAdvertiseData(),mAdvCallback);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static AdvertiseSettings createAdvSettings(boolean connectable, int timeoutMillis) {
AdvertiseSettings.Builder builder = new AdvertiseSettings.Builder();
//设置广播的模式,应该是跟功耗相关
builder.setAdvertiseMode(AdvertiseSettings.ADVERTISE_MODE_BALANCED);
builder.setConnectable(connectable);
builder.setTimeout(timeoutMillis);
builder.setTxPowerLevel(AdvertiseSettings.ADVERTISE_TX_POWER_HIGH);
return builder.build();
}
//设置一下FMP广播数据
public static AdvertiseData createFMPAdvertiseData() {
AdvertiseData.Builder builder = new AdvertiseData.Builder();
builder.setIncludeDeviceName(true);
AdvertiseData adv = builder.build();
return adv;
}
//发送广播的回调,onStartSuccess/onStartFailure很明显的两个Callback
private AdvertiseCallback mAdvCallback = new AdvertiseCallback() {
public void onStartSuccess(android.bluetooth.le.AdvertiseSettings settingsInEffect) {
if (settingsInEffect != null) {
Log.d(TAG, "onStartSuccess TxPowerLv="+ settingsInEffect.getTxPowerLevel()+ " mode=" + settingsInEffect.getMode()+ " timeout=" + settingsInEffect.getTimeout());
} else {
Log.d(TAG, "onStartSuccess, settingInEffect is null");
}
}
public void onStartFailure(int errorCode) {
Log.d(TAG, "onStartFailure errorCode=" + errorCode);
};
};
具体的源码下载:代码查看下载
入口Activity:BLEPeripheral