private void Receive(IAsyncResult ar)
        {
            try
            {
                IPEndPoint ip       = new IPEndPoint(IPAddress.Any, PORT_NUMBER);
                byte[]     bytes    = udp.EndReceive(ar, ref ip);
                var        message  = Encoding.ASCII.GetString(Messaging.SmartHomeProtocolEncoder.Decrypt(bytes));
                var        sys_info = ((dynamic)JObject.Parse(message)).system.get_sysinfo;

                TPLinkSmartDevice device = null;
                if (((string)sys_info.model).StartsWith("HS"))
                {
                    device = new TPLinkSmartPlug(ip.Address.ToString());
                }
                else if (((string)sys_info.model).StartsWith("LB"))
                {
                    device = new TPLinkSmartBulb(ip.Address.ToString());
                }

                if (device != null)
                {
                    DiscoveredDevices.Add(device);
                }
            }
            catch (Exception ex) { }

            if (udp != null)
            {
                StartListening();
            }
        }
Beispiel #2
0
        private async Task Receive()
        {
            while (true)
            {
                if (discoveryComplete) //Prevent ObjectDisposedException/NullReferenceException when the Close() function is called
                {
                    return;
                }

                IPEndPoint       ip     = new IPEndPoint(IPAddress.Any, PORT_NUMBER);
                UdpReceiveResult result = await udp.ReceiveAsync().ConfigureAwait(false);

                ip = result.RemoteEndPoint;
                var message = Encoding.ASCII.GetString(Messaging.SmartHomeProtocolEncoder.Decrypt(result.Buffer));

                TPLinkSmartDevice device = null;
                try
                {
                    dynamic sys_info = ((dynamic)JObject.Parse(message)).system.get_sysinfo;
                    string  model    = (string)sys_info.model;
                    if (model != null)
                    {
                        if (model.StartsWith("HS110"))
                        {
                            device = await TPLinkSmartMeterPlug.Create(ip.Address.ToString()).ConfigureAwait(false);
                        }
                        else if (model.StartsWith("HS300") || model.StartsWith("KP303") || model.StartsWith("HS107"))
                        {
                            device = await TPLinkSmartMultiPlug.Create(ip.Address.ToString()).ConfigureAwait(false);
                        }
                        else if (model.StartsWith("HS220"))
                        {
                            device = await TPLinkSmartDimmer.Create(ip.Address.ToString()).ConfigureAwait(false);
                        }
                        else if (model.StartsWith("HS"))
                        {
                            device = await TPLinkSmartPlug.Create(ip.Address.ToString()).ConfigureAwait(false);
                        }
                        else if (model.StartsWith("KL") || model.StartsWith("LB"))
                        {
                            device = await TPLinkSmartBulb.Create(ip.Address.ToString()).ConfigureAwait(false);
                        }
                    }
                }
                catch (RuntimeBinderException)
                {
                    //discovered wrong device
                }

                if (device != null)
                {
                    DiscoveredDevices.Add(device);
                    OnDeviceFound(device);
                }
            }
        }
Beispiel #3
0
        private void Receive(IAsyncResult ar)
        {
            if (discoveryComplete) //Prevent ObjectDisposedException/NullReferenceException when the Close() function is called
            {
                return;
            }

            IPEndPoint ip = new IPEndPoint(IPAddress.Any, PORT_NUMBER);

            byte[] bytes    = udp.EndReceive(ar, ref ip);
            var    message  = Encoding.UTF8.GetString(Messaging.SmartHomeProtocolEncoder.Decrypt(bytes));
            var    sys_info = ((dynamic)JObject.Parse(message)).system.get_sysinfo;

            TPLinkSmartDevice device = null;

            if (((JObject)sys_info).Count != 0 && sys_info.model != null)
            {
                string model = (string)sys_info.model;

                if (model.StartsWith("HS110"))
                {
                    device = new TPLinkSmartMeterPlug(ip.Address.ToString());
                }
                else if (model.StartsWith("HS"))
                {
                    device = new TPLinkSmartPlug(ip.Address.ToString());
                }
                else if (model.StartsWith("LB"))
                {
                    device = new TPLinkSmartBulb(ip.Address.ToString());
                }
                else if (model.StartsWith("KP303"))
                {
                    device = new TPLinkSmartStrip(ip.Address.ToString());
                }
            }

            if (device != null)
            {
                DiscoveredDevices.Add(device);
                OnDeviceFound(device);

                // If the caller has specified a maximum number of devices to discover, stop waiting after we've
                // reached this count
                if (maxNumberOfDevicesToDiscover > 0 && DiscoveredDevices.Count >= maxNumberOfDevicesToDiscover)
                {
                    delayCancellationToken.Cancel();
                }
            }
            if (udp != null)
            {
                StartListening();
            }
        }
