蓝牙开发经验小结——自动配对

场景:控制端——普通手机;被控制端——XX设备(无屏幕、无法用户操作、有系统权限)

蓝牙开启后查找设备有两种方式:搜索和指定mac。用搜索功能查找蓝牙设备,涉及“可见性”的概念,蓝牙对外可见(即能被别的蓝牙设备搜索到)最多可设置为300s(即5分钟),而指定mac的方式则没有时间限制,只要蓝牙开启就可以找到设备。因为XX设备与控制端需要随时能(配对)连接,显然搜索查找的方式,不适用于XX设备。因此只能选择指定mac地址的方式。

配对是建立连接的基础,任何从未配对过(或曾经配对但其中一方已删除配对关系)的设备都无法建立连接,因此配对无法绕过。配对的方式有输入pin码、输入密码、免输入的随机验证码等多种。当前XX设备与控制端的配对方式为免输入的随机验证码,两端确认6位数密码一致,点击“确认配对”即可完成配对。但由于XX设备无法用户交互,所以只能由程序完成确认实现自动配对——当然,XX设备只针对确定来源的请求(如XX助手)才默认同意并接受配对。

自动配对的实现(需系统权限):
权限声明:

<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.BLUETOOTH_PRIVILEGED" />
<uses-permission android:name="android.permission.ACCESS_BLUETOOTH_SHARE" />

注册广播:

IntentFilter filter = new IntentFilter();
filter.addAction(BluetoothDevice.ACTION_PAIRING_REQUEST);
filter.setPriority(1000);//注意设置优先级,否则无法拦截
context.registerReceiver(mReceiver, filter);

检查通过同意配对:

case BluetoothDevice.ACTION_PAIRING_REQUEST:
    BluetoothDevice btDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
    if (btDevice.getName().contains("你同意配对的蓝牙名称")) {
        Log.e("here", "OKOKOK");
        try {
            //1.确认配对
            ClsUtils.setPairingConfirmation(btDevice.getClass(), btDevice, true);
            //2.终止有序广播
            Log.i("order...", "isOrderedBroadcast:" + isOrderedBroadcast() + ",isInitialStickyBroadcast:" + isInitialStickyBroadcast());
            abortBroadcast();//如果没有将广播终止,则会出现一个一闪而过的配对框。
            //3.调用setPin方法进行配对...
            //boolean ret = ClsUtils.setPin(btDevice.getClass(), btDevice, pin);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    } else {
        Log.e("提示信息", "这个设备不是目标蓝牙设备");
    }
    break;

备注,关于ClsUtils有模板,网上随便搜索一下一大把,这里就不再赘述。

你可能感兴趣的:(原创)