/// <summary> /// Sucht im Netzwerk nach Bridges /// </summary> /// <returns>Gefundene Bridges</returns> public async Task <BridgeInfo[]> ScanBridges() { Logger.WriteToLog("Bridge-Suche gestartet", LogLevel.Info); if (SimMode) { Logger.WriteToLog("Bridge-Simulation", LogLevel.Simulation); return(new BridgeInfo[1] { new BridgeInfo { Name = "Simulated Bridge", BridgeId = "simulation", IpAddress = "255.255.255.255" } }); } var bridgeInfos = new List <BridgeInfo>(); IBridgeLocator locator = new HttpBridgeLocator(); var bridges = await locator.LocateBridgesAsync(TimeSpan.FromSeconds(5)); foreach (LocatedBridge bridge in bridges) { try { string json = string.Empty; string url = @"http://" + bridge.IpAddress + "/api/config"; HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); request.Method = "GET"; //request.AutomaticDecompression = DecompressionMethods.GZip; using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) using (Stream stream = response.GetResponseStream()) using (StreamReader reader = new StreamReader(stream)) { json = reader.ReadToEnd(); } var info = new BridgeInfo(JsonConvert.DeserializeObject <PublicConfig>(json)); info.IpAddress = bridge.IpAddress; Logger.WriteToLog("Gefundene Bridge: " + info.GetNameString(BridgeNameDisplay.IpAndName), LogLevel.Info); bridgeInfos.Add(info); } catch (Exception) { //Ohne weitere Infos fortfahren bridgeInfos.Add(new BridgeInfo(bridge)); Logger.WriteToLog("Erweiterete Bridge-Info (description.xml) für Bridge (" + bridge.IpAddress + ") nicht verfügbar", LogLevel.Warning); } } return(bridgeInfos.ToArray()); }
/// <summary> /// Verbindung zu einer bekannten Bridge herstellen /// </summary> /// <param name="bridgeIp">IP Adresse der zu verbindenden Bridge</param> /// <returns></returns> public BridgeResult ConnectBridge(BridgeInfo bridge) { if (SimMode) { Logger.WriteToLog("Bridge-Verbindung wurde simuliert", LogLevel.Simulation); ConnectedBridge = bridge; return(BridgeResult.SuccessfulConnected); } else { Logger.WriteToLog("Verbindungsaufbau mit Bridge (" + bridge.IpAddress + ")"); } Version apiVersion; if (String.IsNullOrWhiteSpace(bridge.ApiVersion)) { Logger.WriteToLog("API-Version unbekannt", LogLevel.Warning); return(BridgeResult.Error); } else { if (!Version.TryParse(bridge.ApiVersion, out apiVersion)) { Logger.WriteToLog("API-Version unbekannt; Versionsstring (" + bridge.ApiVersion + ") kann nicht geparst werden", LogLevel.Error); return(BridgeResult.Error); } } if (apiVersion < new Version(API_VERSION_MIN)) { Logger.WriteToLog("API-Version (" + apiVersion.ToString() + ") nicht unterstützt; Es wird eine Version ab " + API_VERSION_MIN + " benötigt", LogLevel.Error); return(BridgeResult.Error); } Logger.WriteToLog("API-Version = " + apiVersion.ToString()); if (m_AppKeyManager.TryGetKey(bridge.BridgeId, out string appKey)) { try { Logger.WriteToLog("Verbindungsaufbau zu Bridge (" + bridge.IpAddress + ") initiieren"); m_HueClient = new LocalHueClient(bridge.IpAddress); if (DevMode) { Logger.WriteToLog("AppKey = " + appKey); } m_HueClient.Initialize(appKey); ConnectedBridge = bridge; ConnectedBridge.CurrentAppKey = appKey; //Init own API caller ApiCaller.Host = bridge.IpAddress; ApiCaller.AppKey = appKey; return(BridgeResult.SuccessfulConnected); } catch (Exception ex) { //TODO: Antwort bei falschen AppKey? if (ex.Message.Contains("Link button not pressed")) { return(BridgeResult.UnauthorizedUser); } else { throw ex; } } } else { return(BridgeResult.MissingUser); } }