异步移动协议冲突和/或连接丢失ONVIF

时间:2018-06-28 13:12:41

标签: c# asynchronous onvif

一些背景信息:

我目前正在使用Visual Studio 2017和ONVIF .wsdl(OnvifMedia10和OnvifPTZService)制作一个c#Windows窗体应用程序。

我对目标摄像机具有管理员权限。

我从我创建的mediaClient中获得了一个配置文件:

var mediaEndPointAddress = new EndpointAddress($"http://{cameraAddress}/onvif/media");
var mediaEncoding = new TextMessageEncodingBindingElement
{
     MessageVersion = MessageVersion.CreateVersion(EnvelopeVersion.Soap12, AddressingVersion.None)
};
var mediaBinding = new HttpTransportBindingElement
{
     AuthenticationScheme = AuthenticationSchemes.Digest
};
var mediaCustomBinding = new CustomBinding(mediaEncoding, mediaBinding);
var mediaPasswordDigestBehavior = new PasswordDigestBehavior(userName, password);
mediaClient = new MediaClient(mediaCustomBinding, mediaEndPointAddress);
mediaClient.Endpoint.EndpointBehaviors.Add(mediaPasswordDigestBehavior);

var profs = mediaClient.GetProfiles();

profile = mediaClient.GetProfile(profs[0].token);

PasswordDigestBehavior是我在此link上找到的一些代码的一部分。

我使用相同的方法来获取ptzClient及其配置:

...
var ptzEndpointAddress = new EndpointAddress($"http://{cameraAddress}/onvif/ptz");
ptzClient = new PTZClient(commonCustomBinding, ptzEndpointAddress);
ptzClient.Endpoint.EndpointBehaviors.Add(commonPasswordDigestBehavior);
var configs = ptzClient.GetConfigurations();
options = ptzClient.GetConfigurationOptions(configs[0].token);

然后我创建了一个PTZSpeed变量来保持我希望相机移动的方式:

velocity = new OnvifPTZService.PTZSpeed();
velocity.PanTilt = new OnvifPTZService.Vector2D();
velocity.Zoom = new OnvifPTZService.Vector1D();

我的问题:

当我要旋转目标相机时,我使用某种PanLeft()函数:

public void PanLeft()
    {
        if(Initialised && CanPanTilt)
        {
            velocity.PanTilt.x = options.Spaces.ContinuousPanTiltVelocitySpace[0].XRange.Min;
            velocity.PanTilt.y = 0;
            ptzClient.ContinuousMoveAsync(profile.token, velocity, "PT5S");
        }
    }

要停止相机,我将velocity.PanTilt.xvelocity.PanTilt.y改回零,然后再发送另一个异步移动请求。

几次移动/停止后,我与相机的连接不断丢失...

我想知道是否是因为我同时发出太多异步请求之类的东西...

起初,我认为问题出在我的网络上,因为我是通过wifi连接到摄像机的,但是我尝试通过以太网电缆直接连接它,但并没有改变...

我想知道我的操作方式是否正常,是否有更好的方法可以使我的应用程序不中断并接收标题错误(违反协议等)...

我还使用OnvifDeviceManager应用程序来指导自己完成该项目的开发过程,以了解我可以做和不能做的事情,但是似乎该应用程序在经过几次操作后便崩溃了/失去了与相机的连接的ptz动作...

1 个答案:

答案 0 :(得分:0)

我认为问题在于,同时发送/接收的移动请求太多...

但是,我刚刚发现有一个ptzClient.Stop(profile.token, true, false)函数可以完全满足我的需求...

如果第一个布尔值为true,则停止给定的ptzClient平移/倾斜,如果第二个布尔值为true,则停止缩放。

使用此命令时,我的应用程序的使用寿命似乎更长。

问题仍然存在,但是不常见!