我目前正试图在几台测试摄像机上切换继电器输出的状态(所有符合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));
答案 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");
}
希望能帮助你。