Android BLE, не могу толком написать характеристику

Я работаю над проектом Android, который должен подключить Nexus 7 и биосенсор через ссылку BLE. Проблема в том, что я могу успешно обнаружить и получить список сервисов и характеристик датчика. Когда я записываю некоторые данные в конкретную характеристику, автоматически вызывается onCharacteristicWrite и показывает, что операция записи прошла успешно. Однако сенсор никогда ничего не получает от планшета. И если я использую подобное приложение на iPhone, все работает нормально. Так что проблем с устройством нет. Кто-нибудь знает о проблеме?

Вот мой код для записи:

 private final BluetoothGattCallback mGattCallback = new BluetoothGattCallback() {
    @Override
    public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
        if (newState == BluetoothProfile.STATE_CONNECTED) {
            mConnected = true;
            Log.i(TAG, "Connected to GATT server.");
            // Attempts to discover services after successful connection.
            Log.i(TAG, "Attempting to start service discovery:" +
                    mBluetoothGatt.discoverServices());

        } else if (newState == BluetoothProfile.STATE_DISCONNECTED) {
            mConnected = false;
            Log.i(TAG, "Disconnected from GATT server.");
        }
    }

    @Override
    public void onServicesDiscovered(BluetoothGatt gatt, int status) {
        if (status == BluetoothGatt.GATT_SUCCESS) {

         //Once detected services, write to characteristic for 6 times.
          int count =6;
            while(count>0){

              writeCharacteristic();

                count--;

            }

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

    @Override
    public void onCharacteristicWrite(BluetoothGatt gatt,
                                      BluetoothGattCharacteristic characteristic,
                                      int status){

        if (status == BluetoothGatt.GATT_SUCCESS){

            Log.d(TAG,"Write to Characteristic Success! !");
        }

    }
};

public boolean writeCharacteristic(){

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

    BluetoothGattService Service = mBluetoothGatt.getService(UUID_MY_SERVICE);
    if (Service == null) {
        Log.e(TAG, "service not found!");
        return false;
    }
    BluetoothGattCharacteristic characteristic = Service
            .getCharacteristic(UUID_MY_CHARACTERISTIC);
    if (characteristic == null) {
        Log.e(TAG, "char not found!");
        return false;
    }

    byte[] value = {(byte)300,(byte)100,(byte)100};
    characteristic.setValue(value);

    boolean status = mBluetoothGatt.writeCharacteristic(characteristic);

    return status;
}

Вывод показывает "Успех записи в характеристику!!" шесть раз, таким образом, операция записи прошла успешно. Однако устройство показывает, что от планшета ничего не получено. Я также пытался писать по одному байту за раз или добавлял таймер, чтобы планшет мог писать в датчик каждые 2 секунды. Но ни один из них не работал. Любые идеи?


person Magic    schedule 24.03.2014    source источник
comment
Вы пытались включить HCI snoop (настройки разработчика на телефоне) и проверить, что отправляется и принимается?   -  person Zomb    schedule 25.03.2014
comment
Привет, я только что сделал. Однако я не знаю, как его правильно открыть. Не могли бы вы рассказать мне, как открыть его с помощью logcat? Я попытался открыть его с помощью текста или возвышенного, но оказалось нечитаемым. И в чем разница между этим файлом журнала и информацией, которую я получаю от Android Studio Logcat во время запуска программы?   -  person Magic    schedule 25.03.2014
comment
Я считаю, что вам нужно использовать Wireshark для чтения журнала. Я не пробовал, просто подумал, что это может помочь вам в этом случае.   -  person Zomb    schedule 25.03.2014
comment
Привет, Зомб, спасибо за ответ. Проблема решилась ручным сопряжением планшета с устройством.   -  person Magic    schedule 27.03.2014
comment
У меня возникли проблемы с записью нескольких байтов в характеристику за раз. Этот кусок кода работает для вас? значение байта [] = {(байт) 300, (байт) 100, (байт) 100}; характеристика.setValue (значение); логический статус = mBluetoothGatt.writeCharacteristic (характеристика);   -  person deadbabykitten    schedule 21.06.2014
comment
Похоже, что createBond был добавлен согласно документации через SDK 19, у вас вообще возникают проблемы с 18 с этим?   -  person AllDayAmazing    schedule 27.01.2015


Ответы (1)


(Отвечено путем редактирования вопроса. Преобразовано в ответ вики сообщества. См. -a-question-is-added-to-the-que">Какое правильное действие, когда ответ на вопрос добавляется к самому вопросу? )

ОП написал:

Следовать за:

Проблема решена ручным сопряжением планшета с устройством сначала в настройках вместо сопряжения по коду.

Таким образом, только использование фрагмента кода для подключения Gatt, предоставленного Android, недостаточно для сопряжения устройства. Я должен добавить еще один код, который я нашел в Интернете, для сопряжения устройств, если я не хочу каждый раз связывать их вручную:

private void pairDevice(BluetoothDevice device) {
    try {
        Log.d("pairDevice()", "Start Pairing...");
        Method m = device.getClass()
                .getMethod("createBond", (Class[]) null);
        m.invoke(device, (Object[]) null);
        Log.d("pairDevice()", "Pairing finished.");
    } catch (Exception e) {
        Log.e("pairDevice()", e.getMessage());
    }
}
person Community    schedule 06.02.2015