2017-11-20 8 views
0

내 앱에서 BLE central을 구현했습니다. 단계 :BLE onServicesDiscovered() 특성 배열을 반환하지 않습니다

  1. 이 BluetoothManager

    mBluetoothManager = (BluetoothManager) mContext.getSystemService (Context.BLUETOOTH_SERVICE)을 얻으십시오;

    mBluetoothAdapter = mBluetoothManager.getAdapter(); 장치

  2. 스캔

  3. 연결 장치

    mGatt = bluetoothDevice.connectGatt (이 거짓, gattCallback);

  4. 핸들 콜백 및 시작 서비스 검색 장치가 나는 서비스를 발견하는 호출을하고 연결되면

. 서비스가 나는

private final BluetoothGattCallback gattCallback = new BluetoothGattCallback() { 
    @Override 
    public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) { 
     Log.i("onConnectionStateChange", "Status: " + status); 
     switch (newState) { 
      case BluetoothProfile.STATE_CONNECTED: 
       Log.i("gattCallback", "STATE_CONNECTED"); 
       gatt.discoverServices(); 
       break; 

      case BluetoothProfile.STATE_DISCONNECTED: 
       mGatt = null; 
       mBluetoothSingleTonClass.saveGatt(mGatt); 
       deviceDisconnected(); 
       Log.e("gattCallback", "STATE_DISCONNECTED"); 
       break; 

      case BluetoothProfile.STATE_CONNECTING : 
       Log.e("gattCallback", "STATE_CONNECTING"); 
       break; 

      default: 
       Log.e("gattCallback", "STATE_OTHER"); 
     } 
    } 

    @Override 
    public void onServicesDiscovered(BluetoothGatt gatt, int status) { 

     List<BluetoothGattService> services = new ArrayList<>(); 
     services.addAll(gatt.getServices()); 

     Log.d("onServicesDiscovered", "uuid::" + gatt.getServices().get(0).getUuid()); 
     Log.d("onServicesDiscovered", "uuid::" + gatt.getServices().get(1).getUuid()); 
     Log.d("onServicesDiscovered", "uuid::" + gatt.getServices().get(2).getUuid()); 

     Log.d("onServicesDiscovered", "chars::" + gatt.getServices().get(2).getCharacteristics().size()); 
     Log.d("onServicesDiscovered", "chars::" + gatt.getServices().get(0).getCharacteristics().size()); 
     Log.d("onServicesDiscovered", "chars::" + gatt.getServices().get(1).getCharacteristics().size()); 


    } 
}; 

문제는 GATT입니다 그것을 잡기하고 발견되면

gatt.discoverServices(); 

나에게 장치가 모든 서비스를 제공하지만, 몇 가지 모바일에서 빈 특성 배열을주고있다. 예 : gatt.getServices().get(0).getCharacteristics().size() Nexus에서 정상적으로 작동했지만 며칠 후 크기가 0 인 빈 배열을 제공합니다. 잘못된 것이 있습니까? 이것이 모바일 문제입니까? 참조 링크가 도움이 될 것입니다.

+0

코드 첨부 –

답변

0

검색 절차 중 장치 연결이 끊어지면 빈 목록 (또는 너무 짧은 목록)이 표시 될 수 있습니다. 콜백의 상태 코드를 확인하고 서비스가 0 (성공)이면 유효하다고 가정해야합니다.

+0

예 확인했습니다. if (status == BluetoothGatt.GATT_SUCCESS) { Log.w (TAG, "onServices 성공 사례 :"+ status); } else { Log.w (TAG, "onServices 발견 된 오류 :"+ 상태); } 0을주고 있습니다 –

+0

이 경우 휴대 전화의 블루투스 스택이 버그가있을 수 있습니다. HCI 스 누프 로그를 검사하여 서비스가 올바르게보고되는지 확인해야하지만 나중에 스택이 잘못된 서비스를보고해야합니다. – Emil

+0

나는 적절한 서비스를 받고있다. 문제는 특성 ID와 관련이 있습니다. 주변기기에 연결하는 데 더 많은 시간이 걸립니다. 이것에 대한 해결책이 있습니까? –