Терминалы Lipman Nurit и их программирование

Приветствую всех!

Не так давно я уже рассказывал о разработке приложений для банковских терминалов Ingenico. И тогда я сказал, что платформа Telium была выбрана из-за того, что она единственная, под которую в открытом доступе есть SDK.

Но вот так получилось, что в мои руки попал софт другой фирмы, некогда производившей терминалы, и я решил, что было бы неплохо написать пост и об этом.

Терминалы Lipman Nurit и их программирование

Итак, в ходе данной статьи поговорим о несколько более древних и экзотических терминалах. Узнаем, как писать под них, где взять софт и что со всем этим делать. Традиционно будет много интересного.

❯ Суть такова

Несмотря на то, что я уже попробовал писать под Ingenico, хотелось чего-то большего. Как минимум, потому что SDK Telium был лишён подробной документации, а приложенного в комплекте CHM'а для старта разработки явно достаточно не было, также были некоторые нюансы с персонализацией терминалов (которую нельзя осуществить средствами SDK) и сопутствующими моментами. Заодно и просто было интересно узнать, как обстоят дела у других производителей.

И вот, наконец, я получил всё необходимое, а это значит, что теперь можно попробовать это в работе и рассказать о впечатлениях вам.

❯ Обзор оборудования

Итак, для начала разберёмся с тем, под что мы вообще будем писать. Терминалы эти производились израильской компанией Lipman Electronics Engineering, позже поглощённой VeriFone, под линейкой Nurit. Устройства работали на процессорах MC68000 или ARM. В ходе данной статьи рассмотрим последний ввиду наличия у меня софта под него. Тем не менее, для устройств на MC68000 во многом всё идентично, так что если вам удастся раздобыть библиотеки и компилятор под них, то эта статья тоже пригодится.

Итак, взглянем на типичных представителей терминалов данной фирмы.

Терминалы Lipman Nurit и их программирование

Nurit 2085. Старый терминал на MC68000. Из косяков моего экземпляра — отсутствует крышка принтера.

Терминалы Lipman Nurit и их программирование
Терминалы Lipman Nurit и их программирование

Аккумулятор внутри потёк, но выкусил я его до того, как дорожки позеленели.

Терминалы Lipman Nurit и их программирование
Терминалы Lipman Nurit и их программирование

Nurit 3020. Один из самых навороченных экземпляров на MC68000. Была также модель 3010 с GSM-модемом.

Терминалы Lipman Nurit и их программирование
Терминалы Lipman Nurit и их программирование
Терминалы Lipman Nurit и их программирование
Терминалы Lipman Nurit и их программирование

Внутренности. Терминал не оснащён хранилищем ключей, поэтому тамперов тоже нет. Память поддерживает всё тот же аккумулятор (на этот раз он в идеальном состоянии). Из необычного — принтер имеет рычаг, отводящий головку от прижимного валика, чтобы можно было подсунуть новую ленту, но он тут жёстко зафиксирован в защёлкнутом положении, а бумага заправляется при прокрутке (для чего есть комбинация кнопочек). По идее, износ принтера при этом выше, ну да ладно.

Терминалы Lipman Nurit и их программирование

Процессор MC68000 и микросхема Flash внутри терминала 3020. В глаза бросается также некий разъём «DEBUG CARD». Скорее всего, использовался он на заводе для проверки платы на работоспособность.

Терминалы Lipman Nurit и их программирование
Терминалы Lipman Nurit и их программирование

Nurit 8320. По виду он очень напоминает предыдущий, но построен он на процессоре ARM, также он оснащён хранилищем ключей. GSM-модем теперь полностью встроенный (у аппаратов вроде Nurit 3010 была внешняя антенна). Два слота под SAM-модули и никель-металлгидридный аккумулятор никуда не делись.

Терминалы Lipman Nurit и их программирование
Терминалы Lipman Nurit и их программирование
Терминалы Lipman Nurit и их программирование
Терминалы Lipman Nurit и их программирование

Разбираем.

Терминалы Lipman Nurit и их программирование

