/// <summary> /// Синхронный запуск сканирования. /// </summary> public void Start() { // Статусы. InProgress = true; Stopped = false; // Перебор подсетей и опрос арендованных айпи-адресов по snmp. Logger.AddLog("Определение списка IP-адресов подсетей."); foreach (var subnet in subnets) { try { subnet.Clients = Dhcp.FindDhcpClients(dncpServer, subnet.Address); } catch (Exception ex) { Logger.AddLog(ex.Message); } } ProgressMax = subnets.Select(x => x.Clients.Count).Sum(); ProgressValue = 0; Logger.AddLog("Опрос IP-адресов."); foreach (var subnet in subnets) { if (subnet.Clients.Any()) { foreach (var addr in subnet.Clients) { // Токен остановки выполнения. if (token.IsCancellationRequested) { InProgress = false; Stopped = true; return; } // Установка прогресса выполнения. ProgressPercent = ++ProgressValue / ProgressMax; // Переменная ответа. SnmpV1Packet response; // Отправка запроса. try { response = SendRequest(addr.Ip); } catch { continue; } // Запись значений. string netname = response.Pdu.VbList[0].Value.ToString(); string model = response.Pdu.VbList[1].Value.ToString(); string serialNumber = response.Pdu.VbList[2].Value.ToString(); var printer = new Printer(subnet, addr.Ip, model, serialNumber, netname); // Валидация и добавление принтера в репозиторий. List <ValidationResult> results = printer.Validate(new ValidationContext(printer)).ToList(); if (!results.Any()) { subnet.AddPrinter(printer); DeviceRepository.AddPrinter(printer); Logger.AddLog($"Обнаружен принтер - {printer.Model}, сетевое имя - {printer.NetName}, IP - {printer.Ip}."); } } if (!DeviceRepository.Subnets.Contains(subnet)) { DeviceRepository.AddSubnet(subnet); } } else { Logger.AddLog($"В подсети {subnet.Address} нет арендованных IP адресов."); } } Logger.AddLog("Сканирование завершено."); InProgress = false; Stopped = true; }