1
0
mirror of https://codeberg.org/Freeyourgadget/Gadgetbridge synced 2024-12-27 19:15:50 +01:00

DeviceInfoProfile/BtLEQueue: Improve logging and fix warnings

This commit is contained in:
José Rebelo 2024-08-29 11:46:42 +01:00
parent 49ef8c9f40
commit 7eb1fcdb52
2 changed files with 87 additions and 71 deletions

View File

@ -18,6 +18,7 @@
along with this program. If not, see <https://www.gnu.org/licenses/>. */ along with this program. If not, see <https://www.gnu.org/licenses/>. */
package nodomain.freeyourgadget.gadgetbridge.service.btle; package nodomain.freeyourgadget.gadgetbridge.service.btle;
import android.annotation.SuppressLint;
import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothGatt; import android.bluetooth.BluetoothGatt;
@ -56,6 +57,7 @@ import nodomain.freeyourgadget.gadgetbridge.service.btle.actions.WriteAction;
/** /**
* One queue/thread per connectable device. * One queue/thread per connectable device.
*/ */
@SuppressLint("MissingPermission") // if we're using this, we have bluetooth permissions
public final class BtLEQueue { public final class BtLEQueue {
private static final Logger LOG = LoggerFactory.getLogger(BtLEQueue.class); private static final Logger LOG = LoggerFactory.getLogger(BtLEQueue.class);
@ -117,7 +119,7 @@ public final class BtLEQueue {
for (BtLEServerAction action : serverTransaction.getActions()) { for (BtLEServerAction action : serverTransaction.getActions()) {
if (mAbortServerTransaction) { // got disconnected if (mAbortServerTransaction) { // got disconnected
LOG.info("Aborting running transaction"); LOG.info("Aborting running server transaction");
break; break;
} }
if (LOG.isDebugEnabled()) { if (LOG.isDebugEnabled()) {
@ -134,7 +136,7 @@ public final class BtLEQueue {
} }
} }
} else { } else {
LOG.error("Action returned false: " + action); LOG.error("Server action returned false: {}", action);
break; // abort the transaction break; // abort the transaction
} }
} }
@ -158,7 +160,7 @@ public final class BtLEQueue {
try { try {
Thread.sleep(100); Thread.sleep(100);
} catch (Exception e) { } catch (Exception e) {
LOG.info("Exception during pause: "+e.toString()); LOG.info("Exception during pause: {}", e);
break; break;
} }
} }
@ -183,7 +185,7 @@ public final class BtLEQueue {
} }
} }
} else { } else {
LOG.error("Action returned false: " + action); LOG.error("Action returned false: {}", action);
break; // abort the transaction break; // abort the transaction
} }
} }
@ -192,7 +194,7 @@ public final class BtLEQueue {
mConnectionLatch = null; mConnectionLatch = null;
LOG.debug("Thread interrupted"); LOG.debug("Thread interrupted");
} catch (Throwable ex) { } catch (Throwable ex) {
LOG.error("Queue Dispatch Thread died: " + ex.getMessage(), ex); LOG.error("Queue Dispatch Thread died", ex);
mCrashed = true; mCrashed = true;
mConnectionLatch = null; mConnectionLatch = null;
} finally { } finally {
@ -231,7 +233,7 @@ public final class BtLEQueue {
mSendWriteRequestResponse = enable; mSendWriteRequestResponse = enable;
} }
protected boolean isConnected() { private boolean isConnected() {
if (mGbDevice.isConnected()) { if (mGbDevice.isConnected()) {
return true; return true;
} }
@ -261,7 +263,7 @@ public final class BtLEQueue {
disconnect(); disconnect();
} }
} }
LOG.info("Attempting to connect to " + mGbDevice.getName()); LOG.info("Attempting to connect to {}", mGbDevice.getName());
mBluetoothAdapter.cancelDiscovery(); mBluetoothAdapter.cancelDiscovery();
BluetoothDevice remoteDevice = mBluetoothAdapter.getRemoteDevice(mGbDevice.getAddress()); BluetoothDevice remoteDevice = mBluetoothAdapter.getRemoteDevice(mGbDevice.getAddress());
if(!mSupportedServerServices.isEmpty()) { if(!mSupportedServerServices.isEmpty()) {
@ -325,7 +327,7 @@ public final class BtLEQueue {
} }
private void handleDisconnected(int status) { private void handleDisconnected(int status) {
LOG.debug("handleDisconnected: " + status); LOG.debug("handleDisconnected: {}", status);
internalGattCallback.reset(); internalGattCallback.reset();
mTransactions.clear(); mTransactions.clear();
mPauseTransaction = false; mPauseTransaction = false;
@ -402,7 +404,7 @@ public final class BtLEQueue {
* @param transaction * @param transaction
*/ */
public void add(Transaction transaction) { public void add(Transaction transaction) {
LOG.debug("about to add: " + transaction); LOG.debug("about to add: {}", transaction);
if (!transaction.isEmpty()) { if (!transaction.isEmpty()) {
mTransactions.add(transaction); mTransactions.add(transaction);
} }
@ -424,7 +426,7 @@ public final class BtLEQueue {
* @param transaction * @param transaction
*/ */
public void add(ServerTransaction transaction) { public void add(ServerTransaction transaction) {
LOG.debug("about to add: " + transaction); LOG.debug("about to add: {}", transaction);
if(!transaction.isEmpty()) { if(!transaction.isEmpty()) {
mTransactions.add(transaction); mTransactions.add(transaction);
} }
@ -434,11 +436,9 @@ public final class BtLEQueue {
* Adds a transaction to the beginning of the queue. * Adds a transaction to the beginning of the queue.
* Note that actions of the *currently executing* transaction * Note that actions of the *currently executing* transaction
* will still be executed before the given transaction. * will still be executed before the given transaction.
*
* @param transaction
*/ */
public void insert(Transaction transaction) { public void insert(Transaction transaction) {
LOG.debug("about to insert: " + transaction); LOG.debug("about to insert: {}", transaction);
if (!transaction.isEmpty()) { if (!transaction.isEmpty()) {
List<AbstractTransaction> tail = new ArrayList<>(mTransactions.size() + 2); List<AbstractTransaction> tail = new ArrayList<>(mTransactions.size() + 2);
//mTransactions.drainTo(tail); //mTransactions.drainTo(tail);
@ -467,19 +467,21 @@ public final class BtLEQueue {
return mBluetoothGatt.getServices(); return mBluetoothGatt.getServices();
} }
/** @noinspection BooleanMethodIsAlwaysInverted*/
private boolean checkCorrectGattInstance(BluetoothGatt gatt, String where) { private boolean checkCorrectGattInstance(BluetoothGatt gatt, String where) {
if (gatt != mBluetoothGatt && mBluetoothGatt != null) { if (gatt != mBluetoothGatt && mBluetoothGatt != null) {
LOG.info("Ignoring event from wrong BluetoothGatt instance: " + where + "; " + gatt); LOG.warn("Ignoring event from wrong BluetoothGatt instance: {}; {}", where, gatt);
return false; return false;
} }
return true; return true;
} }
/** @noinspection BooleanMethodIsAlwaysInverted*/
private boolean checkCorrectBluetoothDevice(BluetoothDevice device) { private boolean checkCorrectBluetoothDevice(BluetoothDevice device) {
//BluetoothDevice clientDevice = mBluetoothAdapter.getRemoteDevice(mGbDevice.getAddress()); //BluetoothDevice clientDevice = mBluetoothAdapter.getRemoteDevice(mGbDevice.getAddress());
if(!device.getAddress().equals(mGbDevice.getAddress())) { // != clientDevice && clientDevice != null) { if(!device.getAddress().equals(mGbDevice.getAddress())) { // != clientDevice && clientDevice != null) {
LOG.info("Ignoring request from wrong Bluetooth device: " + device.getAddress()); LOG.warn("Ignoring request from wrong Bluetooth device: {}", device.getAddress());
return false; return false;
} }
return true; return true;
@ -510,7 +512,7 @@ public final class BtLEQueue {
@Override @Override
public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) { public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
LOG.debug("connection state change, newState: " + newState + getStatusString(status)); LOG.debug("connection state change, newState: {}{}", newState, getStatusString(status));
synchronized (mGattMonitor) { synchronized (mGattMonitor) {
if (mBluetoothGatt == null) { if (mBluetoothGatt == null) {
@ -523,7 +525,7 @@ public final class BtLEQueue {
} }
if (status != BluetoothGatt.GATT_SUCCESS) { if (status != BluetoothGatt.GATT_SUCCESS) {
LOG.warn("connection state event with error status " + status); LOG.warn("connection state event with error status {}", status);
} }
switch (newState) { switch (newState) {
@ -532,7 +534,7 @@ public final class BtLEQueue {
setDeviceConnectionState(State.CONNECTED); setDeviceConnectionState(State.CONNECTED);
// Attempts to discover services after successful connection. // Attempts to discover services after successful connection.
List<BluetoothGattService> cachedServices = gatt.getServices(); List<BluetoothGattService> cachedServices = gatt.getServices();
if (cachedServices != null && cachedServices.size() > 0) { if (cachedServices != null && !cachedServices.isEmpty()) {
LOG.info("Using cached services, skipping discovery"); LOG.info("Using cached services, skipping discovery");
onServicesDiscovered(gatt, BluetoothGatt.GATT_SUCCESS); onServicesDiscovered(gatt, BluetoothGatt.GATT_SUCCESS);
} else { } else {
@ -574,13 +576,13 @@ public final class BtLEQueue {
mConnectionLatch.countDown(); mConnectionLatch.countDown();
} }
} else { } else {
LOG.warn("onServicesDiscovered received: " + status); LOG.warn("onServicesDiscovered received: {}", status);
} }
} }
@Override @Override
public void onCharacteristicWrite(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) { public void onCharacteristicWrite(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {
LOG.debug("characteristic write: " + characteristic.getUuid() + getStatusString(status)); LOG.debug("characteristic write: {}{}", characteristic.getUuid(), getStatusString(status));
if (!checkCorrectGattInstance(gatt, "characteristic write")) { if (!checkCorrectGattInstance(gatt, "characteristic write")) {
return; return;
} }
@ -605,13 +607,16 @@ public final class BtLEQueue {
} }
} }
@Override @Override
public void onCharacteristicRead(BluetoothGatt gatt, public void onCharacteristicRead(BluetoothGatt gatt,
BluetoothGattCharacteristic characteristic, BluetoothGattCharacteristic characteristic,
int status) { int status) {
LOG.debug("characteristic read: " + characteristic.getUuid() + getStatusString(status)); LOG.debug(
"characteristic read: {}{}{}",
characteristic.getUuid(),
getStatusString(status),
status == BluetoothGatt.GATT_SUCCESS ? ": " + Logging.formatBytes(characteristic.getValue()) : ""
);
if (!checkCorrectGattInstance(gatt, "characteristic read")) { if (!checkCorrectGattInstance(gatt, "characteristic read")) {
return; return;
} }
@ -619,7 +624,7 @@ public final class BtLEQueue {
try { try {
getCallbackToUse().onCharacteristicRead(gatt, characteristic, status); getCallbackToUse().onCharacteristicRead(gatt, characteristic, status);
} catch (Throwable ex) { } catch (Throwable ex) {
LOG.error("onCharacteristicRead: " + ex.getMessage(), ex); LOG.error("onCharacteristicRead: {}", ex.getMessage(), ex);
} }
} }
checkWaitingCharacteristic(characteristic, status); checkWaitingCharacteristic(characteristic, status);
@ -627,7 +632,7 @@ public final class BtLEQueue {
@Override @Override
public void onDescriptorRead(BluetoothGatt gatt, BluetoothGattDescriptor descriptor, int status) { public void onDescriptorRead(BluetoothGatt gatt, BluetoothGattDescriptor descriptor, int status) {
LOG.debug("descriptor read: " + descriptor.getUuid() + getStatusString(status)); LOG.debug("descriptor read: {}{}", descriptor.getUuid(), getStatusString(status));
if (!checkCorrectGattInstance(gatt, "descriptor read")) { if (!checkCorrectGattInstance(gatt, "descriptor read")) {
return; return;
} }
@ -635,7 +640,7 @@ public final class BtLEQueue {
try { try {
getCallbackToUse().onDescriptorRead(gatt, descriptor, status); getCallbackToUse().onDescriptorRead(gatt, descriptor, status);
} catch (Throwable ex) { } catch (Throwable ex) {
LOG.error("onDescriptorRead: " + ex.getMessage(), ex); LOG.error("onDescriptorRead failed", ex);
} }
} }
checkWaitingCharacteristic(descriptor.getCharacteristic(), status); checkWaitingCharacteristic(descriptor.getCharacteristic(), status);
@ -643,7 +648,7 @@ public final class BtLEQueue {
@Override @Override
public void onDescriptorWrite(BluetoothGatt gatt, BluetoothGattDescriptor descriptor, int status) { public void onDescriptorWrite(BluetoothGatt gatt, BluetoothGattDescriptor descriptor, int status) {
LOG.debug("descriptor write: " + descriptor.getUuid() + getStatusString(status)); LOG.debug("descriptor write: {}{}", descriptor.getUuid(), getStatusString(status));
if (!checkCorrectGattInstance(gatt, "descriptor write")) { if (!checkCorrectGattInstance(gatt, "descriptor write")) {
return; return;
} }
@ -651,7 +656,7 @@ public final class BtLEQueue {
try { try {
getCallbackToUse().onDescriptorWrite(gatt, descriptor, status); getCallbackToUse().onDescriptorWrite(gatt, descriptor, status);
} catch (Throwable ex) { } catch (Throwable ex) {
LOG.error("onDescriptorWrite: " + ex.getMessage(), ex); LOG.error("onDescriptorWrite failed", ex);
} }
} }
checkWaitingCharacteristic(descriptor.getCharacteristic(), status); checkWaitingCharacteristic(descriptor.getCharacteristic(), status);
@ -662,7 +667,7 @@ public final class BtLEQueue {
BluetoothGattCharacteristic characteristic) { BluetoothGattCharacteristic characteristic) {
if (LOG.isDebugEnabled()) { if (LOG.isDebugEnabled()) {
String content = Logging.formatBytes(characteristic.getValue()); String content = Logging.formatBytes(characteristic.getValue());
LOG.debug("characteristic changed: " + characteristic.getUuid() + " value: " + content); LOG.debug("characteristic changed: {} value: {}", characteristic.getUuid(), content);
} }
if (!checkCorrectGattInstance(gatt, "characteristic changed")) { if (!checkCorrectGattInstance(gatt, "characteristic changed")) {
return; return;
@ -671,16 +676,16 @@ public final class BtLEQueue {
try { try {
getCallbackToUse().onCharacteristicChanged(gatt, characteristic); getCallbackToUse().onCharacteristicChanged(gatt, characteristic);
} catch (Throwable ex) { } catch (Throwable ex) {
LOG.error("onCharacteristicChanged: " + ex.getMessage(), ex); LOG.error("onCharacteristicChanged failed", ex);
} }
} else { } else {
LOG.info("No gattcallback registered, ignoring characteristic change"); LOG.info("No gatt callback registered, ignoring characteristic change");
} }
} }
@Override @Override
public void onReadRemoteRssi(BluetoothGatt gatt, int rssi, int status) { public void onReadRemoteRssi(BluetoothGatt gatt, int rssi, int status) {
LOG.debug("remote rssi: " + rssi + getStatusString(status)); LOG.debug("remote rssi: {}{}", rssi, getStatusString(status));
if (!checkCorrectGattInstance(gatt, "remote rssi")) { if (!checkCorrectGattInstance(gatt, "remote rssi")) {
return; return;
} }
@ -688,7 +693,7 @@ public final class BtLEQueue {
try { try {
getCallbackToUse().onReadRemoteRssi(gatt, rssi, status); getCallbackToUse().onReadRemoteRssi(gatt, rssi, status);
} catch (Throwable ex) { } catch (Throwable ex) {
LOG.error("onReadRemoteRssi: " + ex.getMessage(), ex); LOG.error("onReadRemoteRssi failed", ex);
} }
} }
} }
@ -696,7 +701,7 @@ public final class BtLEQueue {
private void checkWaitingCharacteristic(BluetoothGattCharacteristic characteristic, int status) { private void checkWaitingCharacteristic(BluetoothGattCharacteristic characteristic, int status) {
if (status != BluetoothGatt.GATT_SUCCESS) { if (status != BluetoothGatt.GATT_SUCCESS) {
if (characteristic != null) { if (characteristic != null) {
LOG.debug("failed btle action, aborting transaction: " + characteristic.getUuid() + getStatusString(status)); LOG.debug("failed btle action, aborting transaction: {}{}", characteristic.getUuid(), getStatusString(status));
} }
mAbortTransaction = true; mAbortTransaction = true;
} }
@ -706,7 +711,10 @@ public final class BtLEQueue {
} }
} else { } else {
if (BtLEQueue.this.mWaitCharacteristic != null) { if (BtLEQueue.this.mWaitCharacteristic != null) {
LOG.error("checkWaitingCharacteristic: mismatched characteristic received: " + ((characteristic != null && characteristic.getUuid() != null) ? characteristic.getUuid().toString() : "(null)")); LOG.error(
"checkWaitingCharacteristic: mismatched characteristic received: {}",
(characteristic != null && characteristic.getUuid() != null) ? characteristic.getUuid().toString() : "(null)"
);
} }
} }
} }
@ -748,14 +756,14 @@ public final class BtLEQueue {
@Override @Override
public void onConnectionStateChange(BluetoothDevice device, int status, int newState) { public void onConnectionStateChange(BluetoothDevice device, int status, int newState) {
LOG.debug("gatt server connection state change, newState: " + newState + getStatusString(status)); LOG.debug("gatt server connection state change, newState: {}{}", newState, getStatusString(status));
if(!checkCorrectBluetoothDevice(device)) { if(!checkCorrectBluetoothDevice(device)) {
return; return;
} }
if (status != BluetoothGatt.GATT_SUCCESS) { if (status != BluetoothGatt.GATT_SUCCESS) {
LOG.warn("connection state event with error status " + status); LOG.warn("gatt server connection state event with error status {}", status);
} }
} }
@ -768,7 +776,7 @@ public final class BtLEQueue {
if(!checkCorrectBluetoothDevice(device)) { if(!checkCorrectBluetoothDevice(device)) {
return; return;
} }
LOG.debug("characterstic read request: " + device.getAddress() + " characteristic: " + characteristic.getUuid()); LOG.debug("characteristic read request: {} characteristic: {}", device.getAddress(), characteristic.getUuid());
if (getCallbackToUse() != null) { if (getCallbackToUse() != null) {
getCallbackToUse().onCharacteristicReadRequest(device, requestId, offset, characteristic); getCallbackToUse().onCharacteristicReadRequest(device, requestId, offset, characteristic);
} }
@ -779,7 +787,7 @@ public final class BtLEQueue {
if(!checkCorrectBluetoothDevice(device)) { if(!checkCorrectBluetoothDevice(device)) {
return; return;
} }
LOG.debug("characteristic write request: " + device.getAddress() + " characteristic: " + characteristic.getUuid()); LOG.debug("characteristic write request: {} characteristic: {}", device.getAddress(), characteristic.getUuid());
boolean success = false; boolean success = false;
if (getCallbackToUse() != null) { if (getCallbackToUse() != null) {
success = getCallbackToUse().onCharacteristicWriteRequest(device, requestId, characteristic, preparedWrite, responseNeeded, offset, value); success = getCallbackToUse().onCharacteristicWriteRequest(device, requestId, characteristic, preparedWrite, responseNeeded, offset, value);
@ -794,7 +802,7 @@ public final class BtLEQueue {
if(!checkCorrectBluetoothDevice(device)) { if(!checkCorrectBluetoothDevice(device)) {
return; return;
} }
LOG.debug("onDescriptorReadRequest: " + device.getAddress()); LOG.debug("onDescriptorReadRequest: {}", device.getAddress());
if(getCallbackToUse() != null) { if(getCallbackToUse() != null) {
getCallbackToUse().onDescriptorReadRequest(device, requestId, offset, descriptor); getCallbackToUse().onDescriptorReadRequest(device, requestId, offset, descriptor);
} }
@ -805,7 +813,7 @@ public final class BtLEQueue {
if(!checkCorrectBluetoothDevice(device)) { if(!checkCorrectBluetoothDevice(device)) {
return; return;
} }
LOG.debug("onDescriptorWriteRequest: " + device.getAddress()); LOG.debug("onDescriptorWriteRequest: {}", device.getAddress());
boolean success = false; boolean success = false;
if(getCallbackToUse() != null) { if(getCallbackToUse() != null) {
success = getCallbackToUse().onDescriptorWriteRequest(device, requestId, descriptor, preparedWrite, responseNeeded, offset, value); success = getCallbackToUse().onDescriptorWriteRequest(device, requestId, descriptor, preparedWrite, responseNeeded, offset, value);

View File

@ -31,7 +31,7 @@ import nodomain.freeyourgadget.gadgetbridge.service.btle.GattService;
import nodomain.freeyourgadget.gadgetbridge.service.btle.TransactionBuilder; import nodomain.freeyourgadget.gadgetbridge.service.btle.TransactionBuilder;
import nodomain.freeyourgadget.gadgetbridge.service.btle.profiles.AbstractBleProfile; import nodomain.freeyourgadget.gadgetbridge.service.btle.profiles.AbstractBleProfile;
public class DeviceInfoProfile<T extends AbstractBTLEDeviceSupport> extends AbstractBleProfile { public class DeviceInfoProfile<T extends AbstractBTLEDeviceSupport> extends AbstractBleProfile<T> {
private static final Logger LOG = LoggerFactory.getLogger(DeviceInfoProfile.class); private static final Logger LOG = LoggerFactory.getLogger(DeviceInfoProfile.class);
private static final String ACTION_PREFIX = DeviceInfoProfile.class.getName() + "_"; private static final String ACTION_PREFIX = DeviceInfoProfile.class.getName() + "_";
@ -52,11 +52,11 @@ public class DeviceInfoProfile<T extends AbstractBTLEDeviceSupport> extends Abst
public static final UUID UUID_CHARACTERISTIC_PNP_ID = GattCharacteristic.UUID_CHARACTERISTIC_PNP_ID; public static final UUID UUID_CHARACTERISTIC_PNP_ID = GattCharacteristic.UUID_CHARACTERISTIC_PNP_ID;
private final DeviceInfo deviceInfo = new DeviceInfo(); private final DeviceInfo deviceInfo = new DeviceInfo();
public DeviceInfoProfile(T support) { public DeviceInfoProfile(final T support) {
super(support); super(support);
} }
public void requestDeviceInfo(TransactionBuilder builder) { public void requestDeviceInfo(final TransactionBuilder builder) {
builder.read(getCharacteristic(UUID_CHARACTERISTIC_MANUFACTURER_NAME_STRING)) builder.read(getCharacteristic(UUID_CHARACTERISTIC_MANUFACTURER_NAME_STRING))
.read(getCharacteristic(UUID_CHARACTERISTIC_MODEL_NUMBER_STRING)) .read(getCharacteristic(UUID_CHARACTERISTIC_MODEL_NUMBER_STRING))
.read(getCharacteristic(UUID_CHARACTERISTIC_SERIAL_NUMBER_STRING)) .read(getCharacteristic(UUID_CHARACTERISTIC_SERIAL_NUMBER_STRING))
@ -69,95 +69,104 @@ public class DeviceInfoProfile<T extends AbstractBTLEDeviceSupport> extends Abst
} }
@Override @Override
public boolean onCharacteristicRead(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) { public boolean onCharacteristicRead(final BluetoothGatt gatt, final BluetoothGattCharacteristic characteristic, final int status) {
final UUID charUuid = characteristic.getUuid();
if (status == BluetoothGatt.GATT_SUCCESS) { if (status == BluetoothGatt.GATT_SUCCESS) {
UUID charUuid = characteristic.getUuid();
if (charUuid.equals(UUID_CHARACTERISTIC_MANUFACTURER_NAME_STRING)) { if (charUuid.equals(UUID_CHARACTERISTIC_MANUFACTURER_NAME_STRING)) {
handleManufacturerName(gatt, characteristic); handleManufacturerName(characteristic);
return true; return true;
} else if (charUuid.equals(UUID_CHARACTERISTIC_MODEL_NUMBER_STRING)) { } else if (charUuid.equals(UUID_CHARACTERISTIC_MODEL_NUMBER_STRING)) {
handleModelNumber(gatt, characteristic); handleModelNumber(characteristic);
return true; return true;
} else if (charUuid.equals(UUID_CHARACTERISTIC_SERIAL_NUMBER_STRING)) { } else if (charUuid.equals(UUID_CHARACTERISTIC_SERIAL_NUMBER_STRING)) {
handleSerialNumber(gatt, characteristic); handleSerialNumber(characteristic);
return true; return true;
} else if (charUuid.equals(UUID_CHARACTERISTIC_HARDWARE_REVISION_STRING)) { } else if (charUuid.equals(UUID_CHARACTERISTIC_HARDWARE_REVISION_STRING)) {
handleHardwareRevision(gatt, characteristic); handleHardwareRevision(characteristic);
return true; return true;
} else if (charUuid.equals(UUID_CHARACTERISTIC_FIRMWARE_REVISION_STRING)) { } else if (charUuid.equals(UUID_CHARACTERISTIC_FIRMWARE_REVISION_STRING)) {
handleFirmwareRevision(gatt, characteristic); handleFirmwareRevision(characteristic);
return true; return true;
} else if (charUuid.equals(UUID_CHARACTERISTIC_SOFTWARE_REVISION_STRING)) { } else if (charUuid.equals(UUID_CHARACTERISTIC_SOFTWARE_REVISION_STRING)) {
handleSoftwareRevision(gatt, characteristic); handleSoftwareRevision(characteristic);
return true; return true;
} else if (charUuid.equals(UUID_CHARACTERISTIC_SYSTEM_ID)) { } else if (charUuid.equals(UUID_CHARACTERISTIC_SYSTEM_ID)) {
handleSystemId(gatt, characteristic); handleSystemId(characteristic);
return true; return true;
} else if (charUuid.equals(UUID_CHARACTERISTIC_IEEE_11073_20601_REGULATORY_CERTIFICATION_DATA_LIST)) { } else if (charUuid.equals(UUID_CHARACTERISTIC_IEEE_11073_20601_REGULATORY_CERTIFICATION_DATA_LIST)) {
handleRegulatoryCertificationData(gatt, characteristic); handleRegulatoryCertificationData(characteristic);
return true; return true;
} else if (charUuid.equals(UUID_CHARACTERISTIC_PNP_ID)) { } else if (charUuid.equals(UUID_CHARACTERISTIC_PNP_ID)) {
handlePnpId(gatt, characteristic); handlePnpId(characteristic);
return true; return true;
} else {
LOG.info("Unexpected onCharacteristicRead: " + GattCharacteristic.toString(characteristic));
} }
} else { } else {
LOG.warn("error reading from characteristic:" + GattCharacteristic.toString(characteristic)); if (charUuid.equals(UUID_CHARACTERISTIC_MANUFACTURER_NAME_STRING) ||
charUuid.equals(UUID_CHARACTERISTIC_MODEL_NUMBER_STRING) ||
charUuid.equals(UUID_CHARACTERISTIC_SERIAL_NUMBER_STRING) ||
charUuid.equals(UUID_CHARACTERISTIC_HARDWARE_REVISION_STRING) ||
charUuid.equals(UUID_CHARACTERISTIC_FIRMWARE_REVISION_STRING) ||
charUuid.equals(UUID_CHARACTERISTIC_SOFTWARE_REVISION_STRING) ||
charUuid.equals(UUID_CHARACTERISTIC_SYSTEM_ID) ||
charUuid.equals(UUID_CHARACTERISTIC_IEEE_11073_20601_REGULATORY_CERTIFICATION_DATA_LIST) ||
charUuid.equals(UUID_CHARACTERISTIC_PNP_ID)) {
LOG.warn("error reading from characteristic: {}, status={}", GattCharacteristic.toString(characteristic), status);
}
} }
return false; return false;
} }
private void handleManufacturerName(final BluetoothGattCharacteristic characteristic) {
private void handleManufacturerName(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) {
String name = characteristic.getStringValue(0).trim(); String name = characteristic.getStringValue(0).trim();
deviceInfo.setManufacturerName(name); deviceInfo.setManufacturerName(name);
notify(createIntent(deviceInfo)); notify(createIntent(deviceInfo));
} }
private void handleModelNumber(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) { private void handleModelNumber(final BluetoothGattCharacteristic characteristic) {
String modelNumber = characteristic.getStringValue(0).trim(); String modelNumber = characteristic.getStringValue(0).trim();
deviceInfo.setModelNumber(modelNumber); deviceInfo.setModelNumber(modelNumber);
notify(createIntent(deviceInfo)); notify(createIntent(deviceInfo));
} }
private void handleSerialNumber(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) {
private void handleSerialNumber(final BluetoothGattCharacteristic characteristic) {
String serialNumber = characteristic.getStringValue(0).trim(); String serialNumber = characteristic.getStringValue(0).trim();
deviceInfo.setSerialNumber(serialNumber); deviceInfo.setSerialNumber(serialNumber);
notify(createIntent(deviceInfo)); notify(createIntent(deviceInfo));
} }
private void handleHardwareRevision(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) { private void handleHardwareRevision(final BluetoothGattCharacteristic characteristic) {
String hardwareRevision = characteristic.getStringValue(0).trim(); String hardwareRevision = characteristic.getStringValue(0).trim();
deviceInfo.setHardwareRevision(hardwareRevision); deviceInfo.setHardwareRevision(hardwareRevision);
notify(createIntent(deviceInfo)); notify(createIntent(deviceInfo));
} }
private void handleFirmwareRevision(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) { private void handleFirmwareRevision(final BluetoothGattCharacteristic characteristic) {
String firmwareRevision = characteristic.getStringValue(0).trim(); String firmwareRevision = characteristic.getStringValue(0).trim();
deviceInfo.setFirmwareRevision(firmwareRevision); deviceInfo.setFirmwareRevision(firmwareRevision);
notify(createIntent(deviceInfo)); notify(createIntent(deviceInfo));
} }
private void handleSoftwareRevision(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) { private void handleSoftwareRevision(final BluetoothGattCharacteristic characteristic) {
String softwareRevision = characteristic.getStringValue(0).trim(); String softwareRevision = characteristic.getStringValue(0).trim();
deviceInfo.setSoftwareRevision(softwareRevision); deviceInfo.setSoftwareRevision(softwareRevision);
notify(createIntent(deviceInfo)); notify(createIntent(deviceInfo));
} }
private void handleSystemId(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) { private void handleSystemId(final BluetoothGattCharacteristic characteristic) {
String systemId = characteristic.getStringValue(0).trim(); String systemId = characteristic.getStringValue(0).trim();
deviceInfo.setSystemId(systemId); deviceInfo.setSystemId(systemId);
notify(createIntent(deviceInfo)); notify(createIntent(deviceInfo));
} }
private void handleRegulatoryCertificationData(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) { private void handleRegulatoryCertificationData(final BluetoothGattCharacteristic characteristic) {
// TODO: regulatory certification data list not supported yet // TODO: regulatory certification data list not supported yet
// String regulatoryCertificationData = characteristic.getStringValue(0).trim(); // String regulatoryCertificationData = characteristic.getStringValue(0).trim();
// deviceInfo.setRegulatoryCertificationDataList(regulatoryCertificationData); // deviceInfo.setRegulatoryCertificationDataList(regulatoryCertificationData);
// notify(createIntent(deviceInfo)); // notify(createIntent(deviceInfo));
} }
private void handlePnpId(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) { private void handlePnpId(final BluetoothGattCharacteristic characteristic) {
byte[] value = characteristic.getValue(); byte[] value = characteristic.getValue();
if (value.length == 7) { if (value.length == 7) {
// int vendorSource // int vendorSource
@ -169,10 +178,9 @@ public class DeviceInfoProfile<T extends AbstractBTLEDeviceSupport> extends Abst
} }
} }
private Intent createIntent(DeviceInfo deviceInfo) { private Intent createIntent(final DeviceInfo deviceInfo) {
Intent intent = new Intent(ACTION_DEVICE_INFO); final Intent intent = new Intent(ACTION_DEVICE_INFO);
intent.putExtra(EXTRA_DEVICE_INFO, deviceInfo); // TODO: broadcast a clone of the info intent.putExtra(EXTRA_DEVICE_INFO, deviceInfo); // TODO: broadcast a clone of the info
return intent; return intent;
} }
} }