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. Про используемые контроллеры и ПО, используемые на объекте спрашивать бесполезно, продукция узкоспециализированная, вряд ли кто сталкивался.