public JournalViewModel(GKDevice device) { Title = "Журнал событий ГК " + device.GetGKIpAddress(); ReadCommand = new RelayCommand(OnRead); SaveToFileCommand = new RelayCommand(OnSaveToFile); JournalItems = new ObservableCollection<JournalItemViewModel>(); Device = device; GKManager.UpdateConfiguration(); GKManager.CreateStates(); DescriptorsManager.Create(); }
override public bool ReadConfiguration(GKDevice gkControllerDevice, Guid clientUID) { var progressCallback = GKProcessorManager.StartProgress("Чтение конфигурации " + gkControllerDevice.PresentationName, "Проверка связи", 2, true, GKProgressClientType.Administrator, clientUID); var result = DeviceBytesHelper.Ping(gkControllerDevice); if (result.HasError) { Error = "Устройство " + gkControllerDevice.PresentationName + " недоступно"; return false; } IpAddress = gkControllerDevice.GetGKIpAddress(); ControllerDevices = new Dictionary<ushort, GKDevice>(); DeviceConfiguration = new GKDeviceConfiguration(); var rootDriver = GKManager.Drivers.FirstOrDefault(x => x.DriverType == GKDriverType.System); DeviceConfiguration.RootDevice = new GKDevice { Driver = rootDriver, DriverUID = rootDriver.UID }; GKProcessorManager.DoProgress("Перевод ГК в технологический режим", progressCallback, clientUID); if (!DeviceBytesHelper.GoToTechnologicalRegime(gkControllerDevice, progressCallback, clientUID)) { Error = "Не удалось перевести " + gkControllerDevice.PresentationName + " в технологический режим\n" + "Устройство не доступно, либо вашего " + "IP адреса нет в списке разрешенного адреса ГК"; GKProcessorManager.StopProgress(progressCallback, clientUID); return false; } ReadConfiguration(gkControllerDevice, progressCallback, clientUID); GKProcessorManager.DoProgress("Перевод ГК в рабочий режим", progressCallback, clientUID); if (!DeviceBytesHelper.GoToWorkingRegime(gkControllerDevice, progressCallback, clientUID)) { Error = "Не удалось перевести устройство в рабочий режим в заданное время"; } GKProcessorManager.StopProgress(progressCallback, clientUID); if (Error != null) return false; DeviceConfiguration.Update(); return true; }
public static string GetIpAddress(GKDevice device) { GKDevice gkControllerDevice = null; switch (device.DriverType) { case GKDriverType.GK: gkControllerDevice = device; break; case GKDriverType.RSR2_KAU: case GKDriverType.GKMirror: gkControllerDevice = device.Parent; break; default: { Logger.Error("GKManager.GetIpAddress Получить IP адрес можно только у ГК или в КАУ или в ПМФ"); throw new Exception("Получить IP адрес можно только у ГК или в КАУ или в ПМФ"); } } var ipAddress = gkControllerDevice.GetGKIpAddress(); return ipAddress; }
public static bool IsValidIpAddress(GKDevice device) { if (device.DriverType == GKDriverType.GK) { const string pattern = @"^([01]\d\d?|[01]?[1-9]\d?|2[0-4]\d|25[0-3])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])$"; var address = device.GetGKIpAddress(); if (string.IsNullOrEmpty(address) || !Regex.IsMatch(address, pattern)) { return false; } } return true; }
public static bool RemoveAllUsers(GKDevice device, int usersCount, GKProgressCallback progressCallback, Guid clientUID) { var removeAllUsersInternalResult = RemoveAllUsersInternal(device, usersCount, progressCallback); if (removeAllUsersInternalResult.HasError) return false; var cardsCount = removeAllUsersInternalResult.Result; if (cardsCount == 0) return false; using (var skdDatabaseService = new RubezhDAL.DataClasses.DbService()) { GKProcessorManager.DoProgress("Удаление пользователей прибора из БД", progressCallback, clientUID); skdDatabaseService.GKCardTranslator.RemoveAll(device.GetGKIpAddress(), cardsCount); } return true; }
public static OperationResult<bool> RemoveCard(GKDevice device, SKDCard card, RubezhDAL.DataClasses.DbService dbService = null) { var no = 1; if (dbService == null) { using (var skdDatabaseService = new RubezhDAL.DataClasses.DbService()) { no = skdDatabaseService.GKCardTranslator.GetGKNoByCardNo(device.GetGKIpAddress(), card.Number); } } else no = dbService.GKCardTranslator.GetGKNoByCardNo(device.GetGKIpAddress(), card.Number); if (no == -1) { return OperationResult<bool>.FromError("По номеру карты не найдена порядковая запись"); } var bytes = new List<byte>(); bytes.Add(0); bytes.AddRange(BytesHelper.ShortToBytes((ushort)(no))); bytes.Add(0); bytes.Add(1); var nameBytes = BytesHelper.StringDescriptionToBytes("-"); bytes.AddRange(nameBytes); bytes.AddRange(BytesHelper.IntToBytes(-1)); bytes.Add(0); bytes.Add(0); for (int i = 0; i < 256 - 42; i++) { bytes.Add(0); } var sendResult = SendManager.Send(device, (ushort)(bytes.Count), 26, 0, bytes); if (sendResult.HasError) { return OperationResult<bool>.FromError(sendResult.Error); } using (var skdDatabaseService = new RubezhDAL.DataClasses.DbService()) { skdDatabaseService.GKCardTranslator.Remove(device.GetGKIpAddress(), no, card.Number); } return new OperationResult<bool>(true); }
public JournalParser(GKDevice gkControllerDevice, List<byte> bytes) { JournalItem = new JournalItem(); JournalItem.JournalObjectType = JournalObjectType.GKDevice; GKJournalRecordNo = BytesHelper.SubstructInt(bytes, 0); if (GKJournalRecordNo > 0) JournalItem.JournalDetalisationItems.Add(new JournalDetalisationItem("Запись ГК", GKJournalRecordNo.ToString())); GKObjectNo = BytesHelper.SubstructShort(bytes, 4); JournalItem.ObjectUID = gkControllerDevice.UID; var controllerAddress = BytesHelper.SubstructShort(bytes, 32 + 10); if (controllerAddress != 0x200) { var kauDevice = gkControllerDevice.AllChildren.FirstOrDefault(x => (x.Driver.IsKau || x.DriverType == GKDriverType.GKMirror) && x.IntAddress == controllerAddress); if (kauDevice != null) JournalItem.ObjectUID = kauDevice.UID; KauJournalRecordNo = BytesHelper.SubstructInt(bytes, 0x20); } InitializeFromObjectUID(gkControllerDevice); var kauObjectNo = BytesHelper.SubstructShort(bytes, 54); InitializeDateTime(bytes); JournalSourceType = (JournalSourceType)(int)(bytes[32 + 12]); var code = bytes[32 + 13]; switch (JournalSourceType) { case JournalSourceType.Controller: switch (code) { case 0: JournalItem.JournalEventNameType = JournalEventNameType.Перевод_в_технологический_режим; break; case 2: JournalItem.JournalEventNameType = JournalEventNameType.Синхронизация_времени_прибора_с_временем_ПК; break; case 4: JournalItem.JournalEventNameType = JournalEventNameType.Смена_ПО; break; case 5: JournalItem.JournalEventNameType = JournalEventNameType.Смена_БД; break; case 6: JournalItem.JournalEventNameType = JournalEventNameType.Перевод_в_рабочий_режим; break; case 7: JournalItem.JournalEventNameType = JournalEventNameType.Вход_пользователя_в_прибор; JournalItem.JournalEventDescriptionType = JournalStringsHelper.ToUser(bytes[32 + 15], true); var bytes1 = bytes.GetRange(6, 31 - 6 + 1); var bytes2 = bytes.GetRange(48, 53 - 48 + 1); bytes1.AddRange(bytes2); JournalItem.UserName = Encoding.Default.GetString(bytes1.ToArray(), 0, bytes1.Count); JournalItem.JournalObjectType = JournalObjectType.GKDevice; break; case 8: JournalItem.JournalEventNameType = JournalEventNameType.Выход_пользователя_из_прибора; JournalItem.JournalEventDescriptionType = JournalStringsHelper.ToUser(bytes[32 + 15], false); bytes1 = bytes.GetRange(6, 31 - 6 + 1); bytes2 = bytes.GetRange(48, 53 - 48 + 1); bytes1.AddRange(bytes2); JournalItem.UserName = Encoding.Default.GetString(bytes1.ToArray(), 0, bytes1.Count); JournalItem.JournalObjectType = JournalObjectType.GKDevice; break; case 9: JournalItem.JournalEventNameType = JournalEventNameType.Ошибка_управления; GKObjectNo = BytesHelper.SubstructShort(bytes, 18); break; case 10: JournalItem.JournalEventNameType = JournalEventNameType.Введен_новый_пользователь; bytes1 = bytes.GetRange(6, 31 - 6 + 1); bytes2 = bytes.GetRange(48, 53 - 48 + 1); bytes1.AddRange(bytes2); JournalItem.UserName = Encoding.Default.GetString(bytes1.ToArray(), 0, bytes1.Count); JournalItem.JournalObjectType = JournalObjectType.GKDevice; break; case 11: JournalItem.JournalEventNameType = JournalEventNameType.Изменена_учетная_информация_пользователя; bytes1 = bytes.GetRange(6, 31 - 6 + 1); bytes2 = bytes.GetRange(48, 53 - 48 + 1); bytes1.AddRange(bytes2); JournalItem.UserName = Encoding.Default.GetString(bytes1.ToArray(), 0, bytes1.Count); JournalItem.JournalObjectType = JournalObjectType.GKDevice; break; case 12: JournalItem.JournalEventNameType = JournalEventNameType.Произведена_настройка_сети; break; case 13: JournalItem.JournalEventNameType = JournalEventNameType.Проход_пользователя_разрешен; var gkCardNo = BytesHelper.SubstructInt(bytes, 32 + 24); JournalItem.CardNo = gkCardNo; var door = GKManager.Doors.FirstOrDefault(x => x.GKDescriptorNo == GKObjectNo && x.GkDatabaseParent.GKParent == gkControllerDevice); if (door != null) { var readerDevice = GKManager.Devices.FirstOrDefault(x => x.GKDescriptorNo == kauObjectNo && x.GkDatabaseParent.GKParent == gkControllerDevice); if (readerDevice != null) { if (door.EnterDeviceUID == readerDevice.UID) { JournalItem.JournalEventDescriptionType = JournalEventDescriptionType.Вход_Глобал; } else if (door.ExitDeviceUID == readerDevice.UID) { JournalItem.JournalEventDescriptionType = JournalEventDescriptionType.Выход_Глобал; } } } using (var databaseService = new RubezhDAL.DataClasses.DbService()) { var cardNo = databaseService.GKCardTranslator.GetCardNoByGKNo(gkControllerDevice.GetGKIpAddress(), (int)gkCardNo); var operationResult = databaseService.CardTranslator.GetEmployeeByCardNo(cardNo); if (!operationResult.HasError) { var employeeUID = operationResult.Result; JournalItem.EmployeeUID = employeeUID; if (employeeUID != Guid.Empty) { var employee = databaseService.EmployeeTranslator.GetSingle(employeeUID); if (employee != null) { JournalItem.UserName = employee.Result.Name; } } } } break; case 14: JournalItem.JournalEventNameType = JournalEventNameType.Рабочий_график; var scheduleNo = (uint)BytesHelper.SubstructInt(bytes, 32 + 24); bytes1 = bytes.GetRange(6, 31 - 6 + 1); bytes2 = bytes.GetRange(48, 53 - 48 + 1); bytes1.AddRange(bytes2); var scheduleName = Encoding.Default.GetString(bytes1.ToArray(), 0, bytes1.Count).TrimEnd(' '); if (string.IsNullOrEmpty(scheduleName)) scheduleName = scheduleNo.ToString(); JournalItem.DescriptionText = scheduleName; break; case 15: JournalItem.JournalEventNameType = JournalEventNameType.Проход_пользователя_запрещен; gkCardNo = BytesHelper.SubstructInt(bytes, 32 + 24); JournalItem.CardNo = gkCardNo; door = GKManager.Doors.FirstOrDefault(x => x.GKDescriptorNo == GKObjectNo && x.GkDatabaseParent.GKParent == gkControllerDevice); if (door != null) { var readerDevice = GKManager.Devices.FirstOrDefault(x => x.GKDescriptorNo == kauObjectNo && x.GkDatabaseParent.GKParent == gkControllerDevice); if (readerDevice != null) { if (door.EnterDeviceUID == readerDevice.UID) { JournalItem.JournalEventDescriptionType = JournalEventDescriptionType.Вход_Глобал; } else if (door.ExitDeviceUID == readerDevice.UID) { JournalItem.JournalEventDescriptionType = JournalEventDescriptionType.Выход_Глобал; } } } using (var databaseService = new RubezhDAL.DataClasses.DbService()) { var cardNo = databaseService.GKCardTranslator.GetCardNoByGKNo(gkControllerDevice.GetGKIpAddress(), (int)gkCardNo); var operationResult = databaseService.CardTranslator.GetEmployeeByCardNo(cardNo); if (!operationResult.HasError) { var employeeUID = operationResult.Result; JournalItem.EmployeeUID = employeeUID; if (employeeUID != Guid.Empty) { var employee = databaseService.EmployeeTranslator.GetSingle(employeeUID); if (employee != null) { JournalItem.UserName = employee.Result.Name; } } } } break; default: JournalItem.JournalEventNameType = JournalEventNameType.Неизвестный_код_события_контроллекра; JournalItem.DescriptionText = code.ToString(); break; } break; case JournalSourceType.Device: var unknownType = BytesHelper.SubstructShort(bytes, 32 + 14); var unknownAddress = BytesHelper.SubstructShort(bytes, 32 + 16); var presentationAddress = (unknownAddress / 256 + 1).ToString() + "." + (unknownAddress % 256).ToString(); var driverName = unknownType.ToString(); var driver = GKManager.Drivers.FirstOrDefault(x => x.DriverTypeNo == unknownType); if (driver != null) { driverName = driver.ShortName; }; var unknownDescription = "Тип: " + driverName + " Адрес: " + presentationAddress; switch (code) { case 0: JournalItem.JournalEventNameType = JournalEventNameType.Неизвестный_тип; JournalItem.DescriptionText = unknownDescription; break; case 1: JournalItem.JournalEventNameType = JournalEventNameType.Устройство_с_таким_адресом_не_описано_при_конфигурации; JournalItem.DescriptionText = unknownDescription; break; default: JournalItem.JournalEventNameType = JournalEventNameType.Неизвестный_код_события_устройства; JournalItem.DescriptionText = code.ToString(); break; } break; case JournalSourceType.Object: var UNUSED_ObjectNo = BytesHelper.SubstructShort(bytes, 32 + 18); var descriptorType = BytesHelper.SubstructShort(bytes, 32 + 20); JournalItem.JournalDetalisationItems.Add(new JournalDetalisationItem("Тип дескриптора", descriptorType.ToString())); var descriptorAddress = BytesHelper.SubstructShort(bytes, 32 + 22); JournalItem.JournalDetalisationItems.Add(new JournalDetalisationItem("Адрес дескриптора", descriptorAddress.ToString())); var objectFactoryNo = (uint)BytesHelper.SubstructInt(bytes, 32 + 24); if (objectFactoryNo > 0) JournalItem.JournalDetalisationItems.Add(new JournalDetalisationItem("Заводской номер", objectFactoryNo.ToString())); ObjectState = BytesHelper.SubstructInt(bytes, 32 + 28); switch (code) { case 0: JournalItem.JournalEventNameType = JournalEventNameType.При_конфигурации_описан_другой_тип; var realType = BytesHelper.SubstructShort(bytes, 32 + 14); var realDriverString = "Неизвестный тип " + realType.ToString(); var realDriver = GKManager.Drivers.FirstOrDefault(x => x.DriverTypeNo == realType); if (realDriver != null) { realDriverString = realDriver.ShortName; } JournalItem.DescriptionText = "Действительный тип: " + realDriverString; break; case 1: JournalItem.JournalEventNameType = JournalEventNameType.Изменился_заводской_номер; JournalItem.DescriptionText = "Старый заводской номер: " + BytesHelper.SubstructInt(bytes, 32 + 14).ToString() + " Новый заводской номер: " + objectFactoryNo.ToString(); break; case 2: JournalItem.JournalEventNameType = JournalEventNameType.Пожар_1; if (JournalItem.JournalObjectType == JournalObjectType.GKDevice) { JournalItem.JournalEventNameType = JournalEventNameType.Сработка_1; } if (JournalItem.JournalObjectType == JournalObjectType.GKGuardZone || JournalItem.JournalObjectType == JournalObjectType.GKDoor) { JournalItem.JournalEventNameType = JournalEventNameType.Тревога; } JournalItem.JournalEventDescriptionType = JournalStringsHelper.ToFire(bytes[32 + 15]); break; case 3: JournalItem.JournalEventNameType = JournalEventNameType.Пожар_2; if (JournalItem.JournalObjectType == JournalObjectType.GKDevice) { JournalItem.JournalEventNameType = JournalEventNameType.Сработка_2; } JournalItem.JournalEventDescriptionType = JournalStringsHelper.ToFire(bytes[32 + 15]); break; case 4: JournalItem.JournalEventNameType = JournalEventNameType.Внимание; break; case 5: JournalItem.JournalEventNameType = JournalEventNameType.Неисправность; if (bytes[32 + 14] == 0) { JournalItem.JournalEventNameType = JournalEventNameType.Неисправность_устранена; } bool isFailure = JournalItem.JournalEventNameType == JournalEventNameType.Неисправность; switch (descriptorType) { case 0xD6: JournalItem.JournalEventDescriptionType = JournalStringsHelper.ToBatteryFailure(bytes[32 + 15], isFailure); break; default: JournalItem.JournalEventDescriptionType = JournalStringsHelper.ToFailure(bytes[32 + 15], isFailure, descriptorType == 0xE5); if (bytes[32 + 15] >= 241 && bytes[32 + 15] <= 254) { var firstAdditionalDescription = bytes[32 + 16].ToString(); var secondAdditionalDescription = bytes[32 + 17].ToString(); if (JournalItem.JournalEventDescriptionType == JournalEventDescriptionType.ОЛС_Неисправность || JournalItem.JournalEventDescriptionType == JournalEventDescriptionType.ОЛС_Неисправность_устранена) { var gkDevice = GKManager.Devices.FirstOrDefault(x => x.UID == JournalItem.ObjectUID); if (gkDevice != null) { var kauCount = gkDevice.AllChildren.FindAll(x => x.Driver.IsKau || x.DriverType == GKDriverType.GKMirror).Count; if (firstAdditionalDescription == "0") firstAdditionalDescription = "ГК"; else firstAdditionalDescription = "КАУ " + bytes[32 + 16]; if (bytes[32 + 17] > kauCount) secondAdditionalDescription = "ГК"; else { var device = gkDevice.Children.FirstOrDefault(x => (x.Driver.IsKau || x.DriverType == GKDriverType.GKMirror) && x.IntAddress == bytes[32 + 17]); if (device != null) secondAdditionalDescription = device.PresentationName; } } } else { var kauDevice = GKManager.Devices.FirstOrDefault(x => x.UID == JournalItem.ObjectUID); if (kauDevice != null) { var device1 = kauDevice.AllChildren.FirstOrDefault(x => x.IntAddress == bytes[32 + 16]); var device2 = kauDevice.AllChildren.FirstOrDefault(x => x.IntAddress == bytes[32 + 17]); if (firstAdditionalDescription == "0" || (device1 != null && device1.DriverType == GKDriverType.RSR2_KAU_Shleif)) firstAdditionalDescription = "КАУ"; if (secondAdditionalDescription == "0" || (device2 == null || device2.DriverType == GKDriverType.RSR2_KAU_Shleif)) secondAdditionalDescription = "КАУ"; } } if (JournalItem.JournalEventNameType == JournalEventNameType.Неисправность_устранена) break; JournalItem.DescriptionText = "устройства " + firstAdditionalDescription + " _ " + secondAdditionalDescription; } break; } break; case 6: JournalItem.JournalEventNameType = JournalEventNameType.Тест; if (bytes[32 + 14] == 0) { JournalItem.JournalEventNameType = JournalEventNameType.Тест_устранен; } break; case 7: JournalItem.JournalEventNameType = JournalEventNameType.Запыленность; if (bytes[32 + 14] == 0) { JournalItem.JournalEventNameType = JournalEventNameType.Запыленность_устранена; } bool isDust = JournalItem.JournalEventNameType == JournalEventNameType.Запыленность; switch (bytes[32 + 15]) { case 1: JournalItem.JournalEventDescriptionType = isDust ? JournalEventDescriptionType.Предварительная_Запыленность : JournalEventDescriptionType.Предварительная_Запыленность_устранена; break; case 2: JournalItem.JournalEventDescriptionType = isDust ? JournalEventDescriptionType.Критическая_Запыленность : JournalEventDescriptionType.Критическая_Запыленность_устранена; break; } break; case 8: JournalItem.JournalEventNameType = JournalEventNameType.Информация; JournalItem.JournalEventDescriptionType = JournalStringsHelper.ToInformation(bytes[32 + 15]); if (Device != null && (Device.DriverType == GKDriverType.RSR2_Valve_KV || Device.DriverType == GKDriverType.RSR2_Valve_KVMV || Device.DriverType == GKDriverType.RSR2_Valve_DU)) { JournalItem.JournalEventDescriptionType = JournalStringsHelper.ToValveInformation(bytes[32 + 15]); } break; case 9: JournalItem.JournalEventNameType = JournalStringsHelper.ToState(bytes[32 + 15]); if (Device != null && (Device.DriverType == GKDriverType.RSR2_Valve_KV || Device.DriverType == GKDriverType.RSR2_Valve_KVMV || Device.DriverType == GKDriverType.RSR2_Valve_DU || Device.DriverType == GKDriverType.RSR2_Buz_KV || Device.DriverType == GKDriverType.RSR2_Buz_KVMV || Device.DriverType == GKDriverType.RSR2_Buz_KVDU)) { JournalItem.JournalEventNameType = JournalStringsHelper.ToValveState(bytes[32 + 15]); } if (GuardZone != null) { JournalItem.JournalEventNameType = JournalStringsHelper.ToGuardZoneState(bytes[32 + 15]); } break; case 10: switch (bytes[32 + 15]) { case 0: JournalItem.JournalEventNameType = JournalEventNameType.Перевод_в_автоматический_режим; break; case 1: JournalItem.JournalEventNameType = JournalEventNameType.Перевод_в_ручной_режим; break; case 2: JournalItem.JournalEventNameType = JournalEventNameType.Перевод_в_отключенный_режим; break; case 3: JournalItem.JournalEventNameType = JournalEventNameType.Перевод_в_неопределенный_режим; break; default: JournalItem.JournalEventNameType = JournalEventNameType.Неизвестный_код_события_объекта; break; } break; case 12: JournalItem.JournalEventNameType = JournalEventNameType.Управление_ПМФ; switch (bytes[32 + 15]) { case 1: JournalItem.JournalEventDescriptionType = JournalEventDescriptionType.Перевод_в_автоматический_режим_Управление_ПМФ; break; case 2: JournalItem.JournalEventDescriptionType = JournalEventDescriptionType.Перевод_в_ручной_режим_Управление_ПМФ; break; case 4: JournalItem.JournalEventDescriptionType = JournalEventDescriptionType.Постановка_на_охрану; break; case 5: JournalItem.JournalEventDescriptionType = JournalEventDescriptionType.Снятие_с_охраны; break; case 8: JournalItem.JournalEventDescriptionType = JournalEventDescriptionType.Сброс_Управление_ПМФ; break; case 9: JournalItem.JournalEventDescriptionType = JournalEventDescriptionType.Пуск; break; case 10: JournalItem.JournalEventDescriptionType = JournalEventDescriptionType.Стоп; break; } break; case 13: JournalItem.JournalEventNameType = JournalEventNameType.Запись_параметра; break; case 14: JournalItem.JournalEventNameType = JournalEventNameType.Норма; break; default: JournalItem.JournalEventNameType = JournalEventNameType.Неизвестный_код_события_объекта; JournalItem.DescriptionText = code.ToString(); break; } break; } JournalItem.JournalSubsystemType = EventDescriptionAttributeHelper.ToSubsystem(JournalItem.JournalEventNameType); InitializeMAMessage(); }