Android, wie zu Lesen mehrerer BLE Merkmale mit einer PriorityQueue
Ein bisschen stecken hier, könnte Eure Hilfe brauchen. Ich Lesen möchte mehrere BLE Merkmale auf einmal, einige Leute empfehlen die Verwendung PriorityQueue für, die. Ich weiß schon, alle die uuids, etc. müssen nur einen Weg, um Lesen Sie mehrere auf einmal.
Könnte jemand erklären, wie genau sollte es Aussehen? Oder gibt es vielleicht noch eine andere einfachere Lösung?
Vielen Dank im Voraus, hier ist mein code:
public static final BluetoothGattCallback mGattCallback = new BluetoothGattCallback() {
PriorityQueue<BluetoothGattCharacteristic> queue = new PriorityQueue<BluetoothGattCharacteristic>();
//When connection state changes
@Override
public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
if (newState == BluetoothProfile.STATE_CONNECTED) {
Log.v(TAG, "Connected!");
gatt.discoverServices();
}
if (newState == BluetoothProfile.STATE_DISCONNECTED) {
Log.v(TAG, "Disconnected...");
}
}
@Override
public void onServicesDiscovered(BluetoothGatt gatt, int status) {
List<BluetoothGattService> services = gatt.getServices();
BluetoothGattService rightService = null;
for (int i = 0; i < services.size(); i++) {
if (services.get(i).getCharacteristics().size() > 8) {
rightService = services.get(i);
}
}
List<UUID> uuidsList;
UUID TRANSMISSION_POWER = rightService.getCharacteristics().get(4).getUuid();
UUID BROADCASTING_INTERVAL = rightService.getCharacteristics().get(6).getUuid();
UUID BEACON_NAME = rightService.getCharacteristics().get(8).getUuid();
UUID CONNECTION_MODE = rightService.getCharacteristics().get(9).getUuid();
//UUID SOFT_REBOOT = rightService.getCharacteristics().get(10).getUuid();
uuidsList = new ArrayList<UUID>();
uuidsList.add(TRANSMISSION_POWER);
uuidsList.add(BROADCASTING_INTERVAL);
uuidsList.add(BEACON_NAME);
uuidsList.add(CONNECTION_MODE);
//uuidsList.add(SOFT_REBOOT);
queue.add(rightService.getCharacteristic(uuidsList.get(0)));
queue.add(rightService.getCharacteristic(uuidsList.get(1)));
queue.add(rightService.getCharacteristic(uuidsList.get(2)));
}
@Override
public void onCharacteristicRead(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {
Log.v(TAG, "CHARACTERISTIC VALUE___: " + characteristic.getIntValue(BluetoothGattCharacteristic.FORMAT_UINT8, 0));
onServicesDiscovered(gatt, 0);
}
};
UPDATE:
sogar, nachdem man Sie auf verschiedene threads, die es nur noch reagiert, um eine gatt.readCharacteristic(...). wie folgt:
//Gatt Callback
public static final BluetoothGattCallback mGattCallback = new BluetoothGattCallback() {
//When connection state changes
@Override
public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
if (newState == BluetoothProfile.STATE_CONNECTED) {
Log.v(TAG, "Connected!");
gatt.discoverServices();
}
if (newState == BluetoothProfile.STATE_DISCONNECTED) {
Log.v(TAG, "Disconnected...");
}
}
@Override
public void onServicesDiscovered(BluetoothGatt gatt, int status) {
List<BluetoothGattService> services = gatt.getServices();
/*
DISPLAY ALL SERVICES AND CHARACTERISTICS
for (int i = 0; i < services.size(); i++) {
Log.v(TAG, "SERVICE____: " + services.get(i).getUuid());
for (int k = 0; k < services.get(i).getCharacteristics().size(); k++) {
Log.v(TAG, "CHARACTERISTIC____: " + services.get(i).getCharacteristics().get(k).getUuid());
}
}
*/
BluetoothGattService rightService = null;
for (int i = 0; i < services.size(); i++) {
if (services.get(i).getCharacteristics().size() > 8) {
rightService = services.get(i);
}
}
List<UUID> uuidsList;
UUID TRANSMISSION_POWER = rightService.getCharacteristics().get(4).getUuid();
UUID BROADCASTING_INTERVAL = rightService.getCharacteristics().get(6).getUuid();
UUID BEACON_NAME = rightService.getCharacteristics().get(8).getUuid();
UUID CONNECTION_MODE = rightService.getCharacteristics().get(9).getUuid();
//UUID SOFT_REBOOT = rightService.getCharacteristics().get(10).getUuid();
uuidsList = new ArrayList<UUID>();
uuidsList.add(TRANSMISSION_POWER);
uuidsList.add(BROADCASTING_INTERVAL);
uuidsList.add(BEACON_NAME);
uuidsList.add(CONNECTION_MODE);
//uuidsList.add(SOFT_REBOOT);
class powerThread extends Thread{
UUID uuid;
BluetoothGatt gatt;
BluetoothGattService service;
public powerThread(UUID uuid, BluetoothGatt gatt, BluetoothGattService service) {
this.gatt = gatt;
this.service = service;
this.uuid = uuid;
}
@Override
public void run() {
gatt.readCharacteristic(service.getCharacteristic(uuid));
}
}
powerThread pt = new powerThread(TRANSMISSION_POWER, gatt, rightService);
pt.run();
class intervalThread extends Thread{
UUID uuid;
BluetoothGatt gatt;
BluetoothGattService service;
public intervalThread(UUID uuid, BluetoothGatt gatt, BluetoothGattService service) {
this.gatt = gatt;
this.service = service;
this.uuid = uuid;
}
@Override
public void run() {
gatt.readCharacteristic(service.getCharacteristic(uuid));
}
}
intervalThread it = new intervalThread(BROADCASTING_INTERVAL, gatt, rightService);
it.run();
}
@Override
public void onCharacteristicRead(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {
Log.v(TAG, "CHARACTERISTIC VALUE___: " + characteristic.getIntValue(BluetoothGattCharacteristic.FORMAT_UINT8, 0));
}
};
- Versucht Lesen, eins nach dem anderen? Was ist das problem mit, dass
- Ich Tat, und ich wählte diese Lösung für jetzt. Problem ist, dass ich eine Verbindung herstellen müssen, mehrere Male, und das nimmt mehr Zeit als ich möchte, es zu nehmen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Jeder, kann auch das gleiche problem, hier ist eine einfache Lösung mit Hilfe einer Liste<> Eigenschaften.
Vielen Dank für deinen Beitrag, Robert K. ich wollte meine app und Lesen Sie alle charakteristischen Werte von selbst und zeigen die charakteristischen Wert in die ExpandableList statt der UUID. Robert K ' s code war für mich aber habe ich eine Verschiebung der Werte, die angezeigt wird. Also machte ich einige kleine änderungen und möchte es teilen: 1.
Dies ist, wie ich geändert
onServicesDiscovered
undOnCharacteristicRead
:eingeführt, die Liste der Merkmale, die entleert sich nach jeder Trennung.
Ich stellte eine Liste zum speichern der charakteristischen Werte und eine ganze Zahl zeigt, welchen index ich bin bei (diese müssen geleert werden /auf null nach jeder Unterbrechung). Ich veränderte die
displayData
- Methode, die aufgerufen wird, nachdem jedercharacteristicRead
:öffentlichen
Anstelle der Füllung die UUID, die ich füllen Sie das entsprechende element mCharValues
ExpandableListView.OnChildClickListener
.Abgesehen von dem, was ich eingeführt, hier verließ ich den rest des Codes so ziemlich das gleiche.