[bluetooth] Add support for service data (#10278)

Signed-off-by: Peter Rosenberg <prosenb.dev@gmail.com>
This commit is contained in:
Pete
2022-08-26 05:36:21 +10:00
committed by GitHub
parent d4c472a04c
commit 34bdc21370
8 changed files with 195 additions and 3 deletions

View File

@@ -37,6 +37,7 @@ import org.openhab.binding.bluetooth.bluez.internal.events.ConnectedEvent;
import org.openhab.binding.bluetooth.bluez.internal.events.ManufacturerDataEvent;
import org.openhab.binding.bluetooth.bluez.internal.events.NameEvent;
import org.openhab.binding.bluetooth.bluez.internal.events.RssiEvent;
import org.openhab.binding.bluetooth.bluez.internal.events.ServiceDataEvent;
import org.openhab.binding.bluetooth.bluez.internal.events.ServicesResolvedEvent;
import org.openhab.binding.bluetooth.bluez.internal.events.TXPowerEvent;
import org.openhab.binding.bluetooth.notification.BluetoothConnectionStatusNotification;
@@ -358,6 +359,13 @@ public class BlueZBluetoothDevice extends BaseBluetoothDevice implements BlueZEv
}
}
@Override
public void onServiceDataUpdate(ServiceDataEvent event) {
BluetoothScanNotification notification = new BluetoothScanNotification();
notification.setServiceData(event.getData());
notifyListeners(BluetoothEventType.SCAN_RECORD, notification);
}
@Override
public void onTxPowerUpdate(TXPowerEvent event) {
this.txPower = (int) event.getTxPower();

View File

@@ -34,6 +34,7 @@ import org.openhab.binding.bluetooth.bluez.internal.events.ConnectedEvent;
import org.openhab.binding.bluetooth.bluez.internal.events.ManufacturerDataEvent;
import org.openhab.binding.bluetooth.bluez.internal.events.NameEvent;
import org.openhab.binding.bluetooth.bluez.internal.events.RssiEvent;
import org.openhab.binding.bluetooth.bluez.internal.events.ServiceDataEvent;
import org.openhab.binding.bluetooth.bluez.internal.events.ServicesResolvedEvent;
import org.openhab.binding.bluetooth.bluez.internal.events.TXPowerEvent;
import org.openhab.core.common.ThreadPoolManager;
@@ -46,6 +47,7 @@ import org.slf4j.LoggerFactory;
*
* @author Benjamin Lafois - Initial contribution and API
* @author Connor Petty - Code cleanup
* @author Peter Rosenberg - Add support for ServiceData
*/
@NonNullByDefault
public class BlueZPropertiesChangedHandler extends AbstractPropertiesChangedHandler {
@@ -115,6 +117,9 @@ public class BlueZPropertiesChangedHandler extends AbstractPropertiesChangedHand
case "manufacturerdata":
onManufacturerDataUpdate(dbusPath, variant);
break;
case "servicedata":
onServiceDataUpdate(dbusPath, variant);
break;
case "powered":
onPoweredUpdate(dbusPath, variant);
break;
@@ -196,6 +201,28 @@ public class BlueZPropertiesChangedHandler extends AbstractPropertiesChangedHand
}
}
private void onServiceDataUpdate(String dbusPath, Variant<?> variant) {
Map<String, byte[]> serviceData = new HashMap<>();
Object map = variant.getValue();
if (map instanceof DBusMap) {
DBusMap<?, ?> dbm = (DBusMap<?, ?>) map;
for (Map.Entry<?, ?> entry : dbm.entrySet()) {
Object key = entry.getKey();
Object value = entry.getValue();
if (key instanceof String && value instanceof Variant<?>) {
value = ((Variant<?>) value).getValue();
if (value instanceof byte[]) {
serviceData.put(((String) key), ((byte[]) value));
}
}
}
}
if (!serviceData.isEmpty()) {
notifyListeners(new ServiceDataEvent(dbusPath, serviceData));
}
}
private void onValueUpdate(String dbusPath, Variant<?> variant) {
Object value = variant.getValue();
if (value instanceof byte[]) {

View File

@@ -49,6 +49,10 @@ public interface BlueZEventListener {
onDBusBlueZEvent(event);
}
public default void onServiceDataUpdate(ServiceDataEvent event) {
onDBusBlueZEvent(event);
}
public default void onConnectedStatusUpdate(ConnectedEvent event) {
onDBusBlueZEvent(event);
}

View File

@@ -0,0 +1,43 @@
/**
* Copyright (c) 2010-2022 Contributors to the openHAB project
*
* See the NOTICE file(s) distributed with this work for additional
* information.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0
*
* SPDX-License-Identifier: EPL-2.0
*/
package org.openhab.binding.bluetooth.bluez.internal.events;
import java.util.Map;
import org.eclipse.jdt.annotation.NonNullByDefault;
/**
* This event is triggered when an update to a device's service data is received.
*
* @author Peter Rosenberg - Initial Contribution
*
*/
@NonNullByDefault
public class ServiceDataEvent extends BlueZEvent {
final private Map<String, byte[]> data;
public ServiceDataEvent(String dbusPath, Map<String, byte[]> data) {
super(dbusPath);
this.data = data;
}
public Map<String, byte[]> getData() {
return data;
}
@Override
public void dispatch(BlueZEventListener listener) {
listener.onServiceDataUpdate(this);
}
}