WPF IP Camera восстановление после потери соединения - PullRequest
0 голосов
/ 30 апреля 2020

После полудня все

У меня * WP1 приложение C# работает хорошо, как и с вашей помощью, теперь я пытаюсь настроить его, так как это происходит, если камера теряет соединение, ссылка зависает и не будет пытаться переподключиться автоматически .

Я искал в Google, но не нашел ничего, что указывает мне правильное направление. Я наткнулся на Ping () и попробовал, кажется, он работает очень хорошо. Проблема в том, что он не обрабатывает остальное при потере соединения.

 private void CommsTmr_Elapsed(object sender, ElapsedEventArgs e)
        {

            TestCnx();
        }

        private void TestCnx()
        {
            this.Dispatcher.Invoke(() => {
                string Ip = "10.0.0.60";
                Ping WhPing = new Ping();
                int timeout = 1000;
                PingReply WhPingResult = WhPing.Send(Ip, timeout);

                if ((WhPingResult.Status == IPStatus.Success) && (CnktFail == false))
                {

                    ConnectCam();
                }
                else if ((WhPingResult.Status != IPStatus.Success)||(CnktFail!= true))
                {
                    ((VlcControl)videoSin).SourceProvider.MediaPlayer.Stop();
                    ((VlcControl)videoSin).SourceProvider.MediaPlayer.Dispose();
                    CnktFail = true;
                    txttmr.Text ="Camera Disconnected!!";
                }

                WhPing.PingCompleted += WhPing_PingCompleted;
            });
        }

        private void WhPing_PingCompleted(object sender, PingCompletedEventArgs e)
        {
            ((AutoResetEvent)e.UserState).Set();
        }


        private void ConnectCam()
        {

            deviceUri = new UriBuilder("http:/onvif/device_service");
            deviceUri.Host = "10.0.0.60";
            deviceUri.Port = 80;

            System.ServiceModel.Channels.Binding binding;
            HttpTransportBindingElement httpTransport = new HttpTransportBindingElement();
            httpTransport.AuthenticationScheme = System.Net.AuthenticationSchemes.Digest;
            binding = new CustomBinding(new TextMessageEncodingBindingElement(MessageVersion.Soap12WSAddressing10, Encoding.UTF8), httpTransport);

            try
            {
                DeviceClient device = new DeviceClient(binding, new EndpointAddress(deviceUri.ToString()));
                Service[] services = device.GetServices(false);
                Service xmedia2 = services.FirstOrDefault(s => s.Namespace == "http://www.onvif.org/ver20/media/wsdl");

                if (xmedia2 != null)
                {
                    media = new Media2Client(binding, new EndpointAddress(deviceUri.ToString()));
                    media.ClientCredentials.HttpDigest.ClientCredential.UserName = "Alberto";//user.Text;
                    media.ClientCredentials.HttpDigest.ClientCredential.Password = "AMarino1";//password.Password;
                    media.ClientCredentials.HttpDigest.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation;
                    profiles = media.GetProfiles(null, null);

                }

                //VideoStream();
                StreamVideoOnVLC(prms);

            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());

            }

        }

        private void StreamVideoOnVLC(String[] recordParams)
        {

                // Channel 1 Profile 0, Port 80
                // Channel 2 Profile 1, Port 80

                UriBuilder uri = new UriBuilder(media.GetStreamUri("RtspOverHttp", profiles[0].token));
                uri.Host = "10.0.0.60";
                uri.Port = 80;
                uri.Scheme = "rtsp";

                List<string> options = new List<string>();
                options.Add(":rtsp-http");
                options.Add(":rtsp-http-port=80");
                options.Add(":rtsp-user=Alberto");
                options.Add(":rtsp-pwd=AMarino1");

                if (recordParams.Length != 0)
                {
                    foreach (string param in recordParams)
                    {
                        options.Add(param);
                    }
                }

            ((VlcControl)videoSin).SourceProvider.CreatePlayer(new DirectoryInfo(@"C:\Sinica\VLC"));
                //((VlcControl)videoSin).SourceProvider.CreatePlayer(new DirectoryInfo(@"D:\BURNTECH AUTOMATION\Projects\Sinica\Apex Scanners\Sinica Production Office\Sinica\VLC"));
                ((VlcControl)videoSin).SourceProvider.MediaPlayer.SetMedia(uri.Uri, options.ToArray());
                ((VlcControl)videoSin).SourceProvider.MediaPlayer.Play();
            //xcdCnkt_Cam_Fail.IsBusy = false;
            txttmr.Text = "Camera Connected!!";
            CnktFail = true;
                decodingTimer = new System.Threading.Timer(DoDecoding, null, 500, 100);

        }

Можете ли вы посмотреть или предоставить альтернативный метод.

Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...