如何使用Onvif协议切换继电器输出的状态

时间:2017-02-03 11:38:36

标签: c# onvif

我目前正试图在几台测试摄像机上切换继电器输出的状态(所有符合Onvif标准)。在尝试检索海康威视PTZ摄像机的继电器输出列表时,会出现混乱。我可以成功获得继电器输出(它只有1)并要求它的RelayLogicalState'可以是开放的也可以是封闭的。

为了切换继电器输出,我使用' SetRelayOutputState',其参数是要切换的继电器输出的标记和' RelayLogicalState'。由于只有1个中继输出,我只能发送该令牌,“RelayLogicalState”'是2个项目(活动或非活动)的枚举,这里做错了。我可以切换继电器输出的状态但是在调用' GetrelayOutputs'再次检查其状态此功能将始终将输入设置为“无效”#。

对于BOSCH,我可以再次检索中继输出,但只有1,但是调用' SetRelayOutputState'与2' RelayLogicalState'中的任何一个都没有任何关系。什么时候叫。

供参考:http://www.onvif.org/ver10/deviceio.wsdl

两款相机都安装了最新的固件,根据Onvif设备管理器,它们都使用Onvif 2.0版。

    private void OutputLowButton_Click(object sender, EventArgs e)
    {
        if (relayOutputs != null)
        {
            //only 1 present so we take the first for this example
            var output = relayOutputs.First();
            execute(() => IOClient.SetRelayOutputState(output.token, RelayLogicalState.inactive));
        }
    }
    private void OutputHighButton_Click(object sender, EventArgs e)
    {
        if (relayOutputs != null)
        {
            //only 1 present so we take the first for this example
            var output = relayOutputs.First();
            execute(() => IOClient.SetRelayOutputState(output.token, RelayLogicalState.active)); 
        }
    }
    private void OutputStateButton_Click(object sender, EventArgs e)
    {
        //only 1 present so we take the first for this example
        var relayOutputs = execute(() => IOClient.GetRelayOutputs());
        if(relayOutputs != null)
            MessageBox.Show(relayOutputs.First().Properties.IdleState.ToString());
    }

修改

最终我按照以下方式开展工作:

 relayOutput.Properties.Mode = Onv_Device_Management.RelayMode.Bistable;
            relayOutput.Properties.IdleState = Onv_Device_Management.RelayIdleState.open;
            TryCatch(() => deviceClient.SetRelayOutputSettingsAsync(relayOutput.token, relayOutput.Properties));
            TryCatch(() => deviceClient.SetRelayOutputState(relayOutput.token, Onv_Device_Management.RelayLogicalState.active));

1 个答案:

答案 0 :(得分:1)

我也遇到了一些问题。还有另一个名为SetRelayOutputSettings的onvif函数。你有几个设置:

<强> idleState
/ 靠近
delayTime
如果模式为“单稳态”,则它将返回idleState
模式
双稳态 - 你必须自己处理改变状态
monostable - 设置状态后,它会在“delayTime”之后返回idleState

当然你也必须在那里交付令牌。仍然要解决问题我必须按此顺序调用函数(伪代码我不是c#):

void SetState(string token, bool bOpen) // true if high, false if low
{
   SetRelayOutputSettings(token, bOpen, "bistable", 20);
   SetRelayOutputState(token, "active");
   SetRelayOutputState(token, "inactive");
}

希望能帮助你。