[Linux] Report public CHIP BLE device events (#39939)
* [Linux] Implement number of BLE connections reporting
* [Linux] Report public CHIP BLE device events
diff --git a/src/platform/Linux/BLEManagerImpl.cpp b/src/platform/Linux/BLEManagerImpl.cpp
index 2b055fe..0ae287a 100644
--- a/src/platform/Linux/BLEManagerImpl.cpp
+++ b/src/platform/Linux/BLEManagerImpl.cpp
@@ -180,8 +180,7 @@
uint16_t BLEManagerImpl::_NumConnections()
{
- uint16_t numCons = 0;
- return numCons;
+ return mEndpoint.GetNumConnections();
}
CHIP_ERROR BLEManagerImpl::ConfigureBle(uint32_t aAdapterId, bool aIsCentral)
@@ -197,32 +196,25 @@
{
case DeviceEventType::kCHIPoBLESubscribe:
HandleSubscribeReceived(event->CHIPoBLESubscribe.ConId, &CHIP_BLE_SVC_ID, &Ble::CHIP_BLE_CHAR_2_UUID);
- {
- ChipDeviceEvent connectionEvent{ .Type = DeviceEventType::kCHIPoBLEConnectionEstablished };
- PlatformMgr().PostEventOrDie(&connectionEvent);
- }
+ NotifyCHIPoBLEConnectionEstablished();
break;
-
case DeviceEventType::kCHIPoBLEUnsubscribe:
HandleUnsubscribeReceived(event->CHIPoBLEUnsubscribe.ConId, &CHIP_BLE_SVC_ID, &Ble::CHIP_BLE_CHAR_2_UUID);
+ NotifyCHIPoBLEConnectionClosed();
break;
-
case DeviceEventType::kCHIPoBLEWriteReceived:
HandleWriteReceived(event->CHIPoBLEWriteReceived.ConId, &CHIP_BLE_SVC_ID, &Ble::CHIP_BLE_CHAR_1_UUID,
PacketBufferHandle::Adopt(event->CHIPoBLEWriteReceived.Data));
break;
-
case DeviceEventType::kCHIPoBLEIndicateConfirm:
HandleIndicationConfirmation(event->CHIPoBLEIndicateConfirm.ConId, &CHIP_BLE_SVC_ID, &Ble::CHIP_BLE_CHAR_2_UUID);
break;
-
case DeviceEventType::kCHIPoBLEConnectionError:
HandleConnectionError(event->CHIPoBLEConnectionError.ConId, event->CHIPoBLEConnectionError.Reason);
break;
case DeviceEventType::kServiceProvisioningChange:
// Force the advertising configuration to be refreshed to reflect new provisioning state.
mFlags.Clear(Flags::kAdvertisingConfigured);
-
DriveBLEState();
break;
default:
@@ -261,7 +253,7 @@
mFlags.Clear(Flags::kBluezBLELayerInitialized);
mFlags.Clear(Flags::kAdvertisingConfigured);
mFlags.Clear(Flags::kAppRegistered);
- mFlags.Clear(Flags::kAdvertising);
+ ClearAdvertisingFlag();
CleanScanConfig();
// Indicate that the adapter is no longer available
err = BLE_ERROR_ADAPTER_UNAVAILABLE;
@@ -308,21 +300,18 @@
SuccessOrExit(err = DeviceLayer::SystemLayer().StartTimer(kFastAdvertiseTimeout, HandleAdvertisingTimer, this));
}
mFlags.Set(Flags::kAdvertising);
+ NotifyCHIPoBLEAdvertisingChange(kActivity_Started);
break;
case DeviceEventType::kPlatformLinuxBLEPeripheralAdvStopComplete:
SuccessOrExit(err = apEvent->Platform.BLEPeripheralAdvStopComplete.mError);
mFlags.Clear(Flags::kControlOpInProgress).Clear(Flags::kAdvertisingRefreshNeeded);
DeviceLayer::SystemLayer().CancelTimer(HandleAdvertisingTimer, this);
// Transition to the not Advertising state...
- if (mFlags.Has(Flags::kAdvertising))
- {
- mFlags.Clear(Flags::kAdvertising);
- ChipLogProgress(DeviceLayer, "CHIPoBLE advertising stopped");
- }
+ ClearAdvertisingFlag();
break;
case DeviceEventType::kPlatformLinuxBLEPeripheralAdvReleased:
// If the advertising was stopped due to a premature release, check if it needs to be restarted.
- mFlags.Clear(Flags::kAdvertising);
+ ClearAdvertisingFlag();
DriveBLEState();
break;
case DeviceEventType::kPlatformLinuxBLEPeripheralRegisterAppComplete:
@@ -748,6 +737,14 @@
mBLEScanConfig.mBleScanState = BleScanState::kNotScanning;
}
+void BLEManagerImpl::ClearAdvertisingFlag()
+{
+ VerifyOrReturn(mFlags.Has(Flags::kAdvertising));
+ mFlags.Clear(Flags::kAdvertising);
+ NotifyCHIPoBLEAdvertisingChange(kActivity_Stopped);
+ ChipLogProgress(DeviceLayer, "CHIPoBLE advertising stopped");
+}
+
void BLEManagerImpl::NewConnection(BleLayer * bleLayer, void * appState, const SetupDiscriminator & connDiscriminator)
{
mBLEScanConfig.mDiscriminator = connDiscriminator;
@@ -813,6 +810,24 @@
PlatformMgr().PostEventOrDie(&event);
}
+void BLEManagerImpl::NotifyCHIPoBLEConnectionEstablished()
+{
+ ChipDeviceEvent event{ .Type = DeviceEventType::kCHIPoBLEConnectionEstablished };
+ PlatformMgr().PostEventOrDie(&event);
+}
+
+void BLEManagerImpl::NotifyCHIPoBLEConnectionClosed()
+{
+ ChipDeviceEvent event{ .Type = DeviceEventType::kCHIPoBLEConnectionClosed };
+ PlatformMgr().PostEventOrDie(&event);
+}
+
+void BLEManagerImpl::NotifyCHIPoBLEAdvertisingChange(enum ActivityChange change)
+{
+ ChipDeviceEvent event{ .Type = DeviceEventType::kCHIPoBLEAdvertisingChange, .CHIPoBLEAdvertisingChange = { .Result = change } };
+ PlatformMgr().PostEventOrDie(&event);
+}
+
void BLEManagerImpl::OnDeviceScanned(BluezDevice1 & device, const chip::Ble::ChipBLEDeviceIdentificationInfo & info)
{
const char * address = bluez_device1_get_address(&device);
diff --git a/src/platform/Linux/BLEManagerImpl.h b/src/platform/Linux/BLEManagerImpl.h
index d4aeaa3..6c1266e 100644
--- a/src/platform/Linux/BLEManagerImpl.h
+++ b/src/platform/Linux/BLEManagerImpl.h
@@ -91,6 +91,7 @@
static void HandleTXCharCCCDWrite(BLE_CONNECTION_OBJECT user_data);
static void HandleTXComplete(BLE_CONNECTION_OBJECT user_data);
+ // Internal platform specific notifications
static void NotifyBLEAdapterAdded(unsigned int aAdapterId, const char * aAdapterAddress);
static void NotifyBLEAdapterRemoved(unsigned int aAdapterId, const char * aAdapterAddress);
static void NotifyBLEPeripheralRegisterAppComplete(CHIP_ERROR error);
@@ -182,11 +183,17 @@
BluezAdvertisement::AdvertisingIntervals GetAdvertisingIntervals() const;
void InitiateScan(BleScanState scanType);
void CleanScanConfig();
+ void ClearAdvertisingFlag();
static void HandleAdvertisingTimer(chip::System::Layer *, void * appState);
static void HandleScanTimer(chip::System::Layer *, void * appState);
static void HandleConnectTimer(chip::System::Layer *, void * appState);
+ // Public CHIPoBLE notifications
+ void NotifyCHIPoBLEConnectionEstablished();
+ void NotifyCHIPoBLEConnectionClosed();
+ void NotifyCHIPoBLEAdvertisingChange(enum ActivityChange change);
+
CHIPoBLEServiceMode mServiceMode;
BitFlags<Flags> mFlags;
diff --git a/src/platform/Linux/bluez/BluezEndpoint.h b/src/platform/Linux/bluez/BluezEndpoint.h
index 27c247a..a3d6981 100644
--- a/src/platform/Linux/bluez/BluezEndpoint.h
+++ b/src/platform/Linux/bluez/BluezEndpoint.h
@@ -77,6 +77,7 @@
CHIP_ERROR RegisterGattApplication();
GDBusObjectManagerServer * GetGattApplicationObjectManager() const { return mRoot.get(); }
+ size_t GetNumConnections() const { return mConnMap.size(); }
CHIP_ERROR ConnectDevice(BluezDevice1 & aDevice);
void CancelConnect();