通过蓝牙低功耗无法发现服务和特性 - BLE

问题描述:

我正在研究蓝牙低功耗-BLE。通过蓝牙低功耗无法发现服务和特性 - BLE

我可以扫描并找出,使用BLE通过蓝牙连接到固件设备。

mBluetoothGatt = mAl.get(pos).connectGatt(mContext, false, mGattCallback);

虽然从Play商店应用可以发现ServicesCharacteristics固件设备里面,我的Android应用程序无法发现它们,它总是返回空的服务列表中。实际上固件设备已经设置了ServicesCharacteristics

我不知道为什么,谁知道是什么原因,请帮助我如何发现ServicesCharacteristics

谢谢

Java代码

// Various callback methods defined by the BLE API. 
    private final BluetoothGattCallback mGattCallback = new BluetoothGattCallback() { 
     @Override 
     public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) { 
      if (newState == BluetoothProfile.STATE_CONNECTED) { 
       /** 
       * In case already connected to Pas device 
       */ 
       Log.i("", "Connected to GATT server. " + gatt.discoverServices()); 
       // CALL THIS METHOD TO BEGIN DISCOVER SERVICES 
       gatt.discoverServices(); 

      } else if (newState == BluetoothProfile.STATE_DISCONNECTED) { 
       /** 
       * In case disconnected Pas device 
       */ 
       Log.i("", "Disconnected from GATT server."); 
      } 
     } 

     @Override 
     // New services discovered 
     public void onServicesDiscovered(BluetoothGatt gatt, int status) { 
      Log.i("", "onServicesDiscovered " + status + " " + gatt.discoverServices() 
        + " " + gatt.getServices()); 

      // RETURN : [] 
      Log.i("", "gatt.getServices() " + gatt.getServices()); 
      // RETURN : TRUE 
      Log.i("", "gatt.getServices() " + gatt.getServices().isEmpty()); 

      // EXCEPTION HAPPEN BCS SIZE = 0 
      gatt.readCharacteristic(gatt.getServices().get(0).getCharacteristics().get(0)); 

      if (status == BluetoothGatt.GATT_SUCCESS) { 
      } else { 
       Log.w("", "onServicesDiscovered received: " + status); 
      } 
     } 

     @Override 
     // Result of a characteristic read operation 
     public void onCharacteristicRead(
       BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, 
       int status) { 
      Log.i("", "onCharacteristicRead " + status + " " + characteristic); 

      if (status == BluetoothGatt.GATT_SUCCESS) { 
      } 
     } 
    }; 

// Device scan callback. 
     private BluetoothAdapter.LeScanCallback mLeScanCallback = 
       new BluetoothAdapter.LeScanCallback() { 
        @Override 
        public void onLeScan(final BluetoothDevice device, int rssi, 
             byte[] scanRecord) { 
         getActivity().runOnUiThread(new Runnable() { 
          @Override 
          public void run() { 
           /** 
           * Should show Scan Pas Devices : 
           * Add to array list scanned pas devices if it is not exist in list 
           * before 
           */ 
           if (!mAlPasDeviceNames.contains(device.getName())) { 
            mAlPasDevices.add(device); 
            mAlPasDeviceNames.add(device.getName()); 

            // set adapter and show on UI 
            mLv.setAdapter(new PasConnectionAdapter(
              getActivity(), 
              R.layout.simple_list_item_scan_pas_device, 
              mAlPasDevices)); 
           } 
          } 
         }); 
        } 
       }; 

logcat的

