xiaoyaoyou1212 / BLE

✨Android BLE基础操作框架,基于回调,操作简单。包含扫描、多连接、广播包解析、服务读写及通知等功能。
http://www.huwei.tech/
Apache License 2.0
1.39k stars 365 forks source link

无法扫描指定 UUID 的设备!? #37

Closed yaoxin2017 closed 6 years ago

yaoxin2017 commented 6 years ago

初始化之后,调用以下代码查找指定服务UUID的设备,始终查不到(但是按照设备名称可以查到): ViseBle.getInstance().startLeScan(new UuidFilterScanCallback(new IScanCallback() { @Override public void onDeviceFound(BluetoothLeDeviceStore bluetoothLeDeviceStore) {

            List<BluetoothLeDevice> bleList =  bluetoothLeDeviceStore.getDeviceList();
            for(BluetoothLeDevice ble:bleList){
                System.out.println("onDeviceFound > "+ ble.getName() + " uuid = "+ ble.getDevice().getUuids());
            }
        }

        @Override
        public void onScanFinish(BluetoothLeDeviceStore bluetoothLeDeviceStore) {
            System.out.println("onScanFinish ");
        }

        @Override
        public void onScanTimeout() {
            System.out.println("onScanTimeout ");
        }
    }).setUuid("0000fe55-0000-1000-8000-00805f9b34fb"));

我看了源码是这样过滤的: public BluetoothLeDeviceStore onFilter(BluetoothLeDevice bluetoothLeDevice) { if (bluetoothLeDevice != null && bluetoothLeDevice.getDevice() != null && bluetoothLeDevice.getDevice().getUuids() != null && bluetoothLeDevice.getDevice().getUuids().length > 0) { for (ParcelUuid parcelUuid : bluetoothLeDevice.getDevice().getUuids()) { if (uuid != null && uuid == parcelUuid.getUuid()) { bluetoothLeDeviceStore.addDevice(bluetoothLeDevice); } } } return bluetoothLeDeviceStore; } 但是bluetoothLeDevice.getDevice().getUuids()返回一直是null,貌似在服务连接前该值一直是null!

xiaoyaoyou1212 commented 6 years ago

@yaoxin2017 这个需要看你的UUID匹配的具体是哪个值,如果该过滤条件不能满足那么需要自定义一个过滤规则。

yaoxin2017 commented 6 years ago

自定义也无法过滤!因为当搜索到蓝牙设备时的回调中bluetoothLeDevice.getDevice().getUuids()返回一直是null,也即是在回调方法内无法获取到蓝牙的UUID。

xiaoyaoyou1212 commented 6 years ago

@yaoxin2017 我的意思是你要找到具体匹配的规则,我那个规则针对的UUID是设备本身的UUID,按照你的问题描述你匹配的UUID应该是要服务UUID,这个UUID是否在连接前就能获取,如果可以获取具体是放到什么地方,据我所知一般情况服务UUID是放到广播包中,可以通过广播包解析获得,而如果不能在连接前获取肯定就无法实现这个需求。