在BLE Android应用onCharacteristicRead并没有叫连我都写bluetoothGatt.readCharacteristic(gattCharacteristic)

问题描述 投票:0回答:1

我正在开发一个应用程序与BLE设备连接,我下面的谷歌开发者指南。

按照开发人员指南我已经扫描BLE装置,并成功地与他们建立连接,并能够获得可用的服务和特性。

在这里我的问题是当我试图读取使用特征值

bluetoothGatt.readCharacteristic(gattCharacteristic)

但它不工作他并没有叫关贸总协定回调方法

onCharacteristicRead

这些特征属性是因为,我没有使用描述或支持任何通知阅读。

我尝试在SO和谷歌中提到的所有解决方案,但我还是很无力解决这一问题

我是新来这个概念,如果任何人能帮助我。

请找到下面的参考代码:

这个类是bluetoothgatt回调的服务。

private BluetoothGattCallback bluetoothGattCallback = new BluetoothGattCallback() {
        @Override
        public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
            String intentAction;
            bluetoothGatt = gatt;
            if (newState == BluetoothProfile.STATE_CONNECTED) {
                //bluetoothGatt = gatt;
                intentAction = Constants.GATT_CONNECTED;
                Log.i(TAG, "Connected to GATT server.");
                // Attempts to discover services after successful connection.
                Log.i(TAG, "Attempting to start service discovery:" +
                        bluetoothGatt.discoverServices());
                gatt.discoverServices();
                broadCastUpdates(intentAction);
            } else if (newState == BluetoothProfile.STATE_DISCONNECTED) {
                intentAction = Constants.GATT_DISCONNECTED;
                Log.i(TAG, "Disconnected to GATT server.");
                broadCastUpdates(intentAction);
            }
            super.onConnectionStateChange(gatt, status, newState);
        }

        @Override
        public void onServicesDiscovered(BluetoothGatt gatt, int status) {
            if (status == BluetoothGatt.GATT_SUCCESS) {
                broadCastUpdates(Constants.GATT_SERVICE_DISCOVERED);
                Log.i("Services count", " " + gatt.getServices().size());
            } else {
                Log.w(TAG, "onServicesDiscovered received: " + status);
            }
            super.onServicesDiscovered(gatt, status);
        }

        @Override
        public void onCharacteristicRead(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {
            if (status == BluetoothGatt.GATT_SUCCESS) {
                Log.e(TAG, "Characteristics calling");
                UUID charUuid = characteristic.getUuid();
                Intent intent = new Intent(Constants.GATT_DATA_AVAILABLE);
                Bundle bundle = new Bundle();
                // Putting the byte value read for GATT Db
                bundle.putByteArray(Constants.EXTRA_BYTE_VALUE,
                        characteristic.getValue());
                bundle.putString(Constants.EXTRA_BYTE_UUID_VALUE,
                        characteristic.getUuid().toString());
                if (charUuid
                        .equals(UUID_MANUFATURE_NAME_STRING)) {
                    bundle.putString(Constants.EXTRA_MNS_VALUE,
                            Constants.getDisplayString(characteristic));
                }
                // Model number read value
                else if (charUuid.equals(UUID_MODEL_NUMBER_STRING)) {
                    bundle.putString(Constants.EXTRA_MONS_VALUE,
                            Constants.getDisplayString(characteristic));
                }
                // Serial number read value
                else if (charUuid
                        .equals(UUID_SERIAL_NUMBER_STRING)) {
                    bundle.putString(Constants.EXTRA_SNS_VALUE,
                            Constants.getDisplayString(characteristic));
                }
                // Hardware revision read value
                else if (charUuid
                        .equals(UUID_HARDWARE_REVISION_STRING)) {
                    bundle.putString(Constants.EXTRA_HRS_VALUE,
                            Constants.getDisplayString(characteristic));
                }
                // Firmware revision read value
                else if (charUuid
                        .equals(UUID_FIRWARE_REVISION_STRING)) {
                    bundle.putString(Constants.EXTRA_FRS_VALUE,
                            Constants.getDisplayString(characteristic));
                }
                // Software revision read value
                else if (charUuid
                        .equals(UUID_SOFTWARE_REVISION_STRING)) {
                    bundle.putString(Constants.EXTRA_SRS_VALUE,
                            Constants.getDisplayString(characteristic));
                }
                // PNP ID read value
                else if (charUuid.equals(UUID_PNP_ID)) {
                    bundle.putString(Constants.EXTRA_PNP_VALUE,
                            Constants.getDisplayString(characteristic));
                }
                // System ID read value
                else if (charUuid.equals(UUID_SYSTEM_ID)) {
                    bundle.putString(Constants.EXTRA_SID_VALUE,
                            Constants.getDisplayString(characteristic));
                }
                intent.putExtras(bundle);
                sendBroadcast(intent);
            }
            Log.e(TAG, "Characterstics calling");
            //broadCastUpdates(Constants.GATT_DATA_AVAILABLE, characteristic);
            //super.onCharacteristicRead(gatt, characteristic, status);
        }

        @Override
        public void onCharacteristicWrite(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {
            Log.e(TAG, "Characteristic write calling");
            super.onCharacteristicWrite(gatt, characteristic, status);
        }

        @Override
        public void onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) {
            Log.e(TAG, "Characteristic change calling");
            super.onCharacteristicChanged(gatt, characteristic);
        }

        @Override
        public void onDescriptorRead(BluetoothGatt gatt, BluetoothGattDescriptor descriptor, int status) {
            Log.e(TAG, "Descriptor calling");
            super.onDescriptorRead(gatt, descriptor, status);
        }

        @Override
        public void onDescriptorWrite(BluetoothGatt gatt, BluetoothGattDescriptor descriptor, int status) {
            Log.e(TAG, "Descriptor write calling");
            super.onDescriptorWrite(gatt, descriptor, status);
        }

        @Override
        public void onReliableWriteCompleted(BluetoothGatt gatt, int status) {
            super.onReliableWriteCompleted(gatt, status);
        }

        @Override
        public void onReadRemoteRssi(BluetoothGatt gatt, int rssi, int status) {
            super.onReadRemoteRssi(gatt, rssi, status);
        }
    };

   /* public static void setNotifyCharacteristics(BluetoothGattCharacteristic notifyCharacteristics) {
        bluetoothGatt.setCharacteristicNotification(notifyCharacteristics, true);
        BluetoothGattDescriptor gattDescriptor = notifyCharacteristics.getDescriptor(notifyCharacteristics.getDescriptors().get(0).getUuid());
        gattDescriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE);
        bluetoothGatt.writeDescriptor(gattDescriptor);
    }*/

    public void readCharacteristics(BluetoothGattCharacteristic gattCharacteristic) {
        if (bluetoothGatt != null) {
            int charaProp = gattCharacteristic.getProperties();
            Log.e(TAG, "Property-" + charaProp);
            Log.e(TAG, gattCharacteristic.getUuid().toString());
            bluetoothGatt.discoverServices();
            bluetoothGatt.readCharacteristic(gattCharacteristic);
            Log.e(TAG, "Gatt is not null");
        } else {
            Log.e(TAG, "Gatt is null");
        }
    }

