Андрей Смирнов
Время чтения: ~12 мин.
Просмотров: 4

Протокол Wiegand26 для обмена rfid — считывателя с контроллерами AVR

Оцените мою статью: (50 оценок, среднее: 4.56 из 5)iam9.jpgАвтор:Генеральный директор «Интемс», Закончил «Московский государственный институт электронной техники» по специальности «микроэлектроника». В системах безопасности с 2005 года.   Хобби — системы безопасности. Интересы, помимо работы  — системы безопасности. Религиозные взгляды — системы безопасности. Давайте дружить в соцсетях, Это мои —  FacebookTwitter, LinkedInВКонтактеОдноклассники, добавляйтесь в друзья. У меня есть проекты, для которых я часто ищу партнеров, участников и т.д. Возможно, именно с Вами мы сможем посотрудничать. В любом случае я не нарушаю Ваше личное пространство, спам не рассылаю, продать ничего не пытаюсь. Подписывайтесь на мой YouTube канал, там пока один ролик, но уже скоро будет много годноты. Нужна моя личная консультация? Пишите вопросы в комментарии к видео на моем канале, на вопросы отвечаю только там. © «Интемс», при полном или частичном копировании материала ссылка на первоисточник обязательна.Вернуться26/02/2014 11:511393404727_avr_rfid_reader_foto2.jpg Русское описание wiegand26 в интернете найти оказалось не очень просто, пришлось разбираться по обрывкам информации. Когда разобрался, понял почему нет информации и примеров — тема достаточно проста и в классическом варианте (wiegand 26 bit) легко разбирается даже новичком. Немного о Wiegand протоколе Протокол wiegand26 появился в 80х годах как промышленный стандарт для систем контроля доступа — трехпроводная линия соединяет считыватель магнитных карт с платой контроллера, который обеспечивает хранение и контроль номеров карт. В настоящее время магнитные карты практически вытеснены бесконтактными картами RFID, а протокол wiegand 26 был расширен и дополнен, но активно используется до сих пор как стандарт в большинстве охранных систем.Wiegand протокол — физический уровень Для передачи данных используются два провода — D0 / D1 и один для объединения земли ридера и контроллера. С учетом линии питания, минимально для подключения считывателя необходимо 4 жилы. Остальные 3-4 используются для управления дополнительными функциями считывателя. В состоянии покоя, линии D0и D1 имеют высокий уровень (+5V) или неопределенный в расчете на подтяжку на стороне контроллера. Для передачи бита данных, считыватель притягивает одну из линий к земле на 50мкс, отпускает на 2мс и передает следующий бит притягивая соответствующую линию на 50мкс и снова пауза в 2мс. Если пауза между передачами больше 2мс, значит передача данных завершена. Состояние бита 0 или 1 определяется по тому, какая линия D0 или D1 была притянута к земле в момент передачи бита. Линия D0 отвечает за нули, линия D1 за единицы. Для наглядности приложу картинку 1393403742_wiegand_diagram.jpg Однако, следует учитывать, что у разных производителей ширина импульсов и пауз между ними может отличаться очень сильно. Импульсы от 20 до 200 мкс и паузы от 200 до 3000мкс. Если быть точнее, то стоит говорить не про промежутки (паузы), а про длину посылки одного бита, впрочем, это видно на графике, т.к. время считается от начала посылки одного бита, до начала посылки второго и включает в себя сам бит.Wiegand протокол — логический уровень На логическом уровне протокол wiegand26 состоит из 26 бит данных, внутри которых хранятся 2 номера — facility code и card number. Facility code – нормер объекта или зоны Card number – номер карточки доступа. Первый бит используется для контроля первой половины данных (b1-b13) — если количество единиц в первой половине посылки нечетное, бит = 1 Следующие 8 бит (b2 – b9) — facility code (старший бит впереди) Затем идут 16 бит (b14-b25) с номером карты (старший бит впереди) Последний бит в посылке отвечает за контроль второй половины собранных данных (b14-b26) — если количество единиц во второй половине посылки четное, то бит =0Более поздние версии wiegand протокола В последнее время идет медленное вытеснение wiegand 26 расширенным вариантом протокола, где под коды выделяется не 26, а 32-40 бит + биты проверки четности. Общее количество бит в посылке, как и в случае с wiegand26, определяется по цифрам в названии протокола (wiegand33-wiegand42). Существует так же огромное количество других разновидностей протокола с разными названиями и разным количеством бит, но по сути они все похожи и всё, что нужно выяснить это длину первой и второй части кода, а так же наличие битов четности.Клавиатуры с wiegand Некоторые считыватели совмещаются с клавиатурами и тогда контроллер охранной системы проверят карту и пин код набранный на клавиатуре. Чаще всего, пин код передается по одной цифре, длина посылки в таком случае всего 4 бита без битов четности. Но у разных производителей могут быть разные форматы. На практике мне несколько раз приходилось связываться с производителем и выяснять совместимы ли их системы со стандартом и часто ответ был «да, совместимо, но только в части карточек, для кода свой формат, мы его не разглашаем». Но имея анализатор сигналов, можно легко разобраться что и как передается, т.к. общий принцип остается неизменным. Ниже я приведу пример чтения wiegand26 для attiny2313, который можно легко переделать в такой анализатор.Номера зашитые в карточку Формат Wiegand26, как уже было описано выше, содержит всего 2 кода — facility code и card number. Facility code – это код здания или фирмы. Card number — номер карточки. Изначально предполагалось, следующая логика: фирма 1 имеет карточки с facility кодом 1 и соответственно до 65535 карточек с уникальными номерами. Фирма 2 имеет карточки с facility кодом 2 и до 65535 карточек с теми же номерами что и у фирмы 1, но с другим facility кодом. Система контроля доступа проверяет facility код, если он совпадет с кодом принятым в этой фирме, проверяется номер карточки и если карточка есть в базе системы, дверь открывается. Если facility code не совпадает с принятым на данном объекте, система отказывает без проверки номера карты. В большинстве современных систем, facility код частично утратил свой смысл и внутри объекта используются карты с любыми facility кодами, но общий принцип проверки остается похожим — сначала проверка короткого кода, затем проверка основного номера. В более новых форматах длина facility кода увеличена в 2 раза — до 2х байт и номер карты увеличен в несколько раз. В отличии от некоторых других систем, коды на картах не являются уникальными и могут повторяться в разных партиях или у разных производителей. Только достаточная длина кода защищает от совпадения номеров карт. Так же в расширенных форматах, может содержаться большое количество дополнительной информации, часто доступной для перезаписи, в которой может храниться либо информация о сотруднике (Ф,И,О, должность и тп), либо уникальные, записанные системой данные или уникальный неизменяемый код, которого нет в основной части протокола. Мне не известно как точно работают расширенные форматы и как происходит их чтение. Желающим изучить работу системы подробнее, советую отправиться на сайт производителя таких систем или в google. Ключевые слова — Mifare, HID, RFID.Карточки и частоты В системах контроля доступа в основном используются 2 типа карточек — 125КГц и 13,5Мгц. 125КГц — наиболее распространенный формат, используется в основной массе считывателей, 13,5МГц более новый и чуть менее распространенный, но для для общения контроллера со считывателем эта информация не имеет значения, т.к. на стороне контроллера считыватель будет работать одинаково. Некоторые считыватели поддерживают обе частоты. Карточки обоих форматов делятся на 2 типа — карточки доступные только для чтения и карточки с перезаписываемой памятью. В первом случае оба кода записаны при производстве карт и не меняются, во втором — номера можно менять при необходимости, например, при переводе сотрудника в другое здание, с другим facility кодом. Обычно карты всех форматов несут общую стандартную часть в 26 бит, всё остальное читается по отдельному запросу системы, после чтения основной части.Подключение RFID считывателя к attiny2313 Для экспериментов с RFID считывателем я накидал небольшую схему Attiny2313 + стандартная обвязка — кварц 8 мгц, 2 конденсатора от кварца к земле, резистор от ресета к питанию, разъем программирования, разъем для связи с компом (через FT232 или MAX232). В дополнение 78l05 для питания контроллера. Из обвязки необходимой для тестов считывателя только разъем для подключения самого считывателя (слева снизу), реле для замка, 2 джампера для выбора режима работы (ADD/DEL) схемы и для полноты картины я добавил ещё пару входов для геркона (МК) и для кнопки которая ставится с обратной стороны двери (REX). На клеммы BEEP, RED и GREEN заводятся 3 оставшихся провода от считывателя, отвечающие за бипер, красный лед и зеленый лед соответственно. Управляются они нулем (PORTB.6=0 включит зеленый светодиод на считывателе).Плата номер 1 Маленькая платка, которая поместится в небольшую пластиковую распредку.Плата номер 2 Эта платка, более удобна как законченное устройство — все разъемы находятся на одной стороне и не нужно тянуть лишние проводники через плату. Как законченное устройство идущее в серию такой вариант будет предпочтительнее (оцениваю как профессиональный монтажник таких систем). Однако на плате из защиты только конденсаторы на MK и REX входах, на питании. Строить полноценную систему на такой плате я бы не стал. Так же на эту плату я добавил джампер для отключения реле — это может пригодиться, если используется только выведенный на клемник сигнал открытия двери (PD5). И ещё светодиод на питании — очень удобно в реальных условиях. Вот так это выглядит в собранном виде А вот плата с подключенным считывателем и омметром вместо замка на выходе реле. Пример чтения wiegand26 для attiny2313 Замок на бесконтактных карточках. Замок просто читает код с карты и проверяет есть ли такой в базе, если есть — открывает дверь. Общий алгоритм: 1. Отловить и записать изменения на входах D0 и D1 2. Обработать полученные данные и выделить 2 кода 3. Произвести поиск по базе и при нахождении кода в базе включить реле на некоторое время 4. Очистить память от собранных данных и перейти к пункту 1.

