discoverBridges static method
Future<List<DiscoveredBridge> >
discoverBridges({
- BridgeDiscoveryMethod method = BridgeDiscoveryMethod.endpoint,
- List<
Bridge> savedBridges = const [],
Searches the network for Philips Hue bridges.
Returns a list of DiscoveredBridge objects. These contain the IP address of the bridge and a partial ID of the bridge.
method
The method used to discover bridges. The default is endpoint
.
The mDNS method has some bugs on iOS. The endpoint method might not work
immediately after starting a new bridge, or plugging in an old one. The
bridge needs to be connected to the network for a few minutes before it
can be discovered using the endpoint method. This is an edge case, and
endpoint is still the recommended method.
If savedBridges
is provided, the bridges that are already saved to the
device will be removed from the search results.
Implementation
static Future<List<DiscoveredBridge>> discoverBridges({
BridgeDiscoveryMethod method = BridgeDiscoveryMethod.endpoint,
List<Bridge> savedBridges = const [],
}) async {
/// Bridges found using MDNS.
List<DiscoveredBridge> bridgesFromMdns;
if (MiscTools.isWeb) {
// mDNS does not work on web.
bridgesFromMdns = [];
} else {
if (identical(method, BridgeDiscoveryMethod.mdns) ||
identical(method, BridgeDiscoveryMethod.both)) {
bridgesFromMdns = await BridgeDiscoveryService.discoverBridgesMdns();
} else {
bridgesFromMdns = [];
}
}
/// Bridges found using the endpoint method.
List<DiscoveredBridge> bridgesFromEndpoint;
if (identical(method, BridgeDiscoveryMethod.endpoint) ||
identical(method, BridgeDiscoveryMethod.both)) {
bridgesFromEndpoint =
await BridgeDiscoveryService.discoverBridgesEndpoint();
} else {
bridgesFromEndpoint = [];
}
// Remove duplicates from the two search methods.
Set<DiscoveredBridge> uniqueValues = {};
for (final DiscoveredBridge bridgeFromMdns in bridgesFromMdns) {
for (final DiscoveredBridge bridgeFromEndpoint in bridgesFromEndpoint) {
if (bridgeFromMdns.ipAddress == bridgeFromEndpoint.ipAddress) {
bridgeFromMdns.rawIdFromEndpoint =
bridgeFromEndpoint.rawIdFromEndpoint;
bridgesFromEndpoint.remove(bridgeFromEndpoint);
break;
}
}
uniqueValues.add(bridgeFromMdns);
}
uniqueValues.addAll(bridgesFromEndpoint);
if (savedBridges.isEmpty) return uniqueValues.toList();
List<DiscoveredBridge> newBridges = [];
// Remove the bridges that are already saved to the device from the search
// results.
for (final DiscoveredBridge discoveredBridge in uniqueValues) {
bool isSaved = false;
for (Bridge bridge in savedBridges) {
if (bridge.ipAddress != null &&
bridge.ipAddress == discoveredBridge.ipAddress) {
isSaved = true;
break;
}
}
if (!isSaved) {
newBridges.add(discoveredBridge);
}
}
return newBridges;
}