Электроника, разумеется, сильно отличается. Большинство чипов находятся на плате клавиатуры и закрыты металлическим экраном, который я для фото снял. Документация на процессор нигде не находится, по-видимому, он тут заказной.

Терминалы Lipman Nurit и их программирование

GSM-модем Siemens MC35i.

Терминалы Lipman Nurit и их программирование
Терминалы Lipman Nurit и их программирование
Терминалы Lipman Nurit и их программирование

Nurit 8000. Портативный терминал с тачскрином.

Терминалы Lipman Nurit и их программирование
Терминалы Lipman Nurit и их программирование
Терминалы Lipman Nurit и их программирование
Терминалы Lipman Nurit и их программирование

Ну и внутренности, как же без них. Аккумулятор теперь литий-ионный. Разъёмы для зарядки и подключения к компьютеру проприетарные, их распиновка мне неизвестна. Процессор и память залиты смолой. Как и в прошлой модели, в нём присутствуют тамперы.

Сейчас всё это уже давно ушло в историю. Время терминалов без бесконтактной оплаты прошло. Тем не менее, такие аппараты всё ещё реально найти на вторичке (и цена вполне молодёжная), так что раздобыть экземпляр для препарирования и опытов сложно не будет.

Также у данных устройств есть один нюанс с блоком питания: он тут на шестнадцать вольт и с инверсной полярностью (центральный контакт разъёма — минус!).

❯ Пин-пады

Помимо самих терминалов ко мне в руки попали и пин-пады. Увы, ни на один из них у меня нет ни софта, ни документации. Но это не так страшно, так как по системе команд они идентичны таковым у VeriFone, которым у меня был посвящён отдельный пост. Единственное, у Nurit пакет данных, содержащий в себе PIN-block, короче на один байт. У VeriFone этот байт отведён для состояния трёх программируемых кнопок под экраном (которые в некоторых версиях прошивки пин-пада даже не использовались).

Терминалы Lipman Nurit и их программирование

Пин-пад Nurit 272. Распиновка идентична таковой у VeriFone PP1000SE.

Терминалы Lipman Nurit и их программирование

Дисплей на HD44780, «из коробки» поддерживает и русский шрифт.

А вот так выглядит ввод PIN.Разбирать экземпляр я не стал, так как внутренняя батарейка всё ещё жива, а разбираться лишний раз со сбросом тампера не хотелось.

Терминалы Lipman Nurit и их программирование

А вот другой пин-пад, Nurit 292. Он один из самых поздних.

Терминалы Lipman Nurit и их программирование

Обратная сторона. Под крышкой слоты под SAM-модули.

Терминалы Lipman Nurit и их программирование

Инновационная израильская технология «RS-232 over USB». По контактам разъёма miniUSB гонятся уровни обычного RS-232 и двенадцать вольт питания.

Терминалы Lipman Nurit и их программирование

Внутренности. Пин-пады Nurit, в отличие от большинства таковых у VeriFone, имеют в себе считыватель смарт-карт. Батарейка, как водится, дохлая.

Терминалы Lipman Nurit и их программирование

Обратная сторона маленькой платы. Виден разъём miniUSB.

Терминалы Lipman Nurit и их программирование

Вид со снятой платой. Внутренности залиты смолой.

Терминалы Lipman Nurit и их программирование

Пин-пад VeriFone PP1000SE v2. Он тут упомянут неспроста — устройство использует ряд наработок Lipman, в частности, операционную систему. Девайс имеет режим работы «Nurit», позволяющий использовать его вместе с терминалами данной фирмы. Собственно, всё, что можно сказать про данную штуку, сказано в постепро пин-пады, так что тут повторяться не буду.

❯ Немного про применение

Хотя эти устройства создавались для банковских операций, у нас они использовались по большей части в ряде других мест (аналогично тому, как на терминалах VeriFone OMNI-395 поднимали обслуживание карт лояльности).

Nurit 8010 использовались как транспортные терминалы. Интересно, кстати: что это за считыватель и как он подключается к терминалу?