connect() - device: E2:5A:6B:5A:18:57, auto: false 
D/BluetoothGatt: registerApp() 
D/BluetoothGatt: registerApp() - UUID=93455863-c385-4563-9197-6592024cc8cc 
D/BtGatt.GattService: registerClient() - UUID=93455863-c385-4563-9197-6592024cc8cc 
D/BtGatt.GattService: onClientRegistered() - UUID=93455863-c385-4563-9197-6592024cc8cc, clientIf=5 
D/BluetoothGatt: onClientRegistered() - status=0 clientIf=5 
D/BtGatt.GattService: clientConnect() - address=E2:5A:6B:5A:18:57, isDirect=true 
E/BluetoothRemoteDevices: aclStateChangeCallback: Device is NULL 
D/BtGatt.GattService: onConnected() - clientIf=5, connId=5, address=E2:5A:6B:5A:18:57 
D/BluetoothGatt: onClientConnectionState() - status=0 clientIf=5 device=E2:5A:6B:5A:18:57 
D/BluetoothGatt: discoverServices() - device: E2:5A:6B:5A:18:57 
D/BtGatt.GattService: discoverServices() - address=E2:5A:6B:5A:18:57, connId=5 
I/: Connected to GATT server. true 
D/BluetoothGatt: discoverServices() - device: E2:5A:6B:5A:18:57 
D/BtGatt.GattService: discoverServices() - address=E2:5A:6B:5A:18:57, connId=5 
D/BtGatt.GattService: onSearchCompleted() - connId=5, status=0 
D/BtGatt.GattService: onSearchCompleted() - connId=5, status=0 
E/BtGatt.btif: bta_to_btif_uuid: Unknown UUID length 61618! 
E/BtGatt.btif: bta_to_btif_uuid: Unknown UUID length 61619! 
I/: gatt.getService(uuid) null 
D/BluetoothGatt: onSearchComplete() = Device=E2:5A:6B:5A:18:57 Status=0 
D/BluetoothGatt: discoverServices() - device: E2:5A:6B:5A:18:57 
D/BtGatt.GattService: discoverServices() - address=E2:5A:6B:5A:18:57, connId=5 
D/BtGatt.GattService: onSearchCompleted() - connId=5, status=0 
I/: onServicesDiscovered 0 true [] 
I/: gatt.getServices() [] 
I/: gatt.getServices() true 
E/BtGatt.btif: bta_to_btif_uuid: Unknown UUID length 61621! 
W/BluetoothGatt: Unhandled exception in callback 
W/BluetoothGatt: java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0 
W/BluetoothGatt:  at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255) 
W/BluetoothGatt:  at java.util.ArrayList.get(ArrayList.java:308) 
W/BluetoothGatt:  at ui.fragment.PasConnectionFragment$1.onServicesDiscovered(PasConnectionFragment.java:379) 
W/BluetoothGatt:  at android.bluetooth.BluetoothGatt$1.onSearchComplete(BluetoothGatt.java:304) 
W/BluetoothGatt:  at android.bluetooth.IBluetoothGattCallback$Stub.onTransact(IBluetoothGattCallback.java:217) 
W/BluetoothGatt:  at android.os.Binder.execTransact(Binder.java:446) 

有一个问题可能是您几次拨打gatt.discoverServices()。两次onConnectionStateChange方法:

Log.i("", "Connected to GATT server. " + gatt.discoverServices()); 
      // CALL THIS METHOD TO BEGIN DISCOVER SERVICES 
      gatt.discoverServices(); 

然后再次在onServicesDiscovered方法。

Log.i("", "onServicesDiscovered " + status + " " + gatt.discoverServices() 
       + " " + gatt.getServices()); 

这意味着您一次又一次地开始服务扫描。不要在Log中调用它,一次就足够了。

检查下面的代码,它会显示你servieces的数量和它的UUID的

@Override 
     public void onServicesDiscovered(BluetoothGatt gatt, int status) { 
      Log.e("BluetoothLeService", "onServicesDiscovered()"); 
      if (status == BluetoothGatt.GATT_SUCCESS) { 


       List<BluetoothGattService> gattServices = mBluetoothGatt.getServices(); 
       Log.e("onServicesDiscovered", "Services count: "+gattServices.size()); 

       for (BluetoothGattService gattService : gattServices) { 
        String serviceUUID = gattService.getUuid().toString(); 
        Log.e("onServicesDiscovered", "Service uuid "+serviceUUID); 
       } 


      } else { 
       Log.w(TAG, "onServicesDiscovered received: " + status); 
      } 
     }