2014-02-17 3 views
0
나는 BT 낮은 에너지 수있는 수하물 경고 장치 ( Link) 함께 일하고 성공적으로 지금 docs 나는 다음 내 넥서스 7

노하우 안드로이드에 블루투스 LE 장치에 연결 (플랫폼 19)

와 페어링

다음 코드를 사용하여 장치에 연결하려고합니다.

private BluetoothGattCallback callback = new BluetoothGattCallback() { 
    @Override 
    public void onConnectionStateChange(BluetoothGatt gatt, int status, 
      int newState) { 
     Log.i(TAG, "le onConnectionStateChange ["+newState+"]"); 
     if (newState == BluetoothProfile.STATE_CONNECTED) { 
      Log.i(TAG, "le device connected"); 
      onConnect(gatt.getDevice()); 
     } else if (newState == BluetoothProfile.STATE_DISCONNECTED) { 
      Log.i(TAG, "le device disconnected"); 
      onDisconnect(gatt.getDevice()); 
     } 
    } 
    @Override 
    public void onServicesDiscovered (BluetoothGatt gatt, int status) { 
     Log.i(TAG, "onServicesDiscovered"); 
    } 
}; 


for (BluetoothDevice device : BluetoothAdapter.getDefaultAdapter().getBondedDevices()) { 
    int type = device.getType(); 

    if (type == BluetoothDevice.DEVICE_TYPE_LE || type == BluetoothDevice.DEVICE_TYPE_DUAL) { 
     List<BluetoothDevice> connectedDevices =  
     bluetoothManager.getConnectedDevices(BluetoothProfile.GATT); 

     if (!connectedDevices.contains(device)) { 
      BluetoothGatt gatt = device.connectGatt(App.getContext(), false, callback); 
      gatt.connect(); 
      gatt.discoverServices(); 
      List<BluetoothGattService> services = gatt.getServices(); 
     } 
    } 
} 

그러나 연결을 시작할 수 없습니다. 잠시 후 (몇 초) 연결 상태 이 BluetoothProfile.STATE_DISCONNECTED로 변경됩니다. 이는 BluetoothProfile.STATE_CONNECTED 에 결코 도달하지 않은 경우에도 마찬가지입니다. 내가 여기서 뭔가 잘못하고있는거야?

+0

장치를 연결하지 않고 연결할 수 있습니다. 실제로 gatt.connect()가 실행됩니까? 사용 가능한 장치가 이미 연결되어 있다고 가정하지 않고 검색을 시작하는 것이 더 일반적입니다. 너도 그걸 시도 할 수있어. –

+0

자세히 보아라, connectedDevices.contains (device). 위의 코드는 보세 장치 목록을 통해 현재 연결되어 있지 않은 장치와의 연결을 설정하려고 시도합니다. 루프의 코드가 실행되고 콜백이 호출되지만 BluetoothProfile에서는 호출되지 않습니다 .STATE_CONNECTED – fabian

+0

위의 설명과는 다른 점은 discoverServices 및 gattServices를 호출하지 않으려는 것입니다. 각 콜백을 기다리고 싶다면 getServices는 아무것도 반환하지 않습니다. 또한 신호 강도와 거리를 감지하기 위해 RSSI를 사용하는 태그에 연결하려고 했으므로 GATT 서버가 얼마나 잘 정의되어 있는지 확신 할 수 없습니다. – Zomb

답변

2

글쎄, 내 코드가 결국 올바른 것으로 밝혀졌습니다. 분명히 블루투스 스택이 이라는 오류 상태에 들어갔습니다.이 상태는 장치를 으로 껐다가 다시 켤 때만 복구 할 수있었습니다.

참고 : Nexus 7 기기가 있습니다. 초판 중 하나 (2012 년 말에 으로 나왔습니다)와 최근 기사 중 하나입니다.

2012 년 Nexus 7에서 Bluetooth Low Energy가 작동하지 않습니다. (전원을 껐다가 다시 켠 후에도 작동하지 않음).

두 기기 모두 Android 4.4.2를 실행 중입니다. 블루투스 저에너지 2012 넥서스 7에서 작동하고 현재 넥서스이 얼마나 매우 슬픈 7.

에 불안정하지 않는

내가 결론.

+0

안녕하세요, 같은 시나리오에 직면 한 문제를 해결할 수 있습니다. 5-6 요청 후 newState == BluetoothProfile.STATE_DISCONNECTED로 들어가지만 실제로 장치에 연결됩니다. –

+0

불행히도 없습니다. 이 주제에 대한 내 평결은 여전히 ​​Nexus 7 기기에서 블루투스 LE가 고장났다는 것입니다. – fabian

+0

나는 Google을 통해 Android와 관련된 문제를 발견했습니다. 이 링크를 확인하십시오 https://code.google.com/p/android/issues/list?can=2&q=ble&colspec=ID+Type+Status+Owner+Summary+Stars&cells=tiles –

0

문제는 안드로이드가 6 개의 최대 블루투스 연결 만 허용한다는 것입니다. 장치 연결이 끊어지면 mBluetoothGatt.close()를 호출해야합니다.

+0

이미 중지하십시오. – fabian

관련 문제