异步移动协议违规 and/or 连接丢失 ONVIF

async move protocol violation and/or connection lost 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 是我在 上找到的一些代码的一部分。

我使用相同的方法来获取 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 改回零。

几次 move/stop 后,我与相机的连接一直断开...

我想知道是不是因为我在同一时间发出了太多的异步请求还是什么...

起初,我以为我的网络有问题,因为我是通过 wifi 连接到相机的,但我尝试用以太网电缆直接连接它,但没有任何改变...

我想知道我进行移动的方式是否正确,是否有更好的方式来进行而不会使我的应用程序中断并在我的标题中收到错误(违反协议等)...

我也用OnvifDeviceManager app来指导自己完成这个项目的开发,看看我能做什么,不能做什么,但似乎即使是这个应用程序也是crashing/loosing连接到几个 ptz 动作后的相机...

我认为问题是同时有太多移动请求sent/received...

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

如果第一个 bool 为真,它从 panning/tilting 停止给定的 ptzClient,如果第二个 bool 为真,它停止缩放。

当我使用这个命令时,我的应用程序似乎持续时间更长。

问题依然存在,但频率降低了!