Sloppy's Blog

Android BLE作为外设的实例

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