Пинг биометрического устройства через некоторое время становится неэффективным - PullRequest
0 голосов
/ 28 ноября 2018

У меня есть ZKTeco Биометрическое устройство, которое подключено к приложению C # с использованием Это руководство (C # ZKTeco Biometric Device Getting Started) .

Работает нормально, но через некоторое время моему приложению не удалось пропинговать устройство.Как показано в приведенном ниже коде, я пытаюсь пропинговать устройство через каждые 25 секунд.

  private void TimerCheckPingAndCloseAttendanceForm() {
  timerCheckPingAndCloseAttendanceForm            = new Timer();
  timerCheckPingAndCloseAttendanceForm.Tick       += new EventHandler(CheckPingAndCloseAttendanceForm);
  timerCheckPingAndCloseAttendanceForm.Interval   = 25000;//25 seconds.
  timerCheckPingAndCloseAttendanceForm.Start();
        }


 private void CheckPingAndCloseAttendanceForm(object sender, EventArgs e) {
     string ipAddress = tbxDeviceIP.Text.Trim();
     if (UniversalStatic.PingTheDevice(ipAddress) == false) {
           //CloseAttendaceListForm();
           IsDeviceConnected = false;
           string infoString = "Application started on " + applicationStartDateTime.ToString() + " and ping failed on " + DateTime.Now.ToString() + " then, app closed while device ip is "+ ipAddress;
          File.AppendAllText("ConnectionLog.txt", infoString + Environment.NewLine);
          Application.Exit();
          //timerCheckPingAndCloseAttendanceForm.Tick -= new EventHandler(CheckPingAndCloseAttendanceForm);
            }
        }

И когда я пытаюсь пропинговать команду из cmd , устройство показывает destination host is unreachable.Но всякий раз, когда я перезагружаю устройство, пинг работает нормально.Я не знаю, где проблема?Проблема с сетью или проблема с ее кодированием?

Примечание. Я выполняю эхо-запрос на регулярном интервале времени, поскольку при отключенном событии не работает .Я предполагаю, что сбой проверки связи означает, что устройство отключено от приложения.

Ответы [ 5 ]

0 голосов
/ 07 декабря 2018

Прежде всего: Спасибо, что прочитали мою статью

Вы делаете это неправильно.

Пытаетесь пропинговатьустройство через каждые 25 секунд становится ненужным.

Единственная работа метода UniversalStatic.PingTheDevice заключается в проверке, действительно ли устройство предположительно активно , при первом подключении.с устройством.

Если вы хотите проверить состояние устройства т.е. IsDeviceConnected, все, что вам нужно сделать, это зарегистрироваться на устройстве OnDisConnected предоставлено событиеSDK.

Кажется, код здесь в строке номер 57 уже выполнил OnDisConnected регистрацию события для вас.

Все, что вам нужноЧтобы сделать это сейчас, установите для IsDeviceConnected значение false, когда метод objCZKEM_OnDisConnected в классе ZkemClient.cs вызывается самим устройством.

Пример фрагмента: В файле класса ZkemClient.cs между строкойномер 81-84

void objCZKEM_OnDisConnected()
{
     IsDeviceConnected = false;  // <-- Add this line
}

Теперь, каждый раз, когда вы пытаетесь позвонить на устройство, все, что вам нужно сделать, это проверить значение вашего IsDeviceConnected .

0 голосов
/ 05 декабря 2018

Похоже, проблема с кодом.При исследовании UniversalStatic.PingTheDevice(ipAddress) было установлено, что вызывающий System.Net.NetworkInformation.Ping.Send параметр DontFragment = true.Ссылка: https://github.com/zaagan/BioMetrix/blob/master/BioMetrixCore/Utilities/UniversalStatic.cs#LC51. Время ожидания для пинга установлено в 120 миллисекунд.Это попытается отправить 32 байта данных на указанный IP-адрес.

Ниже приведен фрагмент, взятый из https://docs.microsoft.com/en-us/dotnet/api/system.net.networkinformation.ping.send?view=netframework-4.7.2, который поможет найти причину вашей проблемы

Еслисвойство DontFragment имеет значение true, и общий размер пакета превышает максимальный размер пакета, который может быть передан одним из узлов маршрутизации между локальным и удаленным компьютерами, эхо-запрос ICMP не выполняется.Когда это происходит, для состояния устанавливается значение PacketTooBig.