Терминалы Lipman Nurit и их программирование

Также они нашли своё применение как мобильные платёжные терминалы в системах наподобие ОСМП (он же QIWI). Карты они не принимали, а лишь служили для связи с сервером платёжной системы. По сути они были полными аналогами привычных нам «ящиков», с которых мы некогда пополняли счета телефонов, только управлялись они не нами, а операторами в точках обслуживания. Софт этот и поныне лежит здесь. В архивной копии сайта «Киберплат» есть и другой вариант подобного софта.

❯ Где взять ПО

SDK для этих терминалов искать пришлось долго. И очень долгое время он не попадался нигде. Был, правда, некий сайт possoftware.ucoz.com невразумительного содержания, где вроде как можно было купить данное ПО. Цена на сайте указана не была, но после некоторых поисков я нашёл на каком-то заплесневевшем форуме пост этого же товарища, где нужная цифра таки была — несколько тысяч долларов за один SDK. После выяснения всего этого стало понятно, что ищу я не в том направлении.

И вот в комментариях к моему посту про Ingenico товарищ vladkorotnev таки подкинул заветную ссылку. Как мне было объяснено, валялся архив на каком-то китайском сайте вроде CodeForge.com, откуда и был скачан много лет назад.

❯ Архитектура

Ну и для начала поговорим немного об устройстве программной части этих устройств. Все терминалы Nurit работают на своей проприетарной ОС — Nurit OS (NOS). Терминал оснащён Flash, где находятся загрузчик, сама NOS, а также пользовательское приложение.

Загрузчик осуществляет запуск NOS, а также её перезапись в случае таковой необходимости (например, при обновлении ОС). Перепрошивка осуществляется при помощи софта OSP Loader и *.osp-файла, представляющего собой запароленный ZIP-архив, содержащий в себе все версии ОС для всех терминалов, сертифицированных для страны, для которой этот пакет предназначен. Переписать можно также и сам загрузчик (но если что-то пойдёт не так, восстановить терминал выйдет только при помощи программатора).

Терминалы Lipman Nurit и их программирование

Загрузчик также обладает небольшой пасхалкой: пароль на запуск NOS — 1947, знаковый год для Израиля, где и выпускались данные аппараты.

NOS отвечает за загрузку приложения, все служебные функции по типу обмена данными при загрузке, а также работу с оборудованием на низком уровне. Именно через неё осуществляется взаимодействие приложения с железом терминала. Существует два режима работы приложения — Single и Multi. В первом режиме приложение запускается после загрузки NOS и взаимодействует с её API всё время работы вплоть до завершения, во втором же при наступлении некого события NOS вызывает его обработчик, который затем возвращает управление операционной системе терминала. Кроме этого, переключение Single->Multi в меню NOS служит для очищения Flash.

Тем не менее, даже в Single-режиме приложение должно периодически отдавать управление NOS, чтобы фоновые процессы были завершены. Для этого необходимо периодически вызывать функции Mte_Wait(), Kb_Read(), Kb_WaitForKey(). Если это не будет выполняться больше, чем десять секунд, терминал автоматически перезагрузится. То есть, например, если ваше приложение начнёт тупить в бесконечном цикле, без вызова этих функций ОС посчитает, что оно зависло, и вырубит его. Если же этот самый цикл предусмотрен вами (например, терминал ждёт, пока придут данные из порта), то необходимо не просто висеть, а вызывать Mte_Wait(1).

Терминалы Lipman Nurit и их программирование

Собственно, вот такой отчёт печатается при аварийной перезагрузке.

Терминалы Lipman Nurit и их программирование

NOS также имеет своё собственное меню, использующееся для загрузки данных и диагностики устройства.

Само приложение универсально для всех терминалов одной архитектуры и версии NOS не ниже той, для которой оно было собрано. Тем не менее, есть возможность установить минимальные системные требования при сборке установочного пакета, так как разные терминалы имеют некоторые отличия в аппаратной части, поэтому может оказаться, что не все функции приложения смогут корректно работать.