char dat[26]; // массив для сбора 26 бит данных unsigned char fcode; // для facility code (0..255) unsigned int code; // для card number (0..65535)  while(){  if(PIND.3==0){ // считыватель притянул D1 к земле dat[i]=1; // это D1, значит бит = 1 i++; while(PIND.3==0){};//ждем пока линия вернется в исходное состояние }  if(PIND.4==0){// считыватель притянул D0 к земле dat[i]=0; // это D0, значит бит = 0 i++;    while(PIND.4==0){}; //ждем пока линия вернется в исходное состояние }  if(i==27) { //если i=27, значит 26 бит собрано и больше данных быть не должно //теперь обработаем полученные данные b=0; for(a=9;a>1;a--){ //пробегаем через первые 8 бит в обратном порядке if(dat[a]==1) fcode=fcode+stepen(b); //если соответствующий бит =1,      //прибавляем к коду степерь числа 2      //равную порядковому номеру бита //(2^0 , 2^1 , 2^2 и тд) b++; // увеличиваем порядковый номер бита с каждым шагом }  b=0; // сбросить счетчик шагов  for(a=25;a>9;a--){//то же самое для второй части посылки — 16 бит номера if(dat[a]==1) code=code+stepen(b); b++; } }   //Если всё прошло успешно, на этом этапе у нас есть //facility code — в переменной fcode //card number – в переменной code  //теперь нужно произвести поиск по базе //номера лежат в 2 массивах в eeprom //unsigned char fcode[MAX];  для facility code //unsigned int code[MAX];  для card number //MAX – константа задана в начале проекта, задает размер памяти // для attiny2313 это 40 кодов, больше не влезет   for(i=0;i<max><  В данном примере я проигнорировал все тайминги — не важно какой длины импульс, программа просто подвисает пока он не кончится. Не важно какие промежутки, главное успеть отследить начало следующего бита. Не важно сколько прошло времени после последнего бита — как только соберем 26, будем знать что конец и начнем обрабатывать данные.   Да, в таком варианте возможны проблемы — если будет сбой (наводка) и придет не 26 бит а меньше или больше система не узнает этого. Но это не столь важно — как только система доберет свои недостающие биты, она проведет проверки и сбросится к исходному состоянию. Таким образом будет пропущено не более 2х карт и не понадобится вмешательство. Для примера или бытового применения этого достаточно. А перед тем как пускать такой прибор в серию, стоит тщательно всё изучить и написать свой, более универсальный и правильный алгоритм.Что ещё следует учесть при программировании системы  В данном примере, как и в большинстве известных мне систем, не производится проверка четности. Если карта прочитана не верно, считыватель отреагирует на неё как на неправильную карточку.   Но в таком варианте есть вероятность, что неправильно прочитанный код с чужой карты совпадет случайно с одним из правильных кодов. Это маловероятно, но возможно. Однако, такой проверкой пренебрегают так же многие известные производители охранного оборудования.  При программировании системы настоятельно рекомендую забить память полностью случайными данными или для каждой ячейки выставить флаг «ячейка пуста» и игнорировать такие ячейки при поиске. В более сложном варианте можно проходить по базе ровно столько шагов, сколько забито карт и при удалении проводить пересортировку с удалением пустот. Зачем это нужно? В любительских системах часто встречается одна беда — плохо написанная программа пробегает поиском по пустым ячейкам в которых все байты забиты нулями или FF. Для взлома такой системы достаточно эмулятора или карты у которой вписан код 00 или FF соответственно — такой код совпадет с пустой ячейкой и дверь будет открыта.  Файлы проекта:   Плата в формате .lay  