Поэтому при перезапуске устройства возможно, что данные, передаваемые по сети, будут потеряны.Следовательно, он начал работать, пока пакеты не достигли своего предела.

Несколько предложений:

  • Попробуйте позвонить System.Net.NetworkInformation.Ping.Dispose в PingTheDevice до возврата
  • Увеличьте время ожидания со 120 миллисекундв секундах.
  • Увеличьте таймерCheckPingAndCloseAttendanceForm.Interval до 1 мин.
  • Проверьте код возврата System.Net.NetworkInformation.Ping.Send и найдите соответствующую ошибку, означающую

Пожалуйста, поделитесь своими выводами, если приведенные выше предложения не помогут вам найти основную причину.

0 голосов
/ 03 декабря 2018

Похоже, что устройство не работает.Ошибка «узел назначения недоступен» соответствует пакету ICMP, пакету того же типа, что и ping, но другой работе, отправляемому вашим маршрутизатором с сообщением «Я понятия не имею, какое устройство имеет этот IP».Это обычно происходит, когда устройство перестает отвечать на ARP, который в основном спрашивает, «у кого есть этот IP?»и ожидает, что машина ответит «у меня есть» своим MAC-адресом.Маршрутизатор постоянно обновляет свою таблицу ARP, забывая старые значения.

Поэтому, когда вы загружаете устройство, оно «счастливое», отвечает на ARP и отвечает на пинги;однако, что-то происходит, и это по крайней мере перестает отвечать на ARP (вероятно, что-то более неправильное с этим).В зависимости от его архитектуры, он может быть загружен, делая другие вещи и не может ответить, или он может быть просто заблокирован.

Попробуйте замедлить другие действия на устройстве (если вы запрашиваете информацию, отличную от ping,сделать это медленнее), а также посмотреть, можно ли получить статус с устройства через другой выход (у него есть UART?).

0 голосов
/ 04 декабря 2018

ОПЦИЯ 1

Поскольку перезапуск устройства устраняет вашу проблему на некоторое время, убедитесь, что используемый вами IP-адрес не используется на другом устройстве / computer / element_of_the_network.

Устройства ZKTeco поставляются с IP-адресом 192.168.1.201, настроенным по умолчанию.Настройте другой статический IP-адрес и избегайте использования DHCP (хорошо известно, что использование DHCP в устройствах ZKTeco не является хорошим выбором, поскольку они не обновляют IP-адрес автоматически после перезагрузки системы или любых изменений сети).

Убедитесь, что IP-адрес не используется и никто другой не будет его использовать.

ВАРИАНТ 2

Еще одна вещь, которая может быть причиной вашей проблемы,Это то, что вы используете zkemkeeper в другой части вашего приложения (или в другом приложении), и вы не закрываете противоположные соединения должным образом ... Это может блокировать всю сетевую активность с устройства.Чтобы закрыть соединение, просто убедитесь, что вы вызываете этот метод SDK после выполнения всех необходимых действий:

sdk.Disconnect();
0 голосов
/ 03 декабря 2018

Не имея фактического кода и аппаратной настройки, этот ответ является небольшим ударом в темноте, но здесь идет ...

Поскольку он работает изначально, это не проблема аппаратной конфигурации или конфигурации сети,Тем не менее он говорит, что через некоторое время пункт назначения (читатель) становится недоступным.Вероятно, это не проблема поддержки активности сети, потому что вы пингуетесь каждые 25 секунд.Глядя на код, на который вы ссылались, он показывает, как открыть соединение и подключить обратные вызовы, а также сделать вызов аппаратной функции.

Полагаю, может быть, вы открываете соединение каждый пинг, а не закрываете соединение, а затем после нескольких попыток аппаратное зависание из-за слишком большого количества открытых соединений.Просто предположение.Если это проблема, то чтобы исправить ее, либо закройте соединение, либо, лучше, оставьте соединение открытым и используйте его повторно.

Альтернативная возможность - маршрутизатор (ы) между вашим кодом и устройством.обнаруживают слишком много пингов и блокируют соединение как возможную атаку DOS.Если это проблема, то для ее устранения настройте маршрутизатор, чтобы разрешить трафик.

...