Exemple #1
0
        /// <summary>
        /// Try to contact the specified bridge to get the basic config.
        /// </summary>
        /// <param name="BridgeIP">IP Address of the bridge.</param>
        /// <returns>The basic configuration of the bridge.</returns>
        public static BasicConfig GetBridgeBasicConfig(IPAddress BridgeIP)
        {
            BasicConfig config = new BasicConfig();

            CommResult comres = Communication.SendRequest(new Uri($@"http://{BridgeIP}/api/config"), WebRequestType.GET);

            switch (comres.status)
            {
            case WebExceptionStatus.Success:
                config = Serializer.DeserializeToObject <BasicConfig>(comres.data);
                if (config != null)
                {
                    return(config);
                }
                config = new BasicConfig();
                break;

            case WebExceptionStatus.Timeout:
                break;

            default:
                break;
            }

            return(config);
        }
Exemple #2
0
        private static void _detectionBgw_DoWork(object sender, DoWorkEventArgs e)
        {
            Dictionary <string, BasicConfig> newdetectedBridge = new Dictionary <string, BasicConfig>();

            // Detect using UPNP
            bool finished;

            List <ManagedUPnP.Device> upnpDevices =
                Discovery.FindDevices(null, 3000, int.MaxValue, out finished).ToList();

            foreach (ManagedUPnP.Device dev in upnpDevices)
            {
                if (dev.ModelName.Contains("Philips hue bridge"))
                {
                    BasicConfig bc = GetBridgeBasicConfig(IPAddress.Parse(dev.RootHostName));
                    if (bc == null)
                    {
                        continue;
                    }

                    newdetectedBridge.Add(dev.RootHostName, bc);
                }
            }


            // If not bridge are found via upnp try the portal.
            if (newdetectedBridge.Count == 0)
            {
                try
                {
                    // Detect using Portal
                    CommResult comres = Communication.SendRequest(new Uri("http://www.meethue.com/api/nupnp"), WebRequestType.GET);
                    if (comres.status == WebExceptionStatus.Success)
                    {
                        List <Device> portalDevices = Serializer.DeserializeToObject <List <Device> >(comres.data);
                        foreach (Device dev in portalDevices)
                        {
                            if (newdetectedBridge.ContainsKey(dev.internalipaddress))
                            {
                                continue;
                            }
                            BasicConfig bc = GetBridgeBasicConfig(IPAddress.Parse(dev.internalipaddress));
                            newdetectedBridge.Add(dev.internalipaddress, bc);
                        }
                    }
                }
                catch (System.TimeoutException ex)
                {
                    OnPortalDetectionTimedOut?.Invoke(null, new DetectionErrorEventArgs(ex));
                    OnBridgeDetectionFailed?.Invoke(null, new DetectionErrorEventArgs(ex));
                    return;
                }
                catch (Exception ex)
                {
                    OnPortalDetectionError?.Invoke(null, new DetectionErrorEventArgs(ex));
                    OnBridgeDetectionFailed?.Invoke(null, new DetectionErrorEventArgs(ex));
                    return;
                }
            }


            IList <Bridge> bridges = newdetectedBridge.Select(kvp => new Bridge
            {
                IpAddress  = IPAddress.Parse(kvp.Key),
                Mac        = kvp.Value.mac,
                ApiVersion = kvp.Value.apiversion,
                SwVersion  = kvp.Value.swversion,
                Name       = kvp.Value.name ?? ""
            }).ToList();

            // Process all bridges to get needed settings.

            e.Result = new ObservableCollection <Bridge>(bridges);
        }