美文网首页Android 蓝牙
Android蓝牙协议-蓝牙配对与连接

Android蓝牙协议-蓝牙配对与连接

作者: Galileo_404 | 来源:发表于2017-08-21 00:19 被阅读587次

蓝牙设备在连接前,会先检查设备是否已经配对过,如果没有则先配对,配对完成后,再开始连接。

onPreferenceTreeClick

蓝牙连接开始于设备列表 DeviceListPreferenceFragment的onPreferenceTreeClick方法。
DeviceListPreferenceFragment是蓝牙设备列表,点击其中一个蓝牙设备,开始蓝牙的连接过程。

    @Override
    public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen,
            Preference preference) {
        if (KEY_BT_SCAN.equals(preference.getKey())) {
            mLocalAdapter.startScanning(true);
            return true;
        }

        if (preference instanceof BluetoothDevicePreference) {
            BluetoothDevicePreference btPreference = (BluetoothDevicePreference) preference;
            CachedBluetoothDevice device = btPreference.getCachedDevice();
            mSelectedDevice = device.getDevice();
            //配对连接
            onDevicePreferenceClick(btPreference);
            return true;
        }

        return super.onPreferenceTreeClick(preferenceScreen, preference);
    }

调用onDevicePreferenceClick方法,接着调用BluetoothDevicePreference的onClicked方法,开始连接,以及连接前的状态检测。

BluetoothDevicePreference.onClicked

    void onClicked() {
        //选中设备的绑定状态
        int bondState = mCachedDevice.getBondState();
        //已连接,询问是否连接
        if (mCachedDevice.isConnected()) {
            askDisconnect();
        } else if (bondState == BluetoothDevice.BOND_BONDED) {
            mCachedDevice.connect(true);
        } else if (bondState == BluetoothDevice.BOND_NONE) {
            //配对
            pair();
        }
    }

获取mCachedDevice的绑定状态,

  • 已经连接,是否断开
  • 未连接,已经绑定,开始连接
  • 未连接,未绑定,开始配对

开始蓝牙配对流程

CachedBluetoothDevice.startPairing

pair方法会调用CachedBluetoothDevice.startPairing,启动配对

    public boolean startPairing() {
        // Pairing is unreliable while scanning, so cancel discovery
        //配对时,取消搜索
        if (mLocalAdapter.isDiscovering()) {
            mLocalAdapter.cancelDiscovery();
        }
        //开始配对配对
        if (!mDevice.createBond()) {
            return false;
        }
        //标识位,配对完成后,自动连接
        mConnectAfterPairing = true;  // auto-connect after pairing
        return true;
    }

createBond调用BluetoothDevice.createBond方法,BluetoothDevice.createBond接着调用IBluetooth.createBond方法,下面会调用蓝牙远程服务。
和蓝牙扫描一样,实现IBluetooth接口的类是AdapterServiceBinder,

AdapterServiceBinder extends IBluetooth.Stub

AdapterServiceBinder实现IBluetooth.Stub接口,并且是AdapterService的私有内部类,AdapterServiceBinder接受事件,都会转交AdapterService处理,所以IBluetooth.createBond方法会调用AdapterService.createBond方法。

AdapterService.createBond

     boolean createBond(BluetoothDevice device, int transport) {
        enforceCallingOrSelfPermission(BLUETOOTH_ADMIN_PERM,
            "Need BLUETOOTH ADMIN permission");
        DeviceProperties deviceProp = mRemoteDevices.getDeviceProperties(device);
         //属性检查
        if (deviceProp != null && deviceProp.getBondState() != BluetoothDevice.BOND_NONE) {
            return false;
        }

        // Pairing is unreliable while scanning, so cancel discovery
        // Note, remove this when native stack improves
         //再次取消扫描
        cancelDiscoveryNative();
        //将配对任务转交状态机处理
        Message msg = mBondStateMachine.obtainMessage(BondStateMachine.CREATE_BOND);
        msg.obj = device;
        msg.arg1 = transport;
        mBondStateMachine.sendMessage(msg);
        return true;
    }

createBond方法会检查一下远程设备属性信息,再次取消蓝牙扫描任务,将配对任务转交mBondStateMachine,由状态机处理该信息。
BondStateMachine状态机的初始状态是StableState,所以BondStateMachine.CREATE_BOND由StableState处理,StableState在processMessage中调用BondStateMachine.createBond方法

BondStateMachine.createBond

    private boolean createBond(BluetoothDevice dev, int transport, boolean transition) {
        if (dev.getBondState() == BluetoothDevice.BOND_NONE) {
            infoLog("Bond address is:" + dev);
            byte[] addr = Utils.getBytesFromAddress(dev.getAddress());
            //调用createBondNative JNI方法
            if (!mAdapterService.createBondNative(addr, transport)) {
                //发送正在绑定的广播
                sendIntent(dev, BluetoothDevice.BOND_NONE,
                           BluetoothDevice.UNBOND_REASON_REMOVED);
                return false;
            } else if (transition) {
                transitionTo(mPendingCommandState);
            }
            return true;
        }
        return false;
    }

JNI 方法

createBondNative方法实现com_android_bluetooth_btservice_AdapterService.cpp中

相关文章

  • Android蓝牙协议-蓝牙配对与连接

    蓝牙设备在连接前,会先检查设备是否已经配对过,如果没有则先配对,配对完成后,再开始连接。 onPreference...

  • android bluetooth——蓝牙的开启、搜索、配对与连

    android bluetooth——蓝牙的开启、搜索、配对与连接 在连接一次后退出再连接蓝牙设备时会报以下错误:...

  • 蓝牙ble

    绑定、配对、连接蓝牙4.0BLE介绍_casuallystone_新浪博客 Android_低功耗 Android...

  • Bluetooth和苹果MFi认证相关总结

    背景:公司开发项目中需要手机app连接配对手表类的蓝牙设备,android设备很容易就跟蓝牙设备连接了,但是苹果手...

  • iOS-蓝牙项目经验总结(上)

    蓝牙开发中碰到的几个技术点: 0),蓝牙协议制定; 1),蓝牙密钥配对; 2),获取蓝牙Mac地址; 3),实时...

  • 蓝牙连接

    蓝牙门控使用须知 1、连接蓝牙必须打开手机蓝牙和定位服务,在设备蓝牙范围内进行配对。 2、初次连接初始密码(000...

  • Android 蓝牙设备通讯

    Android 蓝牙设备通讯的开发(配对/连接/传输数据)http://blog.csdn.net/qq_3055...

  • Android 经典蓝牙开发(二)

    本文章经典蓝牙开发目录: 1、权限申请2、开启蓝牙3、扫描蓝牙4、配对蓝牙5、连接蓝牙6、通信(实现双向通信)(我...

  • 蓝牙自动连接实现

    实现的主要功能(蓝牙配对成功如何与远程设备一直连接) 1.当蓝牙配对成功连接时,断开远程端设备会自动连接2.当设备...

  • Android蓝牙API介绍

    引用自:Android蓝牙API 1.简介 通过蓝牙API,可以实现以下内容: 扫描其他蓝牙设备 查询配对蓝牙设备...

网友评论

    本文标题:Android蓝牙协议-蓝牙配对与连接

    本文链接:https://www.haomeiwen.com/subject/vjdeqxtx.html