plates.zip [10,83 Kb] (cкачиваний: 39) Исходный код и прошивка Proekt-dlya-CVAVR.zip [89,25 Kb] (cкачиваний: 86) И напоследок — предупреждение: Описанное выше — мое понимание работы систем контроля доступа на базе wiegand26. Я не гарантирую ни полноту, ни точность описания. Это лишь базовая информация, для старта изучения. Автор zps Данная статья полезна при разработке Система автоматизации процесса предоставления услуг для клиентов на основе Rfid — меток, которую мы уже описывали. Видео, описывающее технологию идентификации Rfid и iButton представлены на нашем сайте в разделе Идентификация</max></pre>Статьи / Школа разработки / Идентификация

Народ, всем здрасьте. Прошу закидать тапками за тупые вопросы и литературой по wiegand. Есть на объекте точки доступа оборудованные считывателями prox(режим работы выставлен дипами в 58 wiegand, если верить паспорту считывателя), и bioentry w2, есть карты smartec(em-marin). Bioentry карту определяет как hid 26 bit h10301. Facility и код пользователя, считываемые этими считывателями с одной и той же карты, совершенно разные, причем, если данные из prox получается в двоичном виде сопоставить с идентификатором на карте, то bioentry выдает что-то совсем неудобоваримое. Может есть у кого литература по бит-формату различных типов виганда, по виганду в целом, и что-то в том же направлении. Если кто знает как можно подключить считыватель к компу по usb или com и утилиту, с помощью которой посмотреть на набор нулей и единичек, приходящих со считывателя, с меня коньяк)

P. S. Про используемые контроллеры и ПО, используемые на объекте спрашивать бесполезно, продукция узкоспециализированная, вряд ли кто сталкивался.

Используемые источники:

  • https://securityrussia.com/blog/wiegand.html
  • https://masteram.by/movies/obzor/izmerit/289-prostoy-indikator-spektra-sg-4400.html
  • https://pikabu.ru/story/krik_o_pomoshchi_po_wiegand_6838678

Рейтинг автора
5
Подборку подготовил
Максим Уваров
Наш эксперт
Написано статей
171
Ссылка на основную публикацию
Похожие публикации