Beispiel #4
0
        private void Receive(IAsyncResult ar)
        {
            if (discoveryComplete) //Prevent ObjectDisposedException/NullReferenceException when the Close() function is called
            {
                return;
            }

            IPEndPoint ip = new IPEndPoint(IPAddress.Any, PORT_NUMBER);

            byte[] bytes    = udp.EndReceive(ar, ref ip);
            var    message  = Encoding.ASCII.GetString(Messaging.SmartHomeProtocolEncoder.Decrypt(bytes));
            var    sys_info = ((dynamic)JObject.Parse(message)).system.get_sysinfo;

            TPLinkSmartDevice device = null;
            string            model  = (string)sys_info.model;

            if (model.StartsWith("HS110"))
            {
                device = new TPLinkSmartMeterPlug(ip.Address.ToString());
            }
            else if (model.StartsWith("HS"))
            {
                device = new TPLinkSmartPlug(ip.Address.ToString());
            }
            else if (model.StartsWith("LB"))
            {
                device = new TPLinkSmartBulb(ip.Address.ToString());
            }

            if (device != null)
            {
                DiscoveredDevices.Add(device);
            }

            if (udp != null)
            {
                StartListening();
            }
        }
Beispiel #5
0
 private void OnDeviceFound(TPLinkSmartDevice device)
 {
     DeviceFound?.Invoke(this, new DeviceFoundEventArgs(device));
 }
 public DeviceFoundEventArgs(TPLinkSmartDevice device)
 {
     Device = device;
 }
        private async Task ReceiveAsync(int waitTimeOutInMs)
        {
            if (discoveryComplete) //Prevent ObjectDisposedException/NullReferenceException when the Close() function is called
            {
                return;
            }

            UdpClient udpListener = new UdpClient(PORT_NUMBER)
            {
                EnableBroadcast = true
            };

            // set timeout
            //udpListener.Client.ReceiveTimeout = Math.Max(waitTimeOutInMs, 100);
            //IPEndPoint ip = default;
            //byte[] buffer = udpListener.Receive(ref ip);

            UdpReceiveResult response = await udpListener.ReceiveAsync().ConfigureAwait(false);

            IPEndPoint ip      = response.RemoteEndPoint;
            var        message = Encoding.ASCII.GetString(SmartHomeProtocolEncoder.Decrypt(response.Buffer));

            try
            {
                TPLinkSmartDevice device   = null;
                dynamic           sys_info = ((dynamic)JObject.Parse(message)).system.get_sysinfo;
                string            model    = (string)sys_info.model;

                if (model != null)
                {
                    if (model.StartsWith("HS110", StringComparison.OrdinalIgnoreCase))
                    {
                        device = new TPLinkSmartMeterPlug(ip.Address.ToString());
                    }
                    else if (model.StartsWith("HS", StringComparison.OrdinalIgnoreCase))
                    {
                        device = new TPLinkSmartPlug(ip.Address.ToString());
                    }
                    else if (model.StartsWith("KL", StringComparison.OrdinalIgnoreCase) || model.StartsWith("LB", StringComparison.OrdinalIgnoreCase))
                    {
                        device = await TPLinkKL130.CreateNew(ip.Address.ToString());
                    }

                    // new device found, store in list and raise event
                    if (device != null)
                    {
                        DiscoveredDevices.Add(device);
                        OnDeviceFound(device);
                    }
                }
            }
            catch (RuntimeBinderException ex)
            {
                //discovered wrong device
                Debug.WriteLine(ex.Message);
            }
            finally
            {
                // ensure the socket is closed even if exception happenned
                udpListener.Dispose();
            }

            discoveryComplete = true;
        }