Voici ma class BluetoothGattReadHelper pour lire ce que envoie mon esp32 mais je ne reçois rien alors que ESP32 envoie des données pour appeler cette classe j’utilise
Dans le logcat il est afficher (Lecture de la caractéristique en cours rien d’autre).
Je veux pouvoir lire la donnée envoie par esp32 lorsque j’appuye sur le bouton lecture
code classe READ :
package com.example.applicationone;
import android.annotation.SuppressLint;
import android.bluetooth.BluetoothGatt;
import android.bluetooth.BluetoothGattCallback;
import android.bluetooth.BluetoothGattCharacteristic;
import android.bluetooth.BluetoothGattDescriptor;
import android.bluetooth.BluetoothGattService;
import android.util.Log;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
public class BluetoothGattReadHelper extends BluetoothGattCallback {
private static final String TAG = "BLEApp22";
private BluetoothGatt mBluetoothGatt;
private int ReadQueueIndex;
private List<BluetoothGattCharacteristic> ReadQueue;
private BluetoothReadCallback bluetoothReadCallback;
private static final String SERVICE_UUID = "042bd80f-14f6-42be-a45c-a62836a4fa3f";
private static final String CHARACTERISTIC_UUIDREAD = "065de41c-79fb-479d-b592-47caf39bfccd";
public BluetoothGattReadHelper(BluetoothGatt bluetoothGatt) {
this.mBluetoothGatt = bluetoothGatt;
}
@Override
@SuppressLint("MissingPermission")
public void onServicesDiscovered(BluetoothGatt gatt, int status) {
if (status == BluetoothGatt.GATT_SUCCESS) {
List<BluetoothGattService> services = gatt.getServices();
Log.i(TAG, services.toString());
BluetoothGattService service = gatt.getService(UUID.fromString(SERVICE_UUID));
if (service != null) {
BluetoothGattCharacteristic characteristic = service.getCharacteristic(UUID.fromString(CHARACTERISTIC_UUIDREAD));
if (characteristic != null) {
gatt.readCharacteristic(characteristic);
Log.d(TAG, "Lecture de la caractéristique en cours...");
try {
// Pause de 1 seconde (1000 millisecondes)
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
Log.e(TAG, "Caractéristique non trouvée.");
}
} else {
Log.e(TAG, "Service non trouvé.");
}
} else {
Log.e(TAG, "Échec de la découverte des services. Code d'erreur : " + status);
}
}
public void onCharacteristicRead(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {
if (status == BluetoothGatt.GATT_SUCCESS) {
byte[] data = characteristic.getValue();
// Faites quelque chose avec les données lues, par exemple, convertissez-les en entier.
int count = bytesToInt(data);
Log.d(TAG, "Valeur lue : " + count);
} else{
Log.d(TAG, "Erreur de lecture de la caractéristique : " + status);
}
}
public void onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) {
// Cette méthode est appelée lorsque la valeur de la caractéristique change.
byte[] data = characteristic.getValue();
// Faites quelque chose avec les nouvelles données lues, par exemple, convertissez-les en entier.
int count = bytesToInt(data);
Log.d(TAG, "Valeur de la caractéristique modifiée : " + count);
}
private int bytesToInt(byte[] data) {
int value = 0;
for (int i = 0; i < data.length; i++) {
value |= (data[i] & 0xFF) << (8 * i);
}
return value;
}
public void triggerOnServicesDiscoveredR() {
onServicesDiscovered(mBluetoothGatt, BluetoothGatt.GATT_SUCCESS);
}
}
Je veux lire les donnée envoie a travers de UIID_READ lorsque j’appuyai sur un bouton
code mainActivity:
package com.example.applicationone;
import android.Manifest;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothGatt;
import android.bluetooth.BluetoothGattCallback;
import android.bluetooth.BluetoothGattCharacteristic;
import android.bluetooth.BluetoothGattService;
import android.bluetooth.BluetoothManager;
import android.bluetooth.le.BluetoothLeScanner;
import android.bluetooth.le.ScanCallback;
import android.bluetooth.le.ScanResult;
import android.content.Context;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import java.nio.ByteBuffer;
import java.nio.charset.StandardCharsets;
import java.util.List;
import java.util.UUID;
public class MainActivity extends Activity {
private BluetoothAdapter mBluetoothAdapter;
public BluetoothGatt mBluetoothGatt;
public boolean mScanning = false;
private Handler mHandler = new Handler();
private static final long SCAN_PERIOD = 10000; // 10 seconds
private static final int REQUEST_LOCATION_PERMISSION = 1;
private static final int PERMISSION_REQUEST_CODE = 1;
private static final String SERVICE_UUID = "042bd80f-14f6-42be-a45c-a62836a4fa3f";
//private static final String CHARACTERISTIC_UUID = "065de41b-79fb-479d-b592-47caf39bfccb";
private static final String CHARACTERISTIC_UUID = "065de41b-79fb-479d-b592-47caf39bfccb";
private static final String CHARACTERISTIC_UUIDREAD = "065de41c-79fb-479d-b592-47caf39bfccd";
public Button startScanButton;
public Button ecriture;
public Button lecture;
public TextView Affichage;
public BluetoothGattWriteHelper writeHelper;
public BluetoothGattReadHelper readHelper;
private static final String TAG = "BLEApp";
private boolean isConnected = false;
private Handler periodicReadHandler = new Handler();
private static final long READ_PERIOD = 10000; // 10 seconds
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.d(TAG, "onCreate: Application démarrée");
startScanButton = findViewById(R.id.connectButton);
Affichage = findViewById(R.id.countTextView);
ecriture = findViewById(R.id.ecritureButton);
lecture = findViewById(R.id.Lecture);
final BluetoothManager bluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
mBluetoothAdapter = bluetoothManager.getAdapter();
// Demander la permission ACCESS_FINE_LOCATION si elle n'est pas déjà accordée
if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, REQUEST_LOCATION_PERMISSION);
} else {
startScanButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
scanLeDevice(true);
Log.d(TAG, "Appuye");
}
});
}
ecriture.setOnClickListener(new View.OnClickListener() {
@SuppressLint("MissingPermission")
@Override
public void onClick(View view) {
if (mBluetoothGatt != null) {
// Utilisez la nouvelle méthode pour déclencher onServicesDiscovered
writeHelper.triggerOnServicesDiscovered();
} else {
Log.e(TAG, "BluetoothGatt non initialisé.");
}
}
});
lecture.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (mBluetoothGatt != null) {
// Utilisez la nouvelle méthode pour déclencher onServicesDiscovered
readHelper.triggerOnServicesDiscoveredR();
} else {
Log.e(TAG, "BluetoothGatt non initialisé.");
}
}
});
}
@SuppressLint("MissingPermission")
private void scanLeDevice(final boolean enable) {
BluetoothLeScanner scanner = mBluetoothAdapter.getBluetoothLeScanner();
if (enable) {
mScanning = true;
scanner.startScan(mScanCallback);
Log.d(TAG, "Début de la numérisation BLE");
} else {
mScanning = false;
scanner.stopScan(mScanCallback);
Log.d(TAG, "Arrêt de la numérisation BLE");
}
}
private ScanCallback mScanCallback = new ScanCallback() {
@Override
public void onScanResult(int callbackType, ScanResult result) {
BluetoothDevice device = result.getDevice();
if (!isConnected) {
connectToDevice(device);
}
}
};
@SuppressLint("MissingPermission")
private void connectToDevice(BluetoothDevice device) {
mBluetoothGatt = device.connectGatt(this, false, mGattCallback);
Log.d(TAG, "Tentative de connexion au périphérique BLE : " + device.getName());
}
private final BluetoothGattCallback mGattCallback = new BluetoothGattCallback() {
@SuppressLint("MissingPermission")
@Override
public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
if (newState == BluetoothGatt.STATE_CONNECTED) {
isConnected = true;
// Arrêtez la numérisation ici car vous êtes connecté
scanLeDevice(false);
Log.d(TAG, "Connexion BLE" );
// Créer l'objet BluetoothGattWriteHelper après la connexion réussie
gatt.discoverServices();
writeHelper = new BluetoothGattWriteHelper(gatt);
readHelper = new BluetoothGattReadHelper(gatt);
} else if (newState == BluetoothGatt.STATE_DISCONNECTED) {
isConnected = false;
}
}
};
}