Терминалы Lipman Nurit и их программирование

А вот схема организации памяти (из официальной документации). Девайс оснащён RAM-диском, где можно хранить данные приложений, защищённые модели имеют хранилище ключей.

❯ Входим в NOS

В отличие от Ingenico Telium, где вход в менеджер осуществлялся при помощи выбора пункта меню, местное служебное меню открывается комбинацией кнопочек.

Терминалы Lipman Nurit и их программирование

Самой главной является четвёрка 4 + Menu + -> + Enter, позволяющая войти в меню NOS (что придётся делать при каждой загрузке приложения). Иногда нужен и загрузчик, например, если вы случайно загнали терминал в бесконечное ожидание и на клавиатуру он не реагирует. В таком случае необходимо зайти в NOS Loader, выбрать пункт «Start NOS» и ввести пароль: 1947

Терминалы Lipman Nurit и их программирование

То же самое для Nurit 8000. Увы, в полной мере запустить его у меня нет возможности, так как разъём для подключения к ПК проприетарный, а аналога ему, чтобы спаять кабель, я так и не нашёл.

Терминалы Lipman Nurit и их программирование

А вот для Nurit 8400. Такого терминала у меня нет, но считаю, что лишним тут это не будет.

❯ Ставим софт

Приступим к установке и запуску. Из скачанного архива понадобится примерно следующее:

  • ARM-toolchain, которым, собственно, и будем собирать программу
  • Библиотеки
  • Nurit Software Development tools — упаковщик приложений и загрузчик
  • ADE — примеры проектов
  • LipHelp — справочник разработчика

Для загрузки в терминал понадобится Fast Loader, скачать его можно тут. OSP Loader не подойдёт, а Smart Loader очень громоздкий и в большинстве случаев не нужен.Также для запуска будет нужен ПК с Windows 2000 или XP или виртуалка с ней же (очень желательно именно её).

Итак, для начала накатываемADE_ARM_1_7.49.00A.EXEиз папкиADE, далее — Nurit Software Development tools и Nurit Help. Установка всего этого очень проста и проблем не вызывает.Теперь очередь компилятора. Он имеет триальную лицензию, которая конкретно у экземпляра из архива истекла ещё в незапамятные годы. Поэтому переводим дату на первое января двухтысячного, чтобы обеспечить его работоспособность. Именно для этого и желательно установить Windows на виртуальную машину, чтобы таким переводом даты не поломать работу другого софта.

В папкеCompilador(архив, судя по всему, откуда-то из Бразилии) лежитhcarm_4.5a. Перемещаем эту папку в корень системного диска. В свойствах системы находим переменные среды, к Path добавляемC:\hcarm_4.5a;C:\hcarm_4.5a\bin;hcarm_4.5a\lib. Из корня архива берёмCLKERN.DLLи закидываем в папкуbinкомпилятора.

В общем-то, на этом всё. Можно пробовать запускать.

❯ Пишем первую программу

Ну что же, время пробовать что-то написать. Вообще, традиционной «тестовой» проги в SDK нет. Есть что-то в папкеApplicationExampleиз архива, но при всей простоте проекта собрать его у меня так и не получилось. Поэтому воспользуемся тем, что есть.

Идём по адресу C:\ADE_ARM\ADE_ARM7\SNGL_APL\SRC, там открываемDEMO.C, удаляем там весь текст, а взамен вставляем примерно следующее:

Терминалы Lipman Nurit и их программирование

Помимо этого файла там лежат ещё два — в DLMDECLR.C загружаются динамически подключаемые библиотеки, а в APPLHEAD.C указывается заголовок приложения. Выглядит это примерно так:

Терминалы Lipman Nurit и их программирование

Тут можно указать, в частности, минимальную версию NOS, а также версию и дату выпуска самого приложения. Позже это можно будет посмотреть в меню «Application info» NOS.Отдельного внимания также заслуживает файл project.def. А находится там примерно следующее (смотреть в источнике).

