Под капака на софтуера за банкомати
Прочетох много статии в GT и Habré за банкови карти, банкомати и затова реших да дам своя принос. По-долу ще се опитам да говоря за това как банкоматът е подреден от гледна точка на софтуера.
Какво е банкомат?
Всеки банкомат е по същество компютър със свързани периферни устройства, мениджър на оборудване и реално банково приложение, което управлява цялата тази икономика. Всички решения за издаване на пари се вземат от сървъра. Банкоматът само събира информация от клиента и я предава на сървъра.
Хардуер за банкомати
Кой управлява този зоопарк?
За да не страдат производителите с писането на драйвери, от които никой не се нуждае по-късно, а разработчиците на софтуер да не страдат от различни решения за управление на конкретен хардуер, беше решено да се обедини цялото нещо.
Така се ражда стандартътCEN/XFSили простоXFS, което означава разширение за финансови услуги. Стандартът описва клиент/сървър архитектура, състояща се от хардуерен мениджър и управляваните от него доставчици на услуги (разчетени драйвери на устройства). В терминологията на стандарта „доставчик на услуги“ е библиотека, която предоставя специфичен набор от функции за получаване на информация за устройство и управлението му. Обикновено това е динамична библиотека, съдържаща определен набор от стандартни функции (Open, Close, GetInfo, Execute), всяка от които има редица специфични за устройството аргументи.
Цялото взаимодействие с оборудването се осъществява чрез API на XFS Manager. Например параметърът Command на функцията Execute може да има стойност за автомат за банкноти: WFS_CMD_CDM_DISPENSE (набор пари от касети) WFS_CMD_CDM_PRESENT (издаване на пакет на клиент)
За четец на карти: WFS_CMD_IDC_RETAIN_CARD (улавяне на карта), WFS_CMD_IDC_READ_TRACK (четене на песен)
Има няколко реализации на мениджъри на XFS (включително такива с отворен код), написани на C++, и теоретично библиотеките на доставчиците на услуги, написани за един мениджър, също трябва да пасват на всички останали, но всъщност понякога библиотека, написана от конкретен доставчик за конкретен мениджър на XFS, работи само с този мениджър.
Има иJava XFSсъс собствени библиотеки, които не са съвместими с класическите мениджъри.
банково приложение
Приложението за банкиране е това, което виждате на екрана, когато се доближите до устройството. Той е предназначен да събира данни от потребителя, да изпраща тези данни до хоста (сървъра) и да изпълнява отговор от хоста. Както в случая с хардуера (XFS), има индустриални протоколи (NDC/DDC), чрез които приложението комуникира с хоста, зарежда конфигурацията и я интерпретира.
Всеки голям производител на банкомати (Wincor, NCR, Diebold) има собствена реализация както на XFS, така и на банково приложение. На пазара обаче има алтернативен софтуер, който отговаря на всички стандарти и не е обвързан с конкретен доставчик.
Ще опиша банкомата, използващ NDC като най-разпространения протокол в България, но малко по-малко популярният DDC има подобен принцип на работа.
Как работи
Във всеки момент банкоматът е в един от режимите на работа:
- Включване- Зареждане
- Офлайн- Няма връзка със сървъра, свързва се
- Супервайзор— инкасаторът или сервизният инженер работи
- Out of service- банкоматът не работи, защото не работи, парите са свършили или просто някой от банката го е превключил на този режим.
- Вътреуслуга- основният режим на работа, познат на всички, които имат банкови карти.
Първият символ на този ред е типът на състоянието (обозначен с буквите A..Z, а също и a..z и някои знаци (,'.?)), той дефинира колекцията. Останалите 24 знака са 8 десетични трицифрени числа, всяко от които е специфична настройка на състоянието (номер на екрана за показване, условия за превключване към състоянието, списък с действия). Може да има произволен брой състояния от един и същи тип.
В сервизен режим
Когато режимът на поддръжка започне, банкоматът автоматично започва да изпълнява състояние 000. Това обикновено е състояние A (състояние на четене на картата). В това състояние банкоматът показва екран, който ви подканва да поставите карта и поставя четеца на карти в режим на приемане. Държавата също е отговорна за разчитането на картата и разклоняването в зависимост от резултатите от тази операция.
По-долу е дадена примерна конфигурация на типично състояние A:000A001001011008004002001104
000— номер на състояниеA— тип състояние (състояние на четене на карта)001— номер на екран (номер на екран)001— номер на състояние, към което да отидете в случай на успешно четене на карта011— номер на състояние, към което да отидете в случай на грешки при четене на карта008— условие за четене 100 4— условие за четене 2002— условие за четене 3001— условие за връщане на картата (веднага след прочитане или при завършване на операцията)104— състояние на преход, ако картата е неизвестна на банката
Нека разгледаме по-подробно параметрите:Тип на състоянието- тук всичко е ясно: след като определи типа на състоянието, приложението знае как да интерпретира допълнителни параметри.Номер на екрана—е връзка към низ с текстово описание на екрана, показван по време на работа на това състояние.
Не всеки щат има екран.
Един екран може да има номер от 000 до 999. Екрани, които се различават със 100, обикновено са запазени за различни езици. Следователно екран 010 и екран 210 най-вероятно са многоезични версии на един и същ екран. Ще говоря за екраните малко по-късно.
Номер на преходното състояние в случай на проблеми с четенето на картата— ако картата не може да бъде прочетена според някое от предложените условия, преминете към състоянието, посочено в този параметър. По правило това е състоянието J (състояние на затваряне), на което даваме картата, показваме екран с предложение да я вземете и активирате таймера, след което ще се стартира механизмът за задържане на картата. Състояние J е и последното състояние в случай на успешна транзакция.
Условия за четене на картата(3 параметъра подред) са битови маски, които показват номерата на песните, които трябва да бъдат прочетени, и взаимодействие с чипа, ако има такова.
Условие за връщане на картата— банкоматът може да върне картите веднага след прочитане или може да го направи в края, след като всички операции са завършени.
Останалите състояния са подредени по подобен начин:
- Има състояния за четене на сумата от клавиатурата и поставянето й в специален вътрешен буфер;
- Има състояния за четене на пин код с пин пад и след това получаване на пин блок в специален буфер;
- Има състояния за проверка на въведените данни (например, ако въведената сума е по-малка от минималната сума, тогава има пренасочване към състоянието със съобщение за грешка);
- Има състояния за избор с помощта на страничните клавиши (т.нар. FDK) и поставяне на символите на тези клавиши (ABCD FGHI) в специален 8-байтов буфер;
- Има състояния за нулиране и предварителна настройкабуфери.
- ID на действието, което трябва да се извърши;
- номер на екрана, който ще се показва по време на това действие;
- съдържанието на чека, ако чекът трябва да бъде отпечатан;
- Състоянието, в което да преминете, когато действието завърши.
След приключване на необходимите действия, приложението изпраща потвърждение на хоста и преминава в посоченото състояние. По правило това е вече познатото ни състояние J. В случай на повреда приложението изпраща съобщение за повреда на хоста и чака нов отговор на транзакция с преход към ново състояние.
Сега за екраните
Екранът на банкомата е поле от 32x16 клетки. Екранът може да съдържа както графична информация, така и текстова информация, която е позиционирана спрямо клетките. Шрифтовете могат да бъдат с двойна височина.
Описанието на екрана е ред от текст,осеяни с контролни знаци като изчистване на екрана, позиция на курсора, размер на шрифта. В повечето съвременни банки днес текстът се използва само при въвеждане на суми, а в други случаи екранът е просто цяла картина. Има обаче и изцяло текстови екрани.
Пример за екран, показващ картина от таблица с картини (\0c\1bP2018\1b\5c)
Именно за такива екрани се отнасят параметрите на състоянието.
Наборът от състояния, екрани, FIT, таймери се нарича ATM сценарий. Всеки сценарий има свой номер. След като зареди банкомата и го свърже към мрежата, той изпраща съобщение до хоста, в което съобщава своя ID и конфигурационен номер. Ако конфигурацията трябва да се актуализира, хостът превключва банкомата в режим „Извън обслужване“ и започва да зарежда необходимите параметри на новата конфигурация. Последният параметър е номерът на конфигурацията. По подобен начин се зареждат ключовете за криптиране на пин блока, за изскачане и главните ключове.
Ето накратко как работи един банкомат. Надявам се тази информация да е полезна за някого.
И тук можете да получите грант за тестов период на Yandex.Cloud. Необходимо е само да въведете "Habr" в полето "секретна парола".