Skip to content

扫描及连接

Lijian edited this page May 19, 2018 · 3 revisions

配置扫描规则

`void initScanRule(BleScanRuleConfig scanRuleConfig)`

    BleScanRuleConfig scanRuleConfig = new BleScanRuleConfig.Builder()
            .setServiceUuids(serviceUuids)      // 只扫描指定的服务的设备,可选
            .setDeviceName(true, names)         // 只扫描指定广播名的设备,可选
            .setDeviceMac(mac)                  // 只扫描指定mac的设备,可选
            .setAutoConnect(isAutoConnect)      // 连接时的autoConnect参数,可选,默认false
            .setScanTimeOut(10000)              // 扫描超时时间,可选,默认10秒;小于等于0表示不限制扫描时间
            .build();
    BleManager.getInstance().initScanRule(scanRuleConfig);

Tips:
- 在扫描设备之前,可以配置扫描规则,筛选出与程序匹配的设备
- 不配置的话均为默认参数
- 在2.1.2版本及之前,必须先配置过滤规则再扫描;在2.1.3版本之后可以无需配置,开启默认过滤规则的扫描。

扫描

`void scan(BleScanCallback callback)`

    BleManager.getInstance().scan(new BleScanCallback() {
        @Override
        public void onScanStarted(boolean success) {
			// 开始扫描(主线程)
        }

        @Override
        public void onScanning(BleDevice bleDevice) {
			// 扫描到一个符合扫描规则的BLE设备(主线程)
        }

        @Override
        public void onScanFinished(List<BleDevice> scanResultList) {
			// 扫描结束,列出所有扫描到的符合扫描规则的BLE设备(主线程)
        }
    });

Tips:
- 扫描及过滤过程是在工作线程中进行,所以不会影响主线程的UI操作,最终每一个回调结果都会回到主线程。

通过设备对象连接

通过扫描到的BleDevice对象进行连接。

`BluetoothGatt connect(BleDevice bleDevice, BleGattCallback bleGattCallback)`

    BleManager.getInstance().connect(bleDevice, new BleGattCallback() {
        @Override
        public void onStartConnect() {
			// 开始连接
        }

        @Override
        public void onConnectFail(BleDevice bleDevice, BleException exception) {
			// 连接失败
        }

        @Override
        public void onConnectSuccess(BleDevice bleDevice, BluetoothGatt gatt, int status) {
			// 连接成功,BleDevice即为所连接的BLE设备
        }

        @Override
        public void onDisConnected(boolean isActiveDisConnected, BleDevice bleDevice, BluetoothGatt gatt, int status) {
			// 连接中断,isActiveDisConnected表示是否是主动调用了断开连接方法
        }
    });

Tips:
- 在某些型号手机上,connectGatt必须在主线程才能有效。非常建议把连接过程放在主线程。
- 连接失败后重连:框架中包含连接失败后的重连机制,可以配置重连次数和时间间隔。当然也可以自行在`onConnectFail`回调方法中延时调用`connect`方法。
- 连接断开后重连:可以在`onDisConnected`回调方法中再次调用`connect`方法。
- 为保证重连成功率,建议断开后间隔一段时间之后进行重连。
- 某些机型上连接失败后会短暂地无法扫描到设备,可以通过设备对象或设备mac直连,而不经过扫描。

通过Mac连接

通过已知设备Mac直接

`BluetoothGatt connect(String mac, BleGattCallback bleGattCallback)`

    BleManager.getInstance().connect(mac, new BleGattCallback() {
        @Override
        public void onStartConnect() {
			// 开始连接
        }

        @Override
        public void onConnectFail(BleDevice bleDevice, BleException exception) {
			// 连接失败
        }

        @Override
        public void onConnectSuccess(BleDevice bleDevice, BluetoothGatt gatt, int status) {
			// 连接成功,BleDevice即为所连接的BLE设备
        }

        @Override
        public void onDisConnected(boolean isActiveDisConnected, BleDevice bleDevice, BluetoothGatt gatt, int status) {
			// 连接中断,isActiveDisConnected表示是否是主动调用了断开连接方法
        }
    });

Tips:
- 此方法可以不经过扫描,尝试直接连接周围复合该Mac的BLE设备。
- 在很多使用场景,我建议APP保存用户惯用设备的Mac,然后使用该方法进行连接可以大大提高连接效率。

扫描并连接

扫描到首个符合扫描规则的设备后,便停止扫描,然后连接该设备。

`void scanAndConnect(BleScanAndConnectCallback callback)`

    BleManager.getInstance().scanAndConnect(new BleScanAndConnectCallback() {
        @Override
        public void onScanStarted(boolean success) {
			// 开始扫描(主线程)
        }

        @Override
        public void onScanFinished(BleDevice scanResult) {
			// 扫描结束,结果即为扫描到的第一个符合扫描规则的BLE设备,如果为空表示未搜索到(主线程)
        }

        @Override
        public void onStartConnect() {
			// 开始连接(主线程)
        }

        @Override
        public void onConnectFail(BleDevice bleDevice,BleException exception) {
			// 连接失败(主线程)
        }

        @Override
        public void onConnectSuccess(BleDevice bleDevice, BluetoothGatt gatt, int status) {
			// 连接成功,BleDevice即为所连接的BLE设备(主线程)
        }

        @Override
        public void onDisConnected(boolean isActiveDisConnected, BleDevice device, BluetoothGatt gatt, int status) {
			// 连接断开,isActiveDisConnected是主动断开还是被动断开(主线程)
        }
    });

Tips:
- 扫描及过滤过程是在工作线程中进行,所以不会影响主线程的UI操作,但每一个回调结果都会回到主线程。 连接操作会在主线中进行。  

中止扫描

扫描过程中,中止扫描操作

`void cancelScan()`

	BleManager.getInstance().cancelScan();

Tips:
- 调用该方法后,如果当前还处在扫描状态,会立即结束,并回调`onScanFinished`方法。