Зачем такие сложности с сотней define'ов и столь странным переименованием файлов, мне решительно неведомо. Чтобы при перемещении папки в другое место не пришлось бы переписывать пути во всём коде? Так можно просто указать путь ко всему NOS_API в переменной среды, как это делалось в большинстве других SDK, что я видел. Ну да ладно.Далее идём в RELEASE и в папке OBJ удаляем всё, что там лежит. Запускаем батник BUILD.BAT. Если всё было сделано правильно, то demo.log так и останется пустым, а в папке RELEASE появится demo.hex (или же у него просто станет другой дата изменения).

Но demo.hex — ещё не приложение. Чтобы сделать его таковым, нужен Application Integrator из состава Nurit Software Development Tools. Запускаем его.

Терминалы Lipman Nurit и их программирование

В открывшемся окне жмякаем крайнюю левую кнопку на панели, в открывшемся окне выбираем наш *.hex-файл. Перед сборкой загружаемого компонента можно посмотреть сведения о приложении (те самые, что были прописаны в APPLHEAD.C) или задать ограничения.

Терминалы Lipman Nurit и их программирование

Вот пример той самой установки ограничений: например, можно задать обязательное наличие каких-либо портов, если ваше приложение их использует.Теперь нажимаем вторую кнопку на панели, и готовый пакет для загрузки в терминал будет создан.

❯ Подписывание приложений

Терминалы Lipman Nurit и их программирование

По уровню защиты терминалы Nurit делятся на два вида — Secured и NOT Secured. Отличия между ними в том, что в «незащищённом» аппарате не используются тамперы (то есть его можно разобрать, и ему ничего не сделается), разрешена загрузка приложения из одного терминала в другой, установлены некоторые ограничения на криптографию. Есть и аппаратные отличия, например, защищённые терминалы внутри залиты смолой. Узнать, к какому типу относится ваш терминал, можно, если открыть NOS, выбрать пункт «Terminal ID», а затем выйти из него. При этом на пару секунд на экране загоритсяTerminal is SecuredилиTerminal is NOT Secured. Тампер с защищённого терминала сносится перепрошивкой ОС при помощи OSP Loader.

Если приложение загружается в «защищённый» терминал, оно должно быть подписано (увы, мне неведомо, каким именно софтом). Под эту подпись выделено пятьсот двенадцать байт в соответствующем поле в заголовке.

Скорее всего, вам достанется именно «простой» вариант, так как ОСМП и подобные организации не использовали криптографические функции.

❯ Fast Loader

Теперь можно загрузить приложение в терминал. Вообще, Lipman предоставляла эмулятор терминала для удобства отладки, но он до меня не дошёл, увы.

Для этого нам понадобится кабель для COM-порта и, собственно, download tool.Схема кабеля здесь вот такая:

Терминалы Lipman Nurit и их программирование

Для сборки надо всего-то лишь огрызок патч-корда и разъём DB9F. К терминалу от компьютера идёт семь проводов, но для загрузки на деле достаточно всего трёх: RX, TX, GND. Также подойдёт загрузочный кабель для VeriFone, распиновка тут идентичная.

Порядок контактов виден тут:

<i>(если что, видео вообще не про Nurit, а про VeriFone VX520. Скриншот этот был мною сделан больше трёх лет назад ради распиновки кабеля)</i>
(если что, видео вообще не про Nurit, а про VeriFone VX520. Скриншот этот был мною сделан больше трёх лет назад ради распиновки кабеля)

На этом фото красный провод — земля, белый и чёрный — RX и TX.В терминале установлен разъём 10P10C, но крайние контакты не задействованы, так что можно воткнуть туда обычный сетевой 8P8C, работать тоже будет.

Терминалы Lipman Nurit и их программирование

Далее открываем Fast Loader (или просто открываем собранное приложение, и он запустится сам). Тут настраиваем параметры порта.

Терминалы Lipman Nurit и их программирование

Теперь очередь терминала. Заходим в NOS, выбираем «Download». Далее жмякаем Enter и набираем любое число (хоть «111»). Набрать что-то надо обязательно, иначе при попытке загрузить что-то будет ошибка.

