2016-12-07 26 views
6

używam następujących reagować bibliotekę react-native-ble-managerBle-coraz kod błędu - 128 pisząc do characterstic

Staram się wykonywać operacje odczytu i zapisu na BLE device.I jestem w stanie wykonać pomyślnie operacji odczytu. Ale otrzymuję kod błędu 128 podczas zapisu do urządzenia BLE.

pierwszy, jestem umożliwiając powiadomienie o typowe -

BleManager.startNotification(peripheralId, serviceId, characteristicId) 

Pisanie jest tak -
Konwersja 'hex' wartości do base64 String -

const base64String = new Buffer('0x00B00050D0', 'hex').toString('base64'); 

    BleManager.write(peripheralId, serviceId, characteristicId, base64Value) 

napisać kod błędu powrót operacja -128

:(

AKTUALIZACJA - Jest to fragment kodu, aby rozpocząć zgłoszenie i napisać value- pełną dokumentację można znaleźć tutaj- BluetoothLeService.java

public void writeCharacteristic(BleCharacteristic bleCharacteristic, String inputValue) { 

    if (mBluetoothAdapter == null || mBluetoothGatt == null) { 
     Log.w(TAG, "BluetoothAdapter not initialized"); 
     return; 
    } 

    if (!bleCharacteristic.isNotificationStarted()) { 
     Log.w(TAG, "Notification not started please start notification"); 
     return; 
    } 

    BluetoothGattCharacteristic bluetoothGattCharacteristic = bleCharacteristic.getBluetoothGattCharacteristic(); 
    bluetoothGattCharacteristic.setValue(inputValue); 
    mBluetoothGatt.writeCharacteristic(bluetoothGattCharacteristic); 
} 

public void setCharacteristicNotification(BleCharacteristic bleCharacteristic) { 
    if (mBluetoothAdapter == null || mBluetoothGatt == null) { 
     Log.w(TAG, "BluetoothAdapter not initialized"); 
     return; 
    } 
    boolean enable = !bleCharacteristic.isNotificationStarted(); 
    Log.d(TAG, "setCharacteristicNotification(device=" + mBluetoothDeviceAddress + ", UUID=" 
      + bleCharacteristic.getUUID().toString() + ", enable=" + enable + ")"); 
    BluetoothGattCharacteristic characteristic = mBluetoothGatt.getService(bleCharacteristic.getServiceUUID()).getCharacteristic(bleCharacteristic.getUUID()); 
    mBluetoothGatt.setCharacteristicNotification(characteristic, enable); 
    BluetoothGattDescriptor descriptor = characteristic.getDescriptor(UUID.fromString(SampleGattAttributes.CLIENT_CHARACTERISTIC_CONFIG)); 
    descriptor.setValue(enable ? BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE : new byte[]{0x00, 0x00}); 
    boolean result = mBluetoothGatt.writeDescriptor(descriptor); 
    bleCharacteristic.setNotificationStarted(result); 
    Log.d(TAG, "setCharacteristicNotification(device=" + mBluetoothDeviceAddress + ", UUID=" 
      + bleCharacteristic.getUUID().toString() + ", enabled=" + result + ")"); 
} 
+0

Zgodnie [to], (https://android.googlesource.com/platform/external/bluetooth/bluedroid/+/android-5.1. 0_r1/stack/include/gatt_api.h # 49) ten błąd oznacza 'GATT_NO_RESOURCES'. Nie jestem pewien, co to oznacza: – Distjubo

+0

Po prostu z ciekawości, co się stanie, gdy użyjesz 'writeWithoutResponse' zamiast' write'? Czy to rozwiązuje twój problem? – Distjubo

+0

@Distjubo Próbowałem go z writeWithoutResponse i nie wyrzucił żadnego błędu, ale problemy są 1. Oczekuję odpowiedzi po napisaniu 2. Typem charakterystycznym jest Zapisywalny, nie pisząc z odpowiedzią – Subham

Odpowiedz

2

Jest to błąd brak zasobów. Czy jesteś pewien, że napisałeś deskryptor? Jeśli nie ustawisz deskryptora (BluetoothGattDescriptor) i po prostu napiszesz, otrzymasz ten błąd.

Oto przykład:

protected static final UUID CHARACTERISTIC_UPDATE_NOTIFICATION_DESCRIPTOR_UUID = UUID.fromString("00002902-0000-1000-8000-00805f9b34fb"); 

public boolean setCharacteristicNotification(BluetoothDevice device, UUID serviceUuid, UUID characteristicUuid, 
     boolean enable) { 
    if (IS_DEBUG) 
     Log.d(TAG, "setCharacteristicNotification(device=" + device.getName() + device.getAddress() + ", UUID=" 
       + characteristicUuid + ", enable=" + enable + ")"); 
    BluetoothGatt gatt = mGattInstances.get(device.getAddress()); //I just hold the gatt instances I got from connect in this HashMap 
    BluetoothGattCharacteristic characteristic = gatt.getService(serviceUuid).getCharacteristic(characteristicUuid); 
    gatt.setCharacteristicNotification(characteristic, enable); 
    BluetoothGattDescriptor descriptor = characteristic.getDescriptor(CHARACTERISTIC_UPDATE_NOTIFICATION_DESCRIPTOR_UUID); 
    descriptor.setValue(enable ? BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE : new byte[] { 0x00, 0x00 }); 
    return gatt.writeDescriptor(descriptor); //descriptor write operation successfully started? 
} 

Source

+0

Tak, robię to w podobny sposób. Najpierw włączam powiadamianie o charakterystyce i próbuję pisać. Ale zawsze zwraca kod błędu -128. Wkrótce też opublikuję mój kod. – Subham

+0

OK, daj mi znać, gdy zaktualizujesz wpis, używając najnowszego kodu. – Faraz

+0

Przesłałem tutaj mój kod - https: //github.com/shubhapp/BleManager/blob/master/Application/src/main/java/com/km2/blemanager/connection/BleConnectionManager.java. Dziś zauważyłem jedną rzecz - kiedy próbuję pisać po raz pierwszy, otrzymuję status 128, ale potem, że zawsze otrzymuję status 0, dopóki się nie odłączę i nie połączę ponownie. Ale nigdy nie otrzymałem żadnej wartości wyjściowej – Subham