之前的代码研究,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