Для чтения информации, записанной на самых разнообразных магнитных носителях, существует множество способов. Наиболее совершенный подход заключается, естественно, в использовании IBM PC-совместимого компьютера, к которому подключается специальное считывающее устройство. Ниже будет показано, что это устройство вполне реально создать собственными силами. Другие, радикально отличающиеся, способы также представляют неоспоримый интерес и не должны игнорироваться.
Не так давно на рынке электронных развлечений продавалась продукция, известная под названием «магнитный разоблачитель».
Как правило, это был флакон спрея, содержавшего в очень летучем растворителе никель в состоянии суспензии. После интенсивного встряхивания флакона следовало просто распылить содержимое на магнитную дорожку, и на ней через несколько секунд проступала запись. Выпущенный на рынок, например, «разоблачитель» под маркой Transcode (JELT-CM) стало совершенно невозможно найти в розничной торговле, хотя люди, использующие его профессионально, очевидно, продолжают покупать его оптом без проблем.
Такое неудовлетворительное состояние дел вынудило нас сразу же приняться за лабораторные исследования, направленные на разработку альтернативного решения. В результате появилось средство оригинальное, весьма эффективное и, кроме того, более экономичное и не наносящее вреда окружающей среде, поскольку здесь не применяется «летучий» растворитель. В данной книге мы расскажем о нем впервые, настоятельно рекомендуя читателям использовать его только в личных, персональных целях.
В соответствии с положениями об интеллектуальной собственности любое использование этой технологии в промышленности или коммерции требует полного согласия со стороны автора.
Наш метод основан на использовании тонера, который применяют для небольших фотокопиров и лазерных принтеров. Суть в том, что поскольку для их равномерного нанесения используется намагниченный ролик, значит, они обладают магнитными свойствами. Действительно, эти материалы, тщательно технически проработанные, состоят из очень мелких частиц, по составу представляющих комбинации феррита (для эффекта намагничивания), углерода (для получения черного цвета), а также такого пластикового материала, как полипропилен (для обеспечения фиксации на бумаге посредством «приплавления»).
Любой использованный картридж типа Canon содержит еще достаточное количество такого порошка. Поэтому необходимым сырьем мы обеспечены в достаточном количестве.
Состав, который мы предлагаем использовать, — это смесь из приблизительно одной части тонера и 3–5 частей крахмала, используемого для хозяйственных целей. Конечный продукт должен иметь темно-серый оттенок.
Феномен (без сомнения, электростатической природы, который мы не станем здесь рассматривать) состоит в том, что частицы тонера притягиваются зернами крахмала. При условии, что последние в несколько десятков раз крупнее, им удается «захватить» практически все частицы тонера. По этой причине важно взять крахмал, зерна которого имеют размер соли мелкого помола (например, рисовый, используемый при стирке белья). Картофельный крахмал слишком мелок, а кукурузный — совершенно непригоден, так как он не крупнее самого тонера.
Если закодированную магнитную дорожку присыпать нашим составом, произойдет следующее. Некоторое количество частиц тонера будет притянуто областями изменения направления магнитного потока на дорожке, а основную часть тонера (излишек) зерна крахмала прочно удержат, и опасность загрязнить полностью дорожку, как это происходит в случае с чистым тонером, не возникнет.
В результате получаем достаточно четкую визуализацию кодирования, слабое загрязнение носителя и возможность повторного использования смеси практически неограниченное число раз (рис. 3.1).
Рис. 3.1. Частицы тонера на магнитной дорожке
Порошок помещают в небольшую коробку, затем достаточно опустить в него магнитную карту (предварительно обезжиренную с помощью спирта, чтобы на дорожках не были видны следы от пальцев), потом ее вынуть, и аккуратно стряхнуть или сдуть избыток порошка.
Записанная информация проявляется в виде рядов небольших черных полос, расположенных более или менее сжато (рекомендуется использовать лупу и яркий свет).
После изучения порошок просто стирают с помощью сухой и мягкой тряпочки, не нанося при этом никакого вреда записи. Кроме этого, его можно «зафиксировать» на прозрачной клейкой ленте, в частности, с целью создания архива. Тщательное изучение изображения раскрывает массу интересных вещей, в том числе и расположение всех дорожек, и точную природу повреждений, которые могут повлиять на запись.
Полученное изображение даже позволяет (по крайней мере, при плотности записи 75 bpi) невооруженным глазом рассмотреть логические единицы и нули.
На рис. 3.2 показан типичный пример «магнитного изображения» карт, используемых нами ежедневно.
Рис. 3.2. Результаты, полученные на дорожке с плотностью записи 75 bpi
В большинстве случаев такое исследование позволяет определить, можно ли приписать дефект некачественной записи на карты внутреннему повреждению последней или проблемам, связанным с устройством считывания (рис. 3.3).
Рис. 3.3. Несколько классических дефектов (из документации фирмы Thomson LCC)
Этот метод практически незаменим для настройки и отладки любого декодера, созданного «в домашних условиях» (см. главу 4).
Считывающие устройства считаются «уязвимой» техникой, и их больше не встретишь ни на витринах, ни в каталогах поставщиков, к которым традиционно обращаются любители, несмотря на то, что новые магнитные считывающие устройства не запрещены, насколько нам известно, к продаже и не подлежат изъятию, как некоторые типы декодеров для оплаты за пользование телевизором, которые свободно продаются только потребителям-профессионалам, способным доказать свою «благонадежность».
Тем не менее существует несколько исключений из этого правила, и не стоит никогда пренебрегать таким эксклюзивным местом покупок, как магазины, где продается неликвидная продукция или уцененные электронные товары. Поскольку в обращении находятся огромные количества магнитных считывающих устройств, а срок их использования ограничен, то десятки тысяч из них с просроченным сроком годности, но находящиеся в рабочем состоянии, регулярно распродаются среди прочего аналогичного оборудования.
Прежде чем приступить к их использованию, необходимо провести работу по идентификации, поскольку существует множество различных категорий подобных устройств, и ни выводы их разъемов, ни цвета соединительных проводов не стандартизованы (рис. 3.4).
Рис. 3.4. Считывающее устройство фирмы Sonkyo
Считывающие устройства с использованием интерфейса RS232
Считывающее устройство с интерфейсом RS232 очень просто в использовании, но наиболее дорогое. Речь идет об «интеллектуальном» считывающем устройстве. Помимо обычных узлов считывания, оно содержит микроконтроллер, что позволяет ему передавать считываемые данные непосредственно в виде ASCII символов.
Рис. 3.5. Считывающее устройство с интерфейсом RS232 (содержащее микроконтроллер)
Схема подключения считывающего устройства к соm-порту представлена на рис. 3.6. Питание устройства должно осуществляться от внешнего источника, например от розетки джойстика ПК, с которой можно снять напряжение +5 В. По вполне понятным соображениям, провод питания обычно красный, а «земли» — черный. Для большей уверенности в правильности подключения рекомендуем изучить схему считывающего устройства.
Рис. 3.6. Подключение считывающего устройство к интерфейсу RS232
Для полноценного подключения типовых считывающих устройств необходимо выполнить еще два соединения, предназначенных для управления индикаторами. В первое время можно без этого обойтись.
Некоторые считывающие устройства способны считывать одновременно две или три дорожки, и было бы жаль не воспользоваться этим. Правда, они имеют более сложную схему подключения.
10 REM — CARMAG.BAS —
20 KEY OFF: CLS
30 OPEN "COM1: 2400,n,8,1" AS #1
40 IF LOC(1) = 0 THEN GOSUB 60
50 GOTO 40
60 FOR T=1 TO 5000: NEXT T
70 IF LOC(1) =0 THEN RETURN
80 C$=INPUT$(LOC(1), #1)
90 PRINT C$: PRINT
100 RETURN
110 REM (c) 1994 Patrick GUEULLE
Для отображения данных, переданных считывающим устройством, можно использовать приведенную выше программу CARMAG.BAS. Ее правильная работа гарантируется при «условии, что устройство подключено к последовательному порту СОМ1, которому задан следующий режим функционирования: скорость передачи — 2400 бод, разрядность данных — 8 бит, контроль четности отсутствует, в конце посылки передается stop-бит. Для изменения режима в соответствии с требованиями используемого считывающего устройства следует изменить строку 30 программы. Когда программа адаптирована, достаточно запустить ее (RUN) и вставить карту в считывающее устройство, при этом в зависимости от считываемой дорожки на экране должна появиться строка цифровых или буквенно-цифровых символов.
Передаются только значащие символы, все служебные символы фильтруются программой встроенного микроконтроллера. Разделитель полей тем не менее часто отображается как пробел, а специальные символы появляются в форме знаков ASCII, приведенных выше в соответствующих кодировочных таблицах. Контрольный код LRC не отображается, но проверяется. Если он неправилен или обнаружена ошибка в четности, то не отображается ничего, но в течение нескольких секунд остается активным выход, соответствующий индикатору ERROR (ошибка).
Считывание подобным считывающим устройством карты оплаты за проезд по скоростной дороге, содержание которой было представлено выше, даст, например, следующий результат:
Аналогичный результат мы могли бы получить без ПК и без программы на специальном терминале, в клавиатуру которого встроено считывающее устройство.
Правда, все эти достаточно совершенные терминалы мало подходят для наших исследовательских целей, поскольку в своих манипуляциях с картами мы хотим иметь доступ к каждому биту каждой из дорожек любой карты.
Считывающие устройства с использованием специального интерфейса
Считывающие устройства со специальным интерфейсом, обмен по которому осуществляется сигналами с уровнями TTL, более распространены, чем считывающие устройства с интерфейсом RS232. Во всяком случае, они значительно дешевле. Такие считывающие устройства не содержат микроконтроллера и выполнены на ИС средней степени интеграции или специальных ИС. Их электронные узлы можно разделить на две части:
• аналоговую часть, включающую предварительный усилитель (часто с автоматической регулировкой коэффициента усиления), за которым следует схема, восстанавливающая модулированный сигнал F/2F;
• цифровую часть, преобразующую информацию частотно модулированного сигнала (F/2F) в последовательность логических единиц и нулей.
В современных считывающих устройствах для обработки информации всех дорожек применяют специальные интегральные схемы, в которых на одном кристалле совмещаются и аналоговые, и цифровые узлы (mixed-signal).
Самые первые считывающие устройства использовали традиционные интегральные схемы средней степени интеграции и некоторое число дискретных компонентов.
Как в первом, так и во втором случае взаимодействие с устройством считывания осуществляется по специальному интерфейсу, использующему для передачи сигналов уровни TTL. Интерфейс образуют три линии, передающие следующие сигналы:
• сигнал наличия карты (): активный уровень низкий, который поддерживается на протяжении времени прохождения закодированной дорожки перед считывающей головкой;
• сигналы считанных данных (): последовательность 1 и 0, передающая прочитанные биты в инверсном представлении. Скорость передачи битов напрямую зависит от скорости прохождения карты;
• тактовый сигнал или строб-импульс (), низкий уровень которого соответствует моменту, когда данные достоверны.
Основные различия между разными типами считывающих устройств данного класса в наибольшей степени касаются длительности тактовых импульсов. Она может быть фиксированной и равняться, например, 20 мкс либо составлять часть от длительности каждого бита (например, четверть). Кроме этого, надо упомянуть о редких считывающих устройствах, которые выдают неинвертированные данные (DATA).
Как и считывающие устройства с интерфейсом RS232, считывающие устройства со специальным интерфейсом TTL требуют напряжения питания +5 В, которое удобно снимать с разъема джойстика, тем более, что этот разъем может одновременно служить портом для ввода данных.
Учитывая трудности, с которыми придется встретиться некоторым из наших читателей в приобретении нового или подержанного считывающего устройства, мы решили разработать собственную версию его электронной и механической части. Все было продумано так, чтобы каждый радиолюбитель мог выполнить Это устройство. Причем выбирались только широко распространенные материалы и компоненты.
Построенное в строгом соответствии с нашими рекомендациями считывающее устройство обладает характеристиками, сравнимыми с характеристиками промышленных моделей, и в то же время хорошо подходит для трансформации в кодер (что и предполагалось с самого начала изучения).
По сравнению с головкой магнитофона к головке считывающего устройства, особенно с ручным манипулированием, предъявляются совершенно другие механические требования. Как в том, так и в другом случае необходимо обеспечить надежный контакт между головкой и дорожкой, избегая, тем не менее, излишнего давления, которое повлечет преждевременный износ обеих. Также следует соблюдать строгую перпендикулярность головки по отношению к дорожке.
Магнитные карты могут быть деформированы, иметь различную толщину и быть рассчитанными на разные кинематические схемы прохождения через считывающие устройства. При разработке своего устройства мы учитывали все эти моменты.
Внимательное изучение ручных считывающих устройств промышленного изготовления выявило практически идентичный принцип их работы. Он заключается в следующем: карта вставляется в направляющий желобок, по ширине немного больший толщины карты, в то время как головка закрепляется на достаточно упругом держателе, гарантирующем определенное постоянство давления и расположения.
Вышесказанное касается в полной мере и считывающего устройства фирмы American Magnetics, вид которого представлен на рис. 3.7 и 3.8.
Рис. 3.7. Считывающее устройство фирмы American Magnetics (вид сбоку)
Рис. 3.8. Считывающее устройство фирмы American Magnetics (общий вид)
Мы также решили воспользоваться этим принципом, адаптируя его, однако, к возможностям механической обработки, которыми располагает средний радиолюбитель, а также к характеристикам головок кассетных магнитофонов, которые легко приобрести. Для их применения нужно удалить направляющую полоску, которая либо припаяна, либо вмонтирована в одну из сторон головки. Оригинальность конструкции держателя магнитной головки нашего устройства заключается в материале, использованном для его изготовления, — печатной плате из стеклотекстолита толщиной 0,8 мм, который обычно используется для производства фальшивых чип-карт.
Уверен, что наиболее практичные из наших читателей уже имеют все необходимое для изготовления платы, представленной на рис. 3.9.
Рис. 3.9. Топология печатной платы держателя магнитной головки (стеклотекстолит 0,8 мм}
Расстояние между контактами различных широко распространенных моделей головок почти всегда составляет 5,08 мм. Для их прочного прикрепления к плате достаточно двух крупных капель припоя. При изготовлении платы, помимо сверления контактных отверстий, потребуется выпилить по огибающей (с трех сторон) зону монтажа головки. Это можно осуществить посредством миниатюрной дисковой фрезы.
Полученный таким образом язычок, отделенный с трех сторон от остальной части платы, обладает достаточной упругостью, близкой к упругости стальной пружинящей пластинки, которая используется производителями держателей головок для промышленных магнитных считывающих устройств.
Рамка, окружающая этот язычок, обеспечивает установку платы держателя на каркасе устройства, внешний вид которого представлен на рис. 3.10 и 3.11.
Рис. 3.10. Внешний вид самодельного считывающего устройства (вид сзади)
Рис. 3.11. Внешний вид самодельного считывающего устройства (вид спереди)
Сам каркас (рис. 3.12) изготавливается из оргстекла (плексигласа) толщиной 4 мм. Этот материал легко достать, он достаточно прочен и очень хорошо обрабатывается.
Рис. 3.12. Чертежи элементов каркаса
В крайнем случае его можно заменить другими материалами, например стеклотекстолитом толщиной 1,6 мм (нефольгированным), склеенным вдвое или втрое.
Для изготовления каркаса необходимо вырезать из оргстекла два прямоугольника размером 100x40 мм, а также прямоугольник из стеклотекстолита толщиной 1,6 мм размером 14x100 мм. Одна из сторон этого прямоугольника должна быть идеально прямой, для чего ее нужно тщательно отполировать наждачной бумагой.
Отметим, что нет существенных возражений против увеличения длины всех деталей свыше 10 см, принятой в большинстве промышленных считывающих устройств.
Если предусматривается последующая трансформация считывающего устройства в кодер, то это будет даже «плюсом», поскольку большая длина пути карты помогает стабилизировать скорость последней практически еще до контакта с головкой.
На рис. 3.12 указаны место и диаметры всех крепежных отверстий, которые потребуется просверлить. Допустимо вместо отверстий диаметром 2 мм делать отверстия диаметром до 2,5 мм или больше, если проще найти винты (с потайной головкой) под такой размер. Совершенно необходимо, чтобы эти четыре отверстия точно совпадали с соответствующими отверстиями печатной платы и чтобы ее край был идеально точно выровнен с краями пластин из оргстекла.
Проще всего это сделать, если сверлить обе детали с одного захода, плотно зажав их в тисках с гладкими губками. Что касается прямоугольного отверстия, то его следует выполнить традиционным радиолюбительским способом: высверливанием по периметру, например трехмиллиметровым сверлом с последующей доводкой квадратным напильником. Не страшно, если его размеры будут несколько превосходить указанные на схеме, однако, не до такой степени, чтобы серьезно уменьшить прочность детали.
На рис. 3.13 показан сборочный чертеж считывающего устройства.
Рис. 3.13. Сборочный чертеж самодельного считывающего устройства
Сборку следует начинать с соединения между собой печатной платы и плексигласовой пластины с квадратным отверстием. Это необходимо сделать при помощи винтов с потайными головками, которые будут утоплены в плексиглас (зенковка сверлом 6 мм). Естественно, головка должна «смотреть» в квадратное отверстие.
Высота крепежных втулок полностью зависит от высоты выбранной головки, которых существует огромное множество. Верхняя часть каждой втулки должна иметь слегка скошенный край, поскольку для качественной регулировки предполагается, что печатная плата (D) не будет параллельна пластине (А).
При соединении второй пластины из оргстекла (В) и промежуточной стеклотекстолитовой пластины (С) следует произвести необходимую подгонку. Магнитная карта вставляется в полученный желобок, при этом надо следить, чтобы головка упиралась в карту и была перпендикулярна последней. С другой стороны, совершенно нормально, если при вынутой карте головка касается противоположной пластины (В) под углом, заметно отличающимся от 90°.
Окончательная сборка производится при помощи двух 3-миллиметровых болтов BTR (под ключ Allen), но можно довольствоваться и обыкновенными винтами, что, однако, менее практично. В любом случае рекомендуется подложить шайбы под обе головки и гайки.
Большой диаметр (6 мм) отверстий, выполненных в стеклотекстолитовой пластине (С), которая играет роль направляющей для карты, позволяет подогнать ее вертикальное расположение таким образом, чтобы головка точно совмещалась с дорожкой, с которой она должна считывать. Естественно, если пластина (В) вырезана из прозрачного плексигласа, это облегчит подгонку.
Для того чтобы считывать различные дорожки, нужно соответствующим образом выбирать размеры пластины из стеклотекстолита (С). Размеры, указанные на рис. 3.12, соответствуют дорожке ISO 2.
Если все этапы сборки были выполнены надлежащим образом, то механическая часть считывающего устройства должна работать отлично. При продвижении карты должно ощущаться легкое сопротивление.
Можно нанести немного воска или растительного масла на направляющую пластину (С), если сопротивление будет существенным. Если давление головки на карту будет слишком большим, необходимо увеличить высоту втулок.
Общий вид механической части устройства приведен на рис. 3.14.
Рис. 3.14. Общий вид механической части считывающего устройства с магнитной картой
Прежде чем взяться за построение F/2F декодеров, необходимо вспомнить об обыкновенном усилителе, позволяющем восстановить TTL-сигналы, которые были использованы для записи.
Для проведения исследований потребуется осциллограф с памятью. Работа с ним будет особенно интересна тем читателям, которые хотели бы построить декодер на микроконтроллере (мы пытались сделать это на базе PIС-контроллеров фирмы Microchip).
Прямое декодирование можно осуществить посредством процессора достаточно быстродействующего IBM PC-совместимого компьютера при программировании его на ассемблере. Но на практике это все осуществить не так просто, как может показаться.
Схема, представленная на рис. 3.15, включает два каскада усиления и выполнена на ИС сдвоенного операционного усилителя типа LM358. Первый каскад обеспечивает усиление несколько большее, чем в 50 раз, при полосе пропускания в 20 кГц, что достаточно для типичной скорости прохождения карты. Второй работает в режиме насыщения почти как компаратор и выдает прямоугольные сигналы, соответствующие уровням TTL, для чего питание схемы осуществляется от источника напряжения +5 В.
Рис. 3.15. Усилитель считывания
Разрешается увеличить напряжение до 12 В, если возникнет необходимость в более высоких уровнях на выходе.
В коммерческих считывающих устройствах для карт довольно часто применяются более сложные схемы, использующие одну или несколько схем автоматической регулировки усиления (АРУ).
В схеме, представленной на рис. 3.16, сочетаются два способа изменения усиления. Первый состоит во включении нелинейного элемента в цепь отрицательной обратной связи усилителя. В данном случае нелинейный элемент образован двумя (возможно даже четырьмя) диодами, соединенными последовательно с резистором. Это позволяет операционному усилителю работать практически без обратной связи, а значит, с максимальным усилением, пока его выходное напряжение не достигнет значения, достаточного для открывания одного или другого диода. Потом усиление будет определяться резистором.
Рис. 3.16. Пример усилительного каскада с АРУ
Второй способ заключается в реализации управляемой мостовой схемы отрицательной обратной связи. Ее параметры меняются посредством транзистора, соединенного с логическими схемами декодирования (вход CDE).
В принципе АРУ значительно улучшает характеристики считывающего устройства. Однако осциллограмма, приведенная на рис. 3.17, показывает, что результаты, достигнутые с помощью нашей упрощенной схемы, уже вполне удовлетворительны.
Рис. 3.17. Результат считывания начальной части цифровой дорожки с плотностью 75 bpi
Полученная на ПК при помощи восьмиразрядного «виртуального осциллографа» (типа ADC10 производства Pico Technology), эта запись относится к началу цифровой дорожки плотностью 75 bpi, считанной на средней скорости прохождения. Хорошо заметны начальные 0, затем флажок start (11010), за которым следует начало блока данных.
Перевод виртуального прибора из режима «осциллограф» в режим «графическое устройство записи» позволил бы получить не 20 бит, а все содержимое дорожки, что дало бы возможность проведения тщательного анализа.
Печатная плата усилителя представлена на рис. 3.18. Ее размеры были подобраны так, чтобы законченный блок мог быть размещен в непосредственной близости от головки считывающего устройства, поскольку важно, чтобы соединительные провода от головки до усилителя были как можно короче (максимум 10 см), даже если они экранированные.
Рис. 3.18. Печатная плата усилителя считывания
Размещение элементов производится в соответствии со схемой, представленной на рис. 3.19.
Рис. 3.19. Схема размещения элементов усилителя считывания
Если первые попытки считывания закончились успешно, можно изменить некоторые величины компонентов, чтобы изучить их влияние на конечные результаты. Например, было бы интересно изучить влияние подсоединения нелинейной цепи из двух диодов, включенных «валетом», и последовательного резистора номиналом 82 кОм, по аналогии со схемой, изображенной на рис. 3.16.
Внешний вид платы усилителя представлен на рис. 3.20, перечень его элементов — в табл. 3.1.
Таблица 3.1. Перечень элементов усилителя считывания
Рис. 3.20. Внешний вид усилителя считывания
Декодирование сигналов
F/2F можно доверить быстродействующему PIC-микроконтроллеру, но такое решение явно будет более дорогостоящим и менее эффективным, чем использование компонентов, разработанных конкретно для этого случая.
Практически все производители магнитных считывающих устройств продают специальные декодирующие интегральные схемы, которые очень удобны для проектирования специальных считывающих устройств для нестандартных карт или билетов.
Такие компоненты, объединяющие аналоговые и цифровые узлы, обычно изготавливаются известными производителями для эксклюзивного использования фирмой-разработчиком считывающих устройств, которая решает, перепродавать их третьему лицу или нет. Установив различные контакты и, естественно, проведя ряд испытаний, которые можно считать удовлетворительными, мы выбрали двух поставщиков, чья продукция имеет сравнимые характеристики.
Так, немецкая компания Hopt+Schuler предлагает ИС U4085B, изготовленную фирмой Telefunken, а американская компания American Magnetics — свою ИС — 508734-002, изготовленную фирмой Motorola.
Эти марки вполне доступны во Франции, поэтому приобретение как одной, так и другой из названных ИС не должно вызвать особых проблем. Если речь идет о частных лицах, надо обратиться к официальным дилерам.
Как бы то ни было, на этих ИС мы разработали две собственные схемы декодеров, между которыми читатели могут выбирать в зависимости от возможностей приобретения той или иной интегральной схемы.
Немецкая версия
Схема на рис. 3.21 помимо ИС U4085B использует очень небольшое число внешних элементов. Большинство из них, кстати, обеспечивают функционирование интегральной схемы в условиях, несколько отличных от тех, для которых она была изначально разработана.
Рис 3.21. Схема декодера на интегральной схеме U4085B
Предназначенная и для автоматического, и ручного считывающего устройства ИС U4085B, как правило, должна активизироваться с помощью оптического датчика в тот момент, когда тот определяет начало дорожки, предназначенной для считывания.
В частном случае считывающего устройства с ручной подачей гораздо практичней управлять выводом 15 ИС посредством транзистора, открывающегося, как только предусилитель начинает реагировать на начальные нулевые биты, записанные на карте.
Обратите внимание, что для данной схемы требуется транзистор с очень большим коэффициентом усиления — это составной транзистор ВС517. На собственном опыте мы убедились, что обыкновенный транзистор n-р-n типа здесь абсолютно непригоден.
Следует воздержаться от изменения типов и номиналов остальных элементов без полной уверенности в том, что делаешь.
Необходимо помнить, что указанные значения были подобраны для считывания магнитных карт, записанных с плотностью 75 bpi, и что значения, указанные в скобках, рекомендуются для дорожек, записанных с плотностью 210 bpi.
На практике разброс скоростей прохождения карт, допустимый для данного устройства, столь широк, что можно без проблем считывать дорожки с плотностью 210 bpi с номиналами элементов схемы, предназначенными для плотности 75 bpi, при условии, что карту продвигают не слишком быстро. Таким образом, допустимо использовать их для построения универсального модуля. Но, конечно, предпочтительнее следовать указаниям изготовителя в случае считывающих устройств, которые разработаны исключительно для считывания носителей, записанных с плотностью 210 bpi.
Чертеж печатной платы декодера представлен на рис. 3.22, размеры ее также были выбраны с учетом возможности размещения в непосредственной близости от головкодержателя считывающего устройства. Рекомендуется не превышать длину соединительных проводов в 10 см (не экранированных, а просто скрученных).
Рис. 3.22. Печатная плата декодера на ИС U4085B
Схема размещения элементов, приведенная на рис. 3.23, показывает, что интегральная схема, которая поставляется исключительно в корпусе для поверхностного монтажа (SMD), должна припаиваться со стороны печати.
Рис 3.23. Схема размещение элементов декодера на ИС U4085B
Для выполнения этой операции требуется паяльник с очень тонким жалом. Распайку ИС рекомендуется начинать с двух диагонально расположенных выводов, что облегчит выравнивание контактов ИС и ламелей платы. Перечень элементов декодера приведен в табл. 3.2.
Таблица 3.2. Перечень элементов декодера
Ниже мы объясним, как соединить эту схему с IBM РС-совместимым ПК, который будет выполнять программы считывания и декодирования. Теперь же проведем первое исследование схемы. Оно будет заключаться в подключении питания +5 В и изучении с помощью осциллографа сигналов при прохождении карты, закодированной надлежащим образом (это может быть, например, просроченная банковская карта).
Отметим, что на временной диаграмме сигналов, показанной на рис. 3.24, частота сигнала CLOCK пропорциональна скорости прохождения карты.
Рис 3.24. Временные диаграммы сигналов, полученных с помощью декодера
Если не пользоваться осциллографом с памятью или графическим записывающим устройством, интерпретировать биты линии данных DATA невозможно.
Можно отметить, что тактовые импульсы — очень чистые благодаря своей относительно большой длительности. Некоторые промышленные считывающие устройства формируют импульсы с активным низким уровнем, длительностью лишь немного более 1 мкс.
Большая длительность в значительной степени облегчает работу программ на не слишком быстродействующем или с замедленным выполнением других задач процессоре.
Общий вид декодера приведен на рис. 3.25 и 3.26.
Рис. 3.25. Общий вид декодера со стороны размещения элементов
Рис. 3.26. Общий вид декодера со стороны печати
Американская версия
Схема, представленная на рис. 3.27, значительно отличаясь от рассмотренной выше, приводит к очень близким результатам.
Рис. 3.27. Схема декодера на интегральной схеме фирмы American Magnetics
Основные функциональные отличия заключаются в следующем:
• значительно более высокая чувствительность, допускающая использование менее качественной или не очень хорошо настроенной головки;
• несколько меньший допуск к очень низким скоростям прохождения;
• импульс имеет фиксированную длительность (приблизительно 23 мкс), то есть более короткую, чем в предыдущем случае при нормальных условиях работы;
• идентичные величины внешних компонентов для дорожек для плотностей записи как 75, так и 210 bpi;
• данные выдаются без инверсии.
Последняя особенность приводит к необходимости ставить инвертирующий каскад для линии с целью обеспечения совместимости с предыдущей схемой и большинством промышленных считывающих устройств.
Поскольку каскад выполнен на обычном n-р-n транзисторе, ему дня нормальной работы требуется форсирующая RC-цепочка в цепи базы. Отсутствие такого конденсатора может привести к межсимвольной интерференции, то есть наложению текущих битов на последующие.
Следует отметить, что количество диодов в цепи отрицательной обратной связи при необходимости и в экспериментальных целях может варьироваться.
Обратим внимание и на то, что номиналы всех элементов были оптимизированы в соответствии с указаниями изготовителя интегральной схемы; в принципе рекомендуется их придерживаться. Печатная плата декодера, изображенная на рис. 3.28, также имеет небольшие размеры и допускает установку в непосредственной близости от головкодержателя.
Рис. 3.28. Печатная плата декодера на ИС фирмы American Magnetics
Напомним, что длина проводов, подсоединяющих головку к декодеру, не должна превышать 10 см, причем неважно, будет ли это витая пара или отдельные экранированные провода (поскольку вход усилителя симметричен, ни один из двух проводов головки не соединяется с «землей»).
Размещение элементов на плате декодера представлено на рис. 3.29. Здесь мы также частично обращаемся к технологии поверхностного монтажа (SMD).
Рис. 3.29. Размещение элементов на плате декодера, использующего ИС фирмы American Magnetics
Интегральная схема припаивается со стороны печати так же, как и форсирующий конденсатор 47 нФ, включенный параллельно с резистором 18 кОм. В качестве данного конденсатора целесообразно использовать конденсатор в стеклянном корпусе, похожий на диод. Это гарантирует минимальную длину соединений и экономит место со стороны компонентов.
Внешний вид декодера приведен на рис. 3.30 и 3.31, а перечень элементов — в табл. 3.3.
Рис. 3.30. Вид декодера со стороны размещения элементов
Рис. 3.31. Вид декодера со стороны печати
Таблица 3.3. Перечень элементов декодера
Несмотря на то что промышленные считывающие устройства для магнитных карт или считывающие устройства, построенные по нашим рекомендациям, могут быть использованы практически с любым процессором, мы разработали программы, позволяющие выполнять все вышеназванные исследования как обычно, на IBM РС-совместимом компьютере.
Подключение чрезвычайно просто, не затрагивает существующей конфигурации и использует порт для игровых приставок или джойстика.
Этот разъем типа DB15, которым, как правило, пренебрегают серьезные пользователи, предоставляет четыре логических входа для импульсных сигналов и весьма удобное напряжение питания + 5 В.
Этого более чем достаточно для подключения считывающего устройства магнитных карт. Схема подключения приведена на рис. 3.32.
Рис. 3.32. Подключение считывающего устройства к разъему джойстика ПК
Длина соединительных проводов (неэкранированных) не принципиальна и может достигать 1 м, по крайней мере в случае декодеров, построенных в соответствии с нашими схемами.
Считывание дорожки ISO 2
Логично сначала заинтересоваться именно этой дорожкой, расположенной посередине, поскольку она одновременно и наиболее используемая, и самая легкая в интерпретации. Даже при плотности 75 bpi сигналы, поступающие от декодера, могут быть достаточно высокой частоты.
Не доходя до программирования на ассемблере, нам пришлось использовать язык, известный своим быстродействием, — Turbo Pascal. Даже в этих условиях не стоит надеяться обойтись компьютером с производительностью ниже, чем у 386SX25, чьих возможностей едва хватает.
На сайте издательства www.dmk.ru содержатся исходный текст программы LECT75.PAS, приведенный выше, и соответствующий исполняемый файл LECT75.EXE. Эта программа создает файл CARTE.CAR, содержащий данные, считанные с дорожки, — 240 бит.
Это 48 раз по 5 бит, то есть 40 полезных знаков, которые максимально может содержать дорожка ISO 2, и 40 бит нулей заполнения, избыток которых не важен.
Формат этого файла (.CAR) мы определили уже несколько лет назад для считывания чип-карт; текст в коде ASCII, состоящий исключительно из 1 и 0, разделенных пробелами. С учетом линейной структуры магнитных дорожек никакого разбиения ни на группы битов, ни на строки фиксированной длины предусмотрено не было. Преобразование двоичных данных в цифровые символы, а также другие интересные анализы будут доверены другим программам, написанным на GWBASIC. Программа предполагает, что адрес порта игровой приставки — 513 (в десятичной системе); это имеет место для всех действительно IBM PC-совместимых ПК.
После запуска программа ожидает момента, когда карта будет вставлена в считывающее устройство. Затем начинается процесс считывания информации, и после считывания 240 бит раздается звуковой сигнал. Отсутствие звукового сигнала свидетельствует, что было получено менее 240 бит: это означает некачественное считывание либо то, что карта не полностью запрограммирована.
В подобном случае необходимо вставить карту вторично. Если блокировка продолжается, воспользуйтесь другой картой, которая уже считывалась с первого раза. Чтобы непосредственно получить отображение содержимого дорожки в битовом виде, в оболочке из основной программы LECTISO2.BAS посредством строки 30 вызывается внешняя программа LECT75.EXE. При этом, конечно, необходимо, чтобы программа COMMAND.СОМ была доступна через путь поиска PATH, в котором должна быть соответствующая запись, либо просто скопирована в текущую директорию.
Обратите внимание, что все эти программы были написаны специально для работы в DOS. Рекомендуется воздержаться от их запуска через Windows (в окне DOS), поскольку это может замедлить их выполнение.
В некоторых случаях предпочтительно дезактивировать некоторые резидентные программы, например ЕММ 386. Пользователи PC, привыкшие работать в Windows (версия не имеет значения), должны закрыть эту операционную систему, прежде чем приступить к выполнению программ.
10 REM — LECTISO2.BAS —
20 KEY OFF: CLS: PRINT: PRINT: PRINT: PRINT
30 SHELL "LECT75.EXE"
40 OPEN "carte.car" FOR INPUT AS #1
50 DIM T(240)
60 FOR F=1 TO 240
70 INPUT#1,T(F)
80 NEXT F
90 J=1
100 IF T(J)<>1 THEN 160
110 IF T(J+1)<>1 THEN 160
120 IF T(J+2)<>0 THEN 160
130 IF T(J+3)<>1 THEN 160
140 IF T{J+4)<>0 THEN 160
150 K=J: GOTO 200
160 J=J+1: GOTO 100
200 C$=""
210 FOR F=0 TO 4
220 IF T(K+F) =0 THEN C$=C$+"0"
230 IF T(K+F) =1 THEN C$=C$+"1"
240 NEXT F
250 GOSUB 2000
260 K=K+5: IF K>235 THEN END
270 GOTO 200
2000 IF C$="11010* THEN PRINT "{start}"
2010 IF C$="10110" THEN PRINT "{sep}"
2020 IF CS="11111" THEN PRINT "{end}"
2030 IP C$="01011" THEN PRINT "{10}";
2040 IF C$="00111" THEN PRINT "{12}";
2050 IF C$="01110" THEN PRINT "{14)";
2060 IF C$="00001" THEN PRINT "0";
2070 IF C$="10000" THEN PRINT "1";
2080 IF C$="01000" THEN PRINT "2";
2090 IF C$="11001" THEN PRINT "3";
2100 IF C$="00100“ THEN PRINT "4";
2110 IF C$="10101" THEN PRINT "5";
2120 IF C$="01101" THEN PRINT "6";
2130 IF C$="11100" THEN PRINT "7";
2140 IF C$="00010" THEN PRINT "8";
2150 IF C$="10011" THEN PRINT "9";
2170 RETURN
3000 REM (c) 1996 Patrick GUEULLE
Программа LECTISО2.BAS — основная программа, которую вы будете использовать для считывания дорожки ISO 2 стандартных магнитных карт. Если LECT75.EXE присутствует в текущей директории (наряду с COMMAND.COM), то любое прохождение читаемой карты (в правильном направлении) должно привести к отображению 240 считанных бит и соответствующих цифровых данных.
Ниже показано, что это дает в конкретном случае с файлом TEST5.CAR, представленным на сайте www.dmk.ru. Так, файл TEST5.CAR, декодированный с помощью программы LECTISО2.BAS, будет иметь следующий вид:
Одновременно создается файл CARTE.CAR, который нетрудно переименовать в DOS (командой REN), если есть желание его сохранить. Ни один из тестов (на четность или LRC) не производится.
Такие проверки можно осуществить по запросу при необходимости (дальше будут представлены соответствующие программы). Однако при этом существует риск сбоя в считывании некоторых нестандартных карт.
При отображении данных, записанных на дорожке, используются не стандартные «кабалистические* знаки, представленные выше в виде пяти- и семибитного кода ANSI, а знаки в более наглядной форме:
• флажок начала: {start};
• разделитель полей: {sep};
• флажок конца: {end};
• специальные знаки: {10}, {12} и {14}.
Внимание: не путайте эти фигурные скобки с простыми!
Считывание дорожки ISO 1
Работать с дорожкой ISO 1 несколько сложнее, поскольку обычно она записана с плотностью 210 bpi и содержит семиразрядные коды алфавитно-цифровых символов.
Осуществить считывание позволяет программа LECT210.PAS, которая работает аналогично LECT75.PAS. Ее исполняемая версия (LECT210.EXE) может использоваться либо самостоятельно для создания файла CARTE.CAR на 630 бит, либо вызываться из другой программы в оболочке Basic.
Отметим, что 630 бит — это 90 раз по 7 бит, то есть они соответствуют 79 знакам, которые максимально может содержать дорожка ISO 1, плюс 77 нулей заполнения.
10 REM — LECTISO1.BAS —
20 KEY OFF: CLS: PRINT: PRINT: PRINT: PRINT: PRINT: PRINT: PRINT: PRINT: PRINT
30 SHELL "LECT210.EXE"
40 OPEN "carte.car" FOR INPUT AS #1
50 DIM T(630)
60 FOR F=1 TO 630
70 INPUT#1,T(F)
80 NEXT F
90 J=1
100 IF T(J)<>1 THEN 160
110 IF T(J+1)<>0 THEN 160
120 IF T(J+2)<>1 THEN 160
130 IF T(J*3)<>0 THEN 160
140 IF T(J+4)<>0 THEN 160
141 IF T(J+5)<>0 THEN 160
142 IF T(J+6)<>1 THEN 160
150 K=J: GOTO 200
160 J=J+1:GOTO 100
200 C$=""
210 FOR F=0 TO 6
220 IF T(K+F) =0 THEN C$=C$+"0"
230 IF T(K+F)=1 THEN C$»C$+"1"
240 NEXT F
250 GOSUB 2000
260 K=K+7: IF K>623 THEN END
270 GOTO 200
2000 IF C$="1010001" THEN PRINT "{start}"
2010 IF C$="0111110" THEN PRINT "{sep}"
2020 IF C$="1111100" THEN PRINT "{end}"
2030 IF C$="0000001" THEN PRINT " ";
2031 IF C$="1000000" THEN PRINT "{1H}";
2032 IF C$="0100000" THEN PRINT "{2H}";
2033 IF C$="1100001" THEN PRINT "{3H}";
2034 IF C$="0010000" THEN PRINT "{4H}";
2036 IF C$="0110001" THEN PRINT "{6H}";
2037 IF C$="1110000" THEN PRINT "{7H}";
2038 IF C$="0001000" THEN PRINT "{8H}";
2039 IF C$="1001001" THEN PRINT "{9H}";
2040 IF C$="0101001" THEN PRINT "{AH}";
2041 IF C$="1101000" THEN PRINT "{BH}";
2042 IF C$="0011001- THEN PRINT "{CH}";
2043 IF C$="1011000- THEN PRINT "{DH}";
2044 IF C$="0111000" THEN PRINT "{EH}";
2045 IF C$="1111001" THEN PRINT "{FH}";
2060 IF C$="0000100" THEN PRINT "0";
2070 IF C$="1000101" THEN PRINT "1";
2080 IF C$="0100101" THEN PRINT "2";
2090 IF C$="1100100" THEN PRINT "3";
2100 IF C$="0010101" THEN PRINT "4"
2110 IF C$="1010100" THEN PRINT "5"
2120 IF C$="0110100" THEN PRINT "6";
2130 IF C$="1110101" THEN PRINT "7"
2140 IF C$="0001101" THEN PRINT "8";
2150 IF C$="1001100" THEN PRINT "9";
2151 IF C$="0101100" THEN PRINT "{1AH}";
2152 IF C$*"1101101" THEN PRINT "{1BH}";
2153 IF C$="0011100" THEN PRINT "{1CH}";
2154 IF C$="1011101" THEN PRINT "{1DH}";
2155 IF C$="0111101" THEN PRINT "{1EH}";
2160 IF C$="1000011" THEN PRINT "A";
2161 IF C$="0100011" THEN PRINT "В";
2162 IF C$="1100010" THEN PRINT "C";
2163 IF C$="0010011" THEN PRINT "D";
2164 IF C$="1010010" THEN PRINT "E";
2165 IF C$="0110010" THEN PRINT "F";
2166 IF C$="1110011" THEN PRINT "G";
2167 IF C$="0001011" THEN PRINT "H";
2168 IF C$="1001010" THEN PRINT "I";
2169 IF C$="0101010" THEN PRINT "J";
2170 IF C$="1101011" THEN PRINT "K";
2171 IF C$="0011010" THEN PRINT "L";
2172 IF C$="1011011" THEN PRINT "M";
2173 IF С$="0111011" THEN PRINT "N";
2174 IF C$="1111010' THEN PRINT "O";
2175 IF C$="0000111” THEN PRINT "P";
2176 IF C$="1000110" THEN PRINT "Q";
2177 IF C$="0100110" THEN PRINT "R";
2178 IF C$="1100111" THEN PRINT "S";
2179 IF C$="0010110" THEN PRINT "T";
2180 IF C$="1010111" THEN PRINT "U";
2181 IF C$="0110111" THEN PRINT "V";
2182 IF C$="1110110" THEN PRINT "W;
2183 IF C$="0001110" THEN PRINT "X";
2184 IF C$="1001111" THEN PRINT "Y";
2185 IF C$="0101111" THEN PRINT "Z";
2190 IF C$="1101110" THEN PRINT "{3BH);
2191 IF C$="0011111" THEN PRINT "{3DH);
2192 IF C$="1011110" THEN PRINT "{3EH);
2193 IF C$="1111111" THEN PRINT "{40H};
2999 RETURN
3000 REM (c) 1996 Patrick GUEULLE
LECTISO1.BAS — основная программа, которая посредством вызова
LECT210.EXE выполняет следующие операции:
• считывает 630 бит с дорожки ISO 1 и создает файл CARTE.CAR;
• отображает считанные 630 бит;
• отображает соответствующие алфавитно-цифровые символы.
Ниже представлен результат работы программы для частного случая файла TEST7.CAR, содержащегося на сайте www.dmk.ru (мы намеренно убрали несколько нулей заполнения).
Считывание дорожки ISO 3
Как и ISO 1, дорожка ISO 3 имеет плотность записи 210 bpi, но она содержит цифровые данные, которые закодированы пятиразрядным кодом.
Считывание производится при помощи программы LECT210.EXE, но считанные 630 бит на этот раз соответствуют 126 группам по 5 бит. На самом деле в записи может содержаться 107 цифр плюс 95 нулей заполнения.
Для запуска считывающей программы и декодирования требуется основная программа, которая по аналогии с LECTISO1 и LECTISO2 получила название LECTISO3.BAS.
10 REM — LECTIS03. BAS —
20 KEY OFF: CLS: PRINT: PRINT: PRINT: PRINT: PRINT: PRINT: PRINT: PRINT: PRINT
30 SHELL "LECT210.EXE"
40 OPEN "carte.car" FOR INPUT AS #I
50 DIM T(630)
60 FOR F=1 TO 630
70 INPUT #1,T(F)
80 NEXT F
90 J=1
100 IF T(J)<>1 THEN 160
110 IF T(J+1)<>1 THEN 160
120 IF T(J+2)<>0 THEN 160
130 IF T(J+3)<>1 THEN 160
140 IF T(J+4)<>0 THEN 160
150 K=J: GOTO 200
160 J=J+1: GOTO 100
200 C$=""
210 FOR F=0 TO 4
220 IF T(K+F)=0 THEN C$=C$ +"0"
230 IF T(K+F) =1 THEN C$=C$+"1"
240 NEXT F
250 GOSUB 2000
260 K=K+5: IF K>623 THEN END
270 GOTO 200
2000 IF C$="11010" THEN PRINT "{start}"
2010 IF C$="10110" THEN PRINT "{sep}"
2020 IF C$="11111" THEN PRINT "{end}"
2030 IF C$="01011" THEN PRINT "{10}";
2040 IF C$="00111" THEN PRINT "{12}";
2050 IF C$="01110" THEN PRINT "{14}";
2060 IF C$="00001" THEN PRINT "0";
2070 IF C$="10000" THEN PRINT "1";
2080 IF C$="01000" THEN PRINT "2";
2090 IF C$="11001" THEN PRINT "3";
2100 IF C$="00100" THEN PRINT "4";
2110 IF C$="10101" THEN PRINT "5";
2120 IF C$="01101" THEN PRINT "6";
2130 IF C$="11100" THEN PRINT "7";
2140 IF C$="00010" THEN PRINT "8";
2150 IF C$="10011" THEN PRINT "9";
2999 RETURN
3000 REM (c)1996 Patrick GUEULLE
Эта программа абсолютно идентична LECTISO2, но она дает несколько более громоздкие результаты.
Файлы с расширением .CAR, полученные с помощью LECT75 и LECT210, естественно, не вызывают никаких проблем совместимости с программами данной книги. Однако это не всегда получается при их использовании в другом контексте, что, конечно, вправе сделать любой из наших читателей.
Ниже приводятся несколько весьма полезных служебных программ для решения небольших проблем, которые рано или поздно могут появиться.
Программа выравнивания
Как уже показывалось, наши программы считывания магнитных дорожек создают линейные — однострочные, то есть без специальных символов перехода на новую строку, — файлы с расширением .CAR. Это нисколько не мешает их отображению, например с помощью команды ТУРЕ операционной системы DOS, но может возникнуть желание их распечатать или сохранить в более удобном формате.
Для этого вместо программы текстового редактора более практично, по нашему мнению, использовать небольшую программу JUSTCAR.ВAS, трансформирующую любой файл .CAR в строго упорядоченный блок из 32 колонок.
10 REM — JUSTCAR. BAS —
20 KEY OFF: CLS
30 PRINT "имя файла?";
40 INPUT N$: IF N$="" THEN END
50 FOR F=1 TO LEN(N$)
60 IF MID$(N$,F,1) = "." THEN 90
70 NEXT F
80 N$=N$+".CAR"
90 OPEN NS: FOR INPUT AS #1
100 OPEN "carte.bak" FOR OUTPUT AS #2
110 DIM M(LOF(1)): CLS
120 L=0: WHILE NOT EOF(1)
130 INPUT#1,M(L)
140 PRINT#2,M(L);: L=L+1
150 WEND
160 CLOSE #1
170 OPEN NS FOR OUTPUT AS #1
180 G=0: FOR F=0 TO L-1
190 PRINT M(F);
200 IF M(F)=1 THEN PRINT#1,"1";
210 IF M(F)=0 THEN PRINT#1,"0";
220 G=G+1: IF G=32 THEN PRINT#1, G=0
230 NEXT F: PRINT
240 END
250 REM COPYRIGHT (c) 1996 Patrick GUEULLE
Отметим, что аварийный файл CARTE.ВАК был создан прежде всего для сохранения данных в случае сбоя, происшедшего во время обработки (разрыв сети и т. д.).
Кроме того, если имя исходного файла содержит расширение .CAR, у нас не будет необходимости его набирать, поскольку оно добавится автоматически.
В результате работы программы преобразованные данные заменяют содержимое исходного файла, при этом новый файл, хотя уже и выровненный, остается совместимым с программами данной книги.
Ниже показано, что получается при обработке файла TEST5.CAR с помощью программы JUSTCAR.
Программа инвертирования
Большинство считывающих устройств, начиная с описанных в данной главе, ожидают прохода карты в строго определенном направлении — как правило, это слева направо перед головкой. Иногда приходится проводить карту в обратном направлении (справа налево) или работать с нестандартными картами, записанными наоборот.
Программа INVERT.BAS способна «перевернуть» любой файл .CAR вне зависимости от его длины.
10 REM — INVERT.BAS —
20 KEY OFF: CLS
30 PRINT "имя файла, который следует перевернуть?"
40 INPUT N$: IF N$="" THEN END
50 FOR F=1 TO LEN(NS)
60 IF MID$ (N$,F,1)="." THEN 90
70 NEXT F
80 N$=N$+".CAR"
90 OPEN N$ FOR INPUT AS #1
100 OPEN "carte.bak" FOR OUTPUT AS #2
110 DIM M(LOF(1)): CLS
120 L=0: WHILE NOT EOF (1)
130 INPUT #1,M(L)
140 PRINT#2,M(L);: L=L+1
150 WEND
160 CLOSE #1
170 OPEN N$ FOR OUTPUT AS #1
180 FOR F=L-1 TO 0 STEP -1
190 PRINT M(F);
200 IF M(F)=1 THEN PRINT#1,"1";
210 IF M(F)=0 THEN PRINT#1,"0";
220 NEXT F: PRINT
230 END
240 REM COPYRIGHT (c)1997 Patrick GUEULLE
Ниже представлен результат, полученный с помощью файла-образца TEST5.CAR.
Программа преобразования в формат .CRD
Автор этой книги, естественно, не единственный в мире любитель магнитных карт, тем более что этот «вид спорта» особенно популярен в США. За океаном предпочтение отдают файлам формата .CRD,который отличается от .CAR отсутствием пробелов.
Поскольку в Internet можно встретить интересные программы, использующие формат .CRD, нам показалось полезным снабдить читателей служебной программой, способной сделать файлы .CAR совместимыми с ними. Речь идет о программе CARTOCRD.BAS.
В том виде, в котором она написана, эта небольшая программа может преобразовать файл CARTE.CAR, который был только что считан, в файл CARTE. CRD.
10 REM — CARTOCRD.BAS —
20 CLS: KEY OFF
30 PRINT "Преобразование файла CARTE.CAR в CARTE.CRD"
40 OPEN "carte.car" FOR INPUT AS #1
50 OPEN "carte.crd" FOR OUTPUT AS #2
60 IF EOF(1) THEN 110
70 INPUT #1,A
80 IF A=1 THEN PRINT#2,"1";
90 IF A=0 THEN PRINT#2,"0";
100 GOTO 60
110 PRINT "Выполнено": BEEP
120 END
130 REM (c) 1996 Patrick GUEULLE
Ниже показано, во что превращается файл TEST5.CAR, обработанный программой CARTOCRD.BAS (сначала его надо скопировать под именем CARTE .CAR).
Программа импорта файлов
Служебная программа CRDTOCAR.BAS осуществляет обратную операцию по отношению к предыдущей. Иначе говоря, выполняет преобразование файла CARTE.CRD в CARTE.CAR, совместимый со всеми нашими остальными программами.
10 REM — CRDTOCAR.BAS —
20 CLS: KEY OFF
30 PRINT "Преобразование файла CARTE.CRD в CARTE.CAR"
40 OPEN "carte.crd" FOR INPUT AS #1
50 OPEN "carte.car" FOR OUTPUT AS #2
60 IF EOF (1) THEN 110
70 A$=INPUT$ (1,#1)
80 IF A$="1" THEN PRINT#2,"1";: GOT0 60
90 IF A$="0" THEN PRINT#2,"0";: GOTO 60
10 °CLS: BEEP: PRINT "CARTE.CRD не соответствует формату CRD": END
110 PRINT "Выполнено": BEEP
120 END
130 REM (c) 1997 Patrick GUEULLE
Этим можно воспользоваться, чтобы извлечь пользу из файлов. CRD, полученных от пользователей, работающих, например, с программой CARDOMAT, очень высоко ценимой в США, которая, надо признаться, несколько подстегнула воображение автора…
Рекомендуется сначала скопировать исходный файл под именем CARTE.CRD, в то время как результат преобразования будет носить имя CARTE.CAR.
Иногда необходимо декодировать содержимое файла .CAR, когда нет карты, с которой он был считан. Это может быть файл, уже прочитанный при помощи LECT75 или LECT210, или файл, переписанный на дискету либо полученный по электронной почте другим любителем считывания с магнитных карт. Это может быть даже файл, предварительно «перевернутый» программой INVERT, если есть подозрение, что он был считан в обратном направлении.
Наши программы LECTISO не подходят для решения такой задачи по двум основным причинам. Во-первых, они созданы специально для управления операцией считывания в оболочке, а не для работы в автономном режиме. Во-вторых, каждая из них разработана для строго определенной дорожки ISO, а значит, рассчитана на определенное число битов.
Программа DEC5.BAS, со своей стороны, может взаимодействовать с любым файлом .CAR с пятиразрядным кодированием (а значит, цифровым) вне зависимости от его длины и дорожки, с которой он взят.
Познакомиться с работой DECS.BAS можно, предложив ей декодировать файл TEST5 .CAR, который есть на сайте www.dmk.ru.
10 REM — DEC5.BAS —
20 KEY OFF: CLS
30 PRINT "Имя декодируемого файла?";
40 INPUT N$: IF N$="" THEN END
50 FOR F=1 TO LEN(N$)
60 IF MID$(N$,F,1)="." THEN 90
70 NEXT F
80 N$=N$ +".CAR"
90 OPEN N$ FOR INPUT AS #1
100 L=INT(LOF(1)/2)-1
110 DIM T(LOF (1))
120 F=1:WHILE NOT EOF(1)
130 INPUT#1,T(F): F=F+1
140 WEND
150 J=1
160 IF T(J)<>1 THEN 220
170 IF T(J+1)<>1 THEN 220
180 IF T(J+2)<>0 THEN 220
190 IF T(J+3)<>1 THEN 220
200 IF T(J+4)<>0 THEN 220
210 K=J: GOTO 230
220 J=J+1: GOTO 160
230 C$=""
240 FOR F=0 TO 4
2S0 IF T(K+F) =0 THEN C$=C$+"0"
260 IF T(K+F) =1 THEN C$=C$+"1"
270 NEXT F
280 GOSUB 310
290 K=K+5: IF K>L-1 THEN END
300 GOTO 230
310 IF C$ = "11010" THEN PRINT "{Start}"
320 IF C$ = "10110" THEN PRINT " {sep}"
330 IF C$ = "11111" THEN PRINT "{end}"
340 IF C$ = "01011" THEN PRINT "{10}";
350 IF C$ = "00111" THEN PRINT "{12}";
360 IF C$ = "01110" THEN PRINT "{14}";
370 IF C$ = "00001" THEN PRINT "0";
380 IF C$ = "10000" THEN PRINT "1";
390 IF С$ = "01000" THEN PRINT "2";
400 IF C$ = "11001" THEN PRINT "3";
410 IF C$ = "00100" THEN PRINT "4";
420 IF C$ = "10101" THEN PRINT "5";
430 IF C$ = "01101" THEN PRINT "6";
440 IF C$ = "11100" THEN PRINT -7";
450 IF C$ = "00010" THEN PRINT "8";
460 IF C$ = "10011" THEN PRINT "9";
470 RETURN
480 REM (с) 1996 Patrick GUEULLE
Программа DEC7.BAS выполняет функцию, аналогичную выполняемой программой DEC5, но с алфавитно-цифровыми файлами, символы которых закодированы семью битами.
10 REM — DEC7.BAS —
20 KEY OFF: CLS
30 PRINT "Имя декодируемого файла?";
40 INPUT N$: IF N$="" THEN END
50 FOR F=1 TO LEN(N$)
60 IF MID$ (N$,F,1) = "." THEN 90
70 NEXT F
80 N$=N$+".CAR"
90 OPEN N$ FOR INPUT AS #1
100 L=INT(LOF(1)/2)-1
110 DIM T (LOF (1))
120 F=1: WHILE NOT EOF(1)
130 INPUT#1,T(F): F=F+1
140 WEND
150 J=1
160 IF T(J)<>1 THEN 240
170 IF T(J+1)<>0 THEN 240
180 IF T(J+2)<>1 THEN 240
190 IF T(J+3)<>0 THEN 240
200 IF T(J+4)<>0 THEN 240
210 IF T(J+5)<>0 THEN 240
220 IF T(J+6)<>1 THEN 240
230 K=J: GOTO 250
240 J=J+1: GOTO 160
250 C$=""
260 FOR F=0 TO 6
270 IF T(K+F)=0 THEN C$=C$+"0"
280 IF T(K+F)=1 THEN C$=C$+"1"
290 NEXT F
300 GOSUB 330
310 K=K+7: IF K>L-1 THEN END
320 GOTO 250
330 IF C$="1010001" THEN PRINT "{start}"
340 IF C$="0111110" THEN PRINT "{sep}"
350 IF C$="1111100" THEN PRINT "{end}"
360 IF C$="0000001" THEN PRINT " ";
370 IF C$="1000000" THEN PRINT "{1H}";
380 IF C$="0100000" THEN PRINT "{2H}";
390 IF C$="1100001" THEN PRINT "{3H}";
400 IF C$="0010000" THEN PRINT "{4H}";
410 IF C$="0110001" THEN PRINT "{6H}";
420 IF C$="1110000" THEN PRINT "{7H}";
430 IF C$="0001000" THEN PRINT "{8H}";
440 IF C$="1001001" THEN PRINT "{9H}";
450 IF C$="0101001" THEN PRINT "{AH}";
460 IF C$="1101000" THEN PRINT "{BH}";
470 IF C$="0011001" THEN PRINT "{CH}";
480 IF C$="1011000" THEN PRINT "{DH}";
490 IF C$="0111000" THEN PRINT "{EH}";
500 IF C$="1111001" THEN PRINT "{FH}";
510 IF C$="0000100" THEN PRINT "0";
520 IF C$="1000101" THEN PRINT "1";
530 IF C$="0100101" THEN PRINT "2";
540 IF C$="1100100" THEN PRINT "3";
550 IF C$="0010101" THEN PRINT "4";
560 IF C$="1010100" THEN PRINT "5";
570 IF C$="0110100" THEN PRINT "6";
580 IF C$="1110101" THEN PRINT "7";
590 IF C$="0001101" THEN PRINT "8";
600 IF C$="1001100" THEN PRINT "9";
610 IF C$="0101100“ THEN PRINT "{1AH}";
620 IF C$="1101101" THEN PRINT "{1BH}";
630 IF C$="0011100" THEN PRINT "{1CH}";
640 IF C$="1011101" THEN PRINT "{1DH}";
650 IF C$="0111101" THEN PRINT "{1EH}";
660 IF С$="1000011" THEN PRINT "A";
670 IF C$="0100011" THEN PRINT "В";
680 IF C$="1100010" THEN PRINT "C";
690 IF C$="0010011" THEN PRINT "D";
700 IF С$="1010010" THEN PRINT "E";
710 IF C$="0110010" THEN PRINT "F";
720 IF C$="1110011" THEN PRINT "G";
730 IF C$="0001011" THEN PRINT "H";
740 IF C$="1001010" THEN PRINT "I";
750 IF C$="0101010" THEN PRINT "J";
760 IF C$="1101011" THEN PRINT "K";
770 IF C$="0011010" THEN PRINT "L";
780 IF C$="1011011" THEN PRINT "M";
790 IF C$="0111011" THEN PRINT "N";
800 IF C$="1111010" THEN PRINT "O";
810 IF C$="0000111" THEN PRINT "P";
820 IF C$="1000110" THEN PRINT "Q";
830 IF C$="0100110" THEN PRINT "R";
840 IF C$="1100111" THEN PRINT "S";
850 IF C$="0010110" THEN PRINT "T";
860 IF C$="1010111" THEN PRINT "U";
870 IF C$="0110111" THEN PRINT "V";
880 IF C$="1110110" THEN PRINT "W";
890 IF C$="0001110' THEN PRINT "X";
900 IF C$="1001111" THEN PRINT "Y";
910 IF C$="0101111" THEN PRINT "Z";
920 IF C$="1101110'' THEN PRINT "{3BH}";
930 IF C$="0011111" THEN PRINT "{3DH}";
940 IF C$="1011110" THEN PRINT "{3EH}"
950 IF C$="1111111" THEN PRINT "{40H}";
960 RETURN
970 REM (c) 1996 Patrick GUEULLE
Время от времени приходится сталкиваться с файлом .CAR, который после считывания карты не мог быть декодирован надлежащим образом с помощью программ LECTISO.
Прежде чем приступить к изучению карты с использованием «магнитного разоблачителя», желательно провести простой анализ посредством специальной программы.
10 REM — PARITY.BAS—
20 KEY OFF: CLS
30 PRINT "имя файла, подлежащего проверке";
40 INPUT N$: IF N$ = "" THEN END
50 FOR F=1 TO LEN (N$)
60 IF MID$(N$,F,1) = "." THEN 90
70 NEXT F
80 N$=N$+".CAR"
90 OPEN N$ FOR INPUT AS #1
100 CLS: PRINT "идет контроль четности…": PRINT
110 DIM A(LOF(1))
120 M=0: WHILE NOT EOF(1)
130 INPUT#1,A(M): M=M+1: WEND
140 PRINT "0…0";
150 X=0
160 IF A(X) =1 THEN 180
170 X=X+1: GOTO 160
180 N=0: FOR F=X TO X+4
190 IF A(F) =1 THEN N=N+1: PRINT "1"; ELSE PRINT "0";
200 NEXT F: PRINT " ";
210 IF (N/2)-INT(N/2)=0 THEN 230
220 IF X>=M THEN 310 ELSE X=X+5: GOTO 180
230 IF N>0 THEN 290
240 FOR G=X TO M
250 IF A(G)>0 THEN 290
260 NEXT G
270 PRINT "0…0"
280 GOTO 310
290 PRINT: PRINT: PRINT: PRINT "четность 5-разрядного кода неправильная"
300 ВЕЕР: PRINT: PRINT: PRINT: GOTO 330
310 PRINT: PRINT: PRINT: PRINT "четность 5-разрядного кода правильная"
320 PRINT: PRINT: PRINT
330 PRINT"0…..0";
340 X=0
350 IF A(X)=1 THEN 370
360 X=X+1: GOTO 350
370 N=0: FOR F=X TO X+6
380 IF A(F) =1 THEN N=N+1: PRINT"!";ELSE PRINT "0";
390 NEXT F: PRINT " ";
400 IF (N/2)-INT(N/2)=0 THEN 420
410 IF X>=M THEN 500 ELSE X=X+7: GOTO 370
420 IF N>0 THEN 480
430 FOR G=X TO M
440 IF A(G) >0 THEN 480
Начиная с первого бита в 1, программа PARITY.BAS применяет определенные правила для проверки четности блоков данных по пять бит, затем по семь бит. При отсутствии ошибки это позволяет ей четко отличать файлы, закодированные пятиразрядным кодом ANSI, от закодированных семиразрядным кодом ANSI. Пока ошибка не обнаружена, программа выдает группы, успешно прошедшие проверку, и останавливается на первом символе с ошибкой, иначе говоря, на первой группе по пять или семь бит, содержащей четное число единиц.
Конечно, если проверки по пять бит и по семь бит окончились неудачей еще до конца файла, нельзя сразу сделать вывод. Необходим более тщательный анализ. Начать, если это возможно, следует с нового считывания карты.
В общем, эта программа позволит убедиться в отсутствии ошибки четности в любом файле .CAR.
Ниже представлен результат проверки файла TEST5.CAR (его можно найти на сайте www.dmk.ru) закодированного пятиразрядным кодом и не имеющего никаких ошибок четности. Следует обратить внимание, что нули запуска и заполнения представлены в сокращенной форме.
Теперь покажем результат той же самой проверки, на этот раз проведенной с файлом TEST7.CAR, закодированным семиразрядным кодом и также не имеющим никаких ошибок.
Мы не написали программу, предназначенную для проверки на этой стадии считывания символов LRC, которые обычно заканчивают каждую дорожку. Наша цель на данный момент заключается в обнаружении самых грубых ошибок, которые могли бы нарушить процесс считывания.
При возникновении настоятельной необходимости в проверке LRC можно обратиться к программе LRCMAG.BAS из главы 4. Эта программа предназначена для использования в ходе операций кодирования, но вполне годится и после считывания, за которым следует декодирование.
Вот еще одна проверка, которую удобно проводить с файлом .CAR, но только после его декодирования. Речь идет не о серии битов, а о числе, состоящем из некоторого количества цифр помимо битов заполнения.
Например, в случае файла VISA.CAR необходимо произвести проверку только одной части информации, декодирование которой представлено в главе 2, где речь идет о содержимом дорожки ISO 2 банковской карточки. В данном случае это 16-значный номер карточки: 4970101234567890.
Программа LUHNCHK.BAS работает с числами, состоящими из любого количества цифр, как четного, так и нечетного.
10 REM — LUHNCHK.BAS —
20 KEY OFF: CLS
30 CLEAR: PRINT: PRINT "введите номер карты": INPUT N$
40 L=LEN(N$):DIM N(L)
50 FOR F=1 TO L
60 C$=MID$(N$,F,1): C=VAL(C$): N(F) = C
70 NEXT F
80 IF (L/2) — INT (L/2) = 0 THEN 170
90 T=0: FOR F=2 TO L — 1 STEP 2
100 C=2*N(F): IF C>=10 THEN C=C-9
110 T=T+C: NEXT F
120 FOR F=1 TO L STEP 2
130 T=T+N(F): NEXT F
140 IF T>=10 THEN T=T-10: GOTO 140
150 IF T=0 THEN PRINT "номер действителен": GOTO 30
160 PRINT "номер не действителен": GOTO 30
170 T=Q: FOR F=1 TO L-1 STEP 2
180 C=2*N(F): IF C>=10 THEN C=C-9
190 T=T+C: NEXT F
200 FOR F=2 TO L STEP 2
210 T=T+N(F): NEXT F
220 GOTO 140
230 REM (c)1996 Patrick GUEULLE
В данном случае ответ будет номер не действителен, потому что мы, естественно, использовали номер несуществующей кредитной карточки. С другой стороны, ничто не мешает произвести такую проверку с вашей банковской карточкой, номер которой должен быть действительным.
Поскольку магнитная технология допускает практически неограниченные возможности стирания информации (штатного или нештатного), а также многократную запись, то важно иметь возможность проверять, не изменилось ли содержимое той или иной дорожки.
Это очень просто сделать путем архивирования файла .CAR — того, который послужил для кодирования карты (мы еще к этому вернемся), либо того, который был создан при «реперном» считывании.
Программа VERMAG.BAS позволяет сравнить не две карты, а два файла .CAR — старый и новый. Каждый идентичный бит обозначается тире, а каждый отличающийся — звездочкой, что сразу дает представление о масштабе возможного несоответствия. Нули запуска и заполнения, как известно, представляются в сокращенном виде, поскольку они исключены из процесса проверки. Их число может несколько изменяться от одного до другого считывания той же самой карты.
10 REM — VERMAG.BAS —
20 KEY OFF: CLS
30 PRINT "имя файла, подлежащего проверке";
40 INPUT N$: IF N$ = "" THEN END
50 FOR F=1 TO LEN (N$)
60 IF MID$ (N$,F,1) = "." THEN 90
70 NEXT F
80 N$=N$+".CAR"
90 OPEN N$ FOR INPUT AS #1
100 PRINT: PRINT "имя эталонного файла";
110 INPUT N$: IF N$="" THEN END
120 FOR F=1 TO LEN(N$)
130 IF MID$ (N$,F,1)="." THEN 160
140 NEXT F
150 N$=N$+".CAR"
160 OPEN N$ FOR INPUT AS #2
170 CLS: PRINT "идет проверка…"
180 DIM A(LOF(1)): DIM B(LOF<2))
190 F=0: WHILE NOT EOF(1)
200 INPUT#1, A (F); F=F+1: WEND
210 M=F
220 F=0: WHILE NOT EOF(2)
230 INPUT#2,B(F): F=F+1: WEND
240 N=F
250 X=0
260 IF A(X) =1 THEN 280
270 X=X+1: GOTO 260
280 Y=0
290 IF В (Y) = 1 THEN 310
300 Y = Y+1: GOTO 290
310 CLS: PRINT "0…….0";: E=0
320 IF A(X) =B(Y) THEN PRINT "-"; ELSE PRINT "*";: E=1
330 IF X=M THEN 360 ELSE X=X+1
340 IF Y=N THEN 360 ELSE Y=Y+1
350 GOTO 320
360 PRINT" 0 0": PRINT: PRINT: PRINT "Файл"
370 IF E=0 THEN PRINT "соответствует!": PRINT: PRINT: END
380 PRINT "не соответствует!": PRINT: PRINT: BEEP: END
390 REM COPYRIGHT (c)1996 Patrick GUEULLE
Ниже представлен результат, полученный при сравнении явно различных файлов TEST5.CAR И TEST7.CAR.
Теперь покажем результат, полученный при сравнении двух идентичных файлов. В обоих случаях отчет обязательно появляется по окончании выполнения программы.