我目前正在尝试在多个测试相机(均符合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));
最佳答案
我也有一些问题。还有一个称为SetRelayOutputSettings
的onvif函数。您在此处有几个设置:
idleState
开关
延迟时间
如果模式为“单稳态”,它将返回到idleState的时间
模式
双稳态-您必须自己处理状态变化
单稳态-设置状态后,在“ 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");
}
希望对您有所帮助。