下面类就是我打电话readCharacteristic

 private BroadcastReceiver characteristicReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        Bundle extras = intent.getExtras();
        if (Constants.GATT_DATA_AVAILABLE.equals(action)) {
            if (extras != null) {
                String name = extras.getString(Constants.EXTRA_MNS_VALUE);
                Log.e("This is test name :-", name);
                byte[] valueArry = extras.getByteArray(Constants.EXTRA_BYTE_VALUE);
                displayHexValue(valueArry);
                displayName(tvTempType.getText().toString());
            }
        } else {
            Toast.makeText(context, "There is no extra data.", Toast.LENGTH_SHORT).show();
        }
    }
};

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_character_details);

    try {
        tvUid = findViewById(R.id.tvCharUid);
        tvTemprature = findViewById(R.id.tvTemprature);
        tvCharName = findViewById(R.id.tvCharName);
        tvTempType = findViewById(R.id.tvTypename);

        ArrayList<BluetoothGattCharacteristic> bluetoothGattCharacteristics = getIntent().getParcelableArrayListExtra(Constants.CHARACTERISTIC);
        int selectPos = getIntent().getIntExtra(Constants.SELECTED_SERVICE, 0);
        gattCharacteristic = bluetoothGattCharacteristics.get(selectPos);
        registerReceiver(characteristicReceiver, Constants.makeGattUpdateIntentFilter());
        BLEGattService bleGattService = new BLEGattService();
        bleGattService.readCharacteristics(gattCharacteristic);
        String uid = gattCharacteristic.getUuid().toString();
        String displayUid = Constants.getDisplayString(gattCharacteristic);
        tvUid.setText(displayUid);
    } catch (Exception e) {
        e.printStackTrace();
    }
    /*String name = Constants.getDisplayString(gattCharacteristic);
    tvCharName.setText(name);*/

}

@Override
protected void onResume() {
    super.onResume();
    registerReceiver(characteristicReceiver, Constants.makeGattUpdateIntentFilter());
}

@Override
protected void onDestroy() {
    super.onDestroy();
    unregisterReceiver(characteristicReceiver);
}
java android bluetooth-lowenergy gatt bluetooth-gatt
1个回答
0
投票

尝试使用自己定制的方法对每个特征。你需要知道你的服务,你的特点的UUID的UUID:

public void readCustomCharacteristic() {
    if (mBluetoothAdapter == null || mBluetoothGatt == null) {
        Log.w(TAG, "BluetoothAdapter not initialized");
        return;
    }
    /*check if the service is available on the device*/
    BluetoothGattService mCustomService = mBluetoothGatt.getService(UUID.fromString("UUID of service"));
    if(mCustomService == null){
        Log.w(TAG, "Custom BLE Service not found");
        return;
    }
    /*get the read characteristic from the service*/
    BluetoothGattCharacteristic mReadCharacteristic = mCustomService.getCharacteristic(UUID.fromString("UUID of characteristic"));
    if(mBluetoothGatt.readCharacteristic(mReadCharacteristic) == false){
        Log.w(TAG, "Failed to read characteristic");
    }
}

public void writeCustomCharacteristic(byte[] value) {
    if (mBluetoothAdapter == null || mBluetoothGatt == null) {
        Log.w(TAG, "BluetoothAdapter not initialized");
        return;
    }
    /*check if the service is available on the device*/
    BluetoothGattService mCustomService = mBluetoothGatt.getService(UUID.fromString("UUID of service"));
    if(mCustomService == null){
        Log.w(TAG, "Custom BLE Service not found");
        return;
    }
    /*get the read characteristic from the service*/
    BluetoothGattCharacteristic mWriteCharacteristic = mCustomService.getCharacteristic(UUID.fromString("UUID of characteristic"));
    mWriteCharacteristic.setValue(value);
    if(mBluetoothGatt.writeCharacteristic(mWriteCharacteristic) == false){
        Log.w(TAG, "Failed to write characteristic");
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.