2016-04-16 13 views
8

Próbuję połączyć się z termometrem Bluetooth LE. Podłączenie do urządzenia działa dobrze. Jedyną częścią, która mnie zawiesza jest gattCallBack i jest on na ColCharisticisticChanged/Read. "setNotification" i deskryptor "setValue" i "writeDescriptor" wszystkie zwracają true. Funkcja onCharacteristicChanged nigdy nie jest wywoływana, aby zwrócić wartość.Android BLE onCharacteristicRead i onCharacteristicChanged nigdy nie wzywano

Użyłem bardzo poręcznego małego programu ze Sklepu Play zwanego BLE Scanner, aby pomóc mi podać mi więcej informacji o urządzeniu i jego usługach i cechach.

enter image description here

To dlaczego po prostu ciężko kodowane serwis 2, charakterystyczny 0. Po prostu nie potrafię zrozumieć, dlaczego po I writeDescriptor, nie widzę niczego wracać. Interesujące jest to, że mogę wykorzystać niektóre inne cechy (jedną z nich jest interwał temperaturowy) i otrzymuję odpowiedź (chociaż dane są zniekształcone).

Również z ciekawości, dlaczego są 2 deskryptory Charakterystyka?

Ten kod znajduje się w mojej metodzie MainActivity. Nie jestem pewien, czy to by miało tutaj znaczenie. Sprawdziłem i wypróbowałem kilka metod opublikowanych tutaj bez powodzenia.

private final BluetoothGattCallback gattCallback = new BluetoothGattCallback() 
{ 
    @Override 
    public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) 
    { ... } 

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

     List<BluetoothGattService> services = mGatt.getServices(); 
     Log.i("onServicesDiscovered", services.toString()); 

     BluetoothGattCharacteristic characteristic = services.get(2).getCharacteristics().get(0); 

     mGatt.setCharacteristicNotification(characteristic, true); 

     BluetoothGattDescriptor descriptor = characteristic.getDescriptor(UUID.fromString(CLIENT_CHARACTERISTIC_CONFIG)); 
     descriptor.setValue(BluetoothGattDescriptor.ENABLE_INDICATION_VALUE); 

     mGatt.writeDescriptor(descriptor); 

    }    

    @Override 
    public void onCharacteristicRead(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) 
    { ... } 

    @Override 
    public void onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) 
    { ... } 
}; 

UPDATE: postanowiłem sprawdzić metodę onDescriptorWrite Log pewne informacje.

@Override    
public void onDescriptorWrite(BluetoothGatt gatt, BluetoothGattDescriptor descriptor, int status) 
    { 
     Log.i("descriptorWRITE", Integer.toString(status)); 
    } 

Ciekawe jest to, że powraca status 13, który jest "Operacja zapisu przekracza maksymalną długość atrybutu".

Będę się nad tym zastanawiać.

Odpowiedz

4

Znalazłem problem tutaj. Zakładałem, że termometr korzystał ze standardowej usługi BLE i konfiguracji charakterystycznej. Nie jest. Stworzyli własną niestandardową charakterystykę. Gdy przełączyłem się na tę charakterystykę, zaczęła strzelać metoda "zmieniona".

0

Myślę, że brakuje Ci mGatt.readCharacteristic(characteristic).

Po wywołaniu będzie czekać na zakończenie odczytu i zadzwonić pod numer onCharacteristicRead.

Powiązane problemy