Терминалы Lipman Nurit и их программирование

Выбираем «Comm Prm», чтобы выставить параметры соединения.

Терминалы Lipman Nurit и их программирование

Указываем порт COM1 и ту же скорость, что настраивали в Fast Loader.

Терминалы Lipman Nurit и их программирование

Далее выбираем «Manual load» и подтверждаем своё действие.

Терминалы Lipman Nurit и их программирование

Теперь подключаем наш агрегат к компьютеру. Запускаем Fast Loader и жмём на терминале «Load appl». Спустя несколько секунд ПК и наш девайс установят связь, и «Starting DCP» вскоре сменится на «Erasing sectors», а затем и на прогресс-бар загрузки. Выходим из меню, NOS при этом перезагрузится. И, если мы нигде не накосячили, на дисплее должно будет появиться примерно следующее:

Терминалы Lipman Nurit и их программирование

❯ Шрифты

Разумеется, одним-единственным шрифтом терминал не ограничивается. Менять их можно так:

Терминалы Lipman Nurit и их программирование
Терминалы Lipman Nurit и их программирование

И вот так это выглядит в работе.

❯ Принтер

Конечно же, хочется что-то напечатать. Одним текстом ограничиваться мне не захотелось, так что решил заодно попробовать какую-нибудь картинку.

Терминалы Lipman Nurit и их программирование

Итак, берём BMPшку, конвертируем её в монохром и выставляем ширину строго 384 пикселя (это разрешение стоящей в терминале печатающей головки). Далее открываем какую-нибудь программу, позволяющую преобразовать изображение в массив. Я использовал LCD Assistant. Полученный файл переименовываем в myimage.c и кидаем в папку проекта. Сам массив должен иметь построчную ориентацию (один байт — восемь пикселей из горизонтальной линии). Программа для всего этого получилась вот такая.

Терминалы Lipman Nurit и их программирование

А вот и результат. Обратите внимание, что следует дождаться печати каждого элемента, иначе последующие данные, посланные принтеру, будут проигнорированы.

❯ Вот как-то так

Конечно, практического применения это уже давно не имеет. Эти терминалы навсегда ушли в историю, причём уже достаточно давно. Тем не менее, рассмотренный девайс оказался весьма интересным. А наличие подробного справочника разработчика, где детально описаны все функции и приведены примеры использования, не может не радовать. Также отмечу, что Nurit'ы намного дубовее ранее рассмотренных Telium и куда сильнее защищены от неправильных действий оператора (в отличие от Telium'a, окирпичить такой аппарат надо ещё постараться), отчего такой терминал можно с успехом использовать для каких-то собственных целей (например, как пульт управления или портативный термопринтер).

И, конечно, на этом мои эксперименты с POS-terminal'ами не заканчиваются. В частности, я не теряю надежды найти софт для ещё более реликтовых аппаратов (VeriFone SC 5000, Ingenico Unicapt32, Hypercom, Datacard, Innovatron Terminaux). Можно попробовать написать для него какую-нибудьигру или демку. И, конечно, можно попытаться сделать симулятор платёжного приложения, где бы использовалось большинство функций терминала типа криптографии и хранения данных.Такие дела.

Ссылки

Больше информации в источнике материала. Автор: MaFrance351. Блог компании Timeweb Cloud.

187187
30 комментариев

Не в тот раён зашёл, пацанчик.

53
Ответить

Вот так читаешь, думаешь для тебя написано, а потом там такое

16
Ответить

Прастити.

3
Ответить

Наконец таки нормальный контент подьехал.

4
Ответить

А зачем сюда, а не на хабр?

1
Ответить

чтобы люди хоть немного на что-то интересное посмотрели а не на щитпост

7
Ответить

Если обратить внимание на источники, то можно обнаружить, что материал уже опубликован в нашем блоге на Хабре. А сюда, чтобы больше людей ознакомилось с материалом. Нам охваты, вам годный контент. Блог счастлив, автор счастлив, читатели счастливы, в общем, сплошная благодать. )

5
Ответить