Добрый день!
Хочу спросить совета у разработчиков, как организовать отказоустойчивую схему?
Речь идёт о контроле доступа для предприятия с самодельным ПО для учёта времени.
В конфигурации имеется:
Конвертер Z-397 Web, 1 шт
Контроллеры Matrix-II Net, 2 шт
В своей программе я использую функцию ZG_Ctr_SetNotification из SDK для получения событий входа-выхода от контроллеров:
ZG_CTR_NOTIFY_SETTINGS rNS = new ZG_CTR_NOTIFY_SETTINGS(ZGIntf.ZG_NF_CTR_NEW_EVENT,
_eventMonitor.SafeWaitHandle,
IntPtr.Zero, 0,
_appReadEventIdx,
300, 0);
hr = ZGIntf.ZG_Ctr_SetNotification(_hCtr, rNS);
И далее, во время выполнения программы, SDK сигнализирует мне о новых событиях через объект синхронизации:
while (_isThreadActive)
{
if (_eventMonitor.WaitOne())
{
_eventMonitor.Reset();
if (_hCtr != IntPtr.Zero)
{
ReadEvents();
}
}
}
Вопрос следующий, если ли возможность средствами SDK организовать отказоустойчивость на случай временной потери линка от ПК до конвертера?
Я пробовал управлять структурой ZP_WAIT_SETTINGS:
ZG_CVT_INFO rInfo = new ZG_CVT_INFO();
ZG_CVT_OPEN_PARAMS rOp = new ZG_CVT_OPEN_PARAMS
{
nCvtType = ZG_CVT_TYPE.ZG_CVT_Z397_WEB,
nPortType = ZP_PORT_TYPE.ZP_PORT_IP,
nSpeed = ZG_CVT_SPEED.ZG_SPEED_19200,
pszName = _cvt,
nStopBits = 1
};
ZP_WAIT_SETTINGS pWait = new ZP_WAIT_SETTINGS(
_nReplyTimeout: 4000,
_nMaxTries: 10,
_hAbortEvent: IntPtr.Zero,
_nReplyTimeout0: 500,
_nCheckPeriod: 0,
_nConnectTimeout: 4000,
_nRestorePeriod: 3000);
rOp.pWait = Marshal.AllocHGlobal(Marshal.SizeOf(pWait));
Marshal.StructureToPtr(pWait, rOp.pWait, true);
var hr = ZGIntf.ZG_Cvt_Open(ref _hCvt, ref rOp, rInfo);
Вижу утилитой netstat, что tcp/ip связь восстанавливается
dev@DESKTOP-S7PPUM8 MINGW64 /c/SDK Guard
$ netstat -ban | grep 75
TCP 192.168.15.241:52041 192.168.15.75:1000 ESTABLISHED
Но экземпляр _eventMonitor перестает получать сигналы.
С уважением