Протоколы NDC и DDC
Справочная заметка ATM: Протоколы NDC и DDC.
Протоколы NDC и DDC
Обзор
NDC (NCR Direct Connect) — проприетарный протокол компании NCR для связи ATM с хостом.
DDC (Diebold Direct Connect) — аналогичный протокол Diebold, структурно схожий с NDC.
Оба протокола выполняют двойную функцию:
- Транзакционная: передача авторизационных запросов и ответов
- Управляющая (management): настройка ATM, управление экранами, конфигурацией, состоянием
Это отличает NDC/DDC от чистого ISO 8583, который отвечает только за транзакции.
[!warning] Нужен источник Полные спецификации NDC/DDC являются вендорскими и обычно недоступны публично. Детальные форматы сообщений ниже нужно проверять по официальной документации NCR/Diebold Nixdorf или внутренним материалам банка.
NDC — архитектура взаимодействия
graph LR
ATM_APP["ATM Application\n(APTRA)"]
NDC_DRV["NDC Driver\n(в составе ATM ПО)"]
HOST["NDC Host\n(процессинг NCR или\nбанковский хост)"]
ATM_APP <--> NDC_DRV
NDC_DRV <-->|"NDC messages\nover TCP/TLS"| HOST
Важно: NDC — это протокол «хост управляет ATM». Хост посылает ATM экранные определения (screen definitions), параметры конфигурации, сценарии поведения. ATM «тупой» — он следует инструкциям хоста.
NDC — структура сообщения
Каждое NDC-сообщение — это ASCII-строка с разделителями:
<MSG_CLASS><FS><MSG_SUBCLASS><FS><DATA...><FS>...<ETX>
Где:
<FS>= Field Separator (ASCII 0x1C,\)<ETX>= End of Text (ASCII 0x03)<MSG_CLASS>— класс сообщения (1 символ)
Классы сообщений NDC
| Класс | Символ | Описание |
|---|---|---|
| Transaction Request | T | ATM → Host: запрос транзакции |
| Transaction Reply | F | Host → ATM: ответ на транзакцию |
| Status | S | ATM → Host: статус ATM |
| Status Reply | B | Host → ATM: ответ на статус |
| Solicited Status | (запрошенный) | Host инициирует запрос статуса |
| Unsolicited Status | (инициированный ATM) | ATM сам сообщает об изменении |
| Configuration ID Load | 1 | Host → ATM: конфигурация |
| Screen Data Load | 5 | Host → ATM: загрузка экранов |
| State Table Load | 4 | Host → ATM: таблица состояний |
| Terminal Command | 2 | Host → ATM: команда терминалу |
NDC State Machine (машина состояний)
NDC-протокол описывает поведение ATM через таблицу состояний (State Table).
Каждое состояние определяет:
- Какой экран показать клиенту
- Какие клавиши обрабатывать
- В какое состояние переходить при каком вводе
stateDiagram-v2
[*] --> State000 : Запуск ATM
State000 : State 000\nCard Read
State001 : State 001\nPIN Entry
State002 : State 002\nTransaction Request\n(отправка на хост)
State003 : State 003\nAmount Entry
State004 : State 004\nDispense
State005 : State 005\nReceipt Print
State006 : State 006\nReturn Card
StateErr : Error State
State000 --> State001 : Card inserted OK
State000 --> StateErr : Card read error
State001 --> State003 : PIN OK
State001 --> StateErr : PIN error
State003 --> State002 : Amount selected
State002 --> State004 : Host: Approved
State002 --> StateErr : Host: Declined / Timeout
State004 --> State005 : Cash dispensed
State005 --> State006 : Receipt printed
State006 --> [*] : Card ejected
Количество состояний: в реальных ATM-конфигурациях до 255 состояний. Таблица состояний загружается хостом при инициализации ATM.
NDC — Transaction Request (ATM → Host)
T \ T \ <LUNO> \ <DATE> \ <TIME> \ <SEQNO> \
<TRACK2> \ <OP-CODE> \ <AMOUNT-AUTH> \ <AMOUNT-DISP> \
<TRACK1> \ <PIN-BLOCK> \ <BUFFER-B> \ <BUFFER-C>
| Поле | Описание |
|---|---|
T | Message Class = Transaction |
T | Message Sub-Class = Transaction Request |
LUNO | Logical Unit Number (ID терминала, до 8 знаков) |
DATE | YYMMDD |
TIME | HHMMSS |
SEQNO | Порядковый номер транзакции |
TRACK2 | Данные Track 2 карты |
OP-CODE | Код операции (например 1 = withdrawal) |
AMOUNT-AUTH | Запрошенная сумма авторизации |
AMOUNT-DISP | Сумма к выдаче |
TRACK1 | Данные Track 1 (если есть) |
PIN-BLOCK | Зашифрованный PIN Block |
BUFFER-B | Буфер B (данные EMV/chip) |
BUFFER-C | Буфер C (данные EMV/chip, продолжение) |
NDC — Transaction Reply (Host → ATM)
F \ T \ <LUNO> \ <DATE> \ <TIME> \ <SEQNO> \
<FUNC-CODE> \ <SCREEN-NO> \ <DISP-DATA> \
<RECEIPT-NO> \ <AMOUNT-DISP> \ <TRACK2> \ <PIN-BLOCK>
| Поле | Описание |
|---|---|
FUNC-CODE | Код функции хоста: D = диспенсировать, A = авторизовано без выдачи, N = отказ |
SCREEN-NO | Номер экрана для показа клиенту |
DISP-DATA | Данные для подстановки на экран (например сумма, баланс) |
RECEIPT-NO | Номер чека |
AMOUNT-DISP | Сумма к диспенсированию |
Function Codes:
| Код | Действие ATM |
|---|---|
D | Dispense and print receipt |
A | Approved, no cash (balance inquiry) |
N | Decline, show error screen |
F | Cardholder error (show specific screen) |
Z | Terminal error |
U | Unrecognized request (resend) |
NDC — Status Messages
Solicited Status (запрос от хоста)
Хост запрашивает текущее состояние ATM:
Host → ATM: запрос статуса
ATM → Host: Status (S \ <LUNO> \ <STATUS-DESC>)
Unsolicited Status (ATM сам отправляет)
ATM сообщает хосту об изменении состояния:
sequenceDiagram
participant ATM
participant HOST
ATM->>HOST: Unsolicited Status\nS \ ATM01 \ InService
HOST-->>ATM: Status Reply B
Note over ATM: Jam в диспенсере
ATM->>HOST: Unsolicited Status\nS \ ATM01 \ DeviceFault\nCDM JAM
HOST-->>ATM: Status Reply B
HOST->>HOST: Alert: ATM01 Out of Service
Status Descriptor структура
S \ <LUNO> \ <DEVICE-STATUS> \ <SUPPLY-STATUS> \
<HARDWARE-ERROR> \ <SENSORS> \ <RESERVED>
| Поле | Значения |
|---|---|
| Device Status | In Service, Out of Service, Supervisor |
| Supply Status | Состояние расходников (лента принтера, кассеты) |
| Hardware Error | Описание ошибки устройства |
NDC — Screen Definitions
Экраны ATM определяются хостом и загружаются через Screen Data Load (5):
5 \ <SCREEN-NUMBER> \ <SCREEN-TYPE> \ <TEXT-LINES> \
<GRAPHIC-DATA> \ <FUNCTION-KEY-DATA>
| Параметр | Описание |
|---|---|
| Screen Number | 000–999 |
| Screen Type | Тип экрана (FDK, touch, audio) |
| Text Lines | Строки текста с подстановкой переменных |
| Function Key Data | Назначение функциональных клавиш FDK |
Подстановка переменных на экранах:
%A= Transaction Amount%B= Account Balance%Z= Custom data from host response
DDC — отличия от NDC
DDC (Diebold Direct Connect) структурно аналогичен NDC, но имеет отличия:
| Параметр | NDC | DDC |
|---|---|---|
| Разработчик | NCR | Diebold |
| Используется с | NCR ATM | Diebold ATM |
| Формат | ASCII, FS-separated | ASCII, FS-separated (схожий) |
| Управление состоянием | State Table | State Table (аналогичная концепция) |
| Коды операций | Собственные | Собственные (частично пересекаются) |
| Загрузка конфигурации | Configuration ID Load | Configuration Load (аналог) |
| EMV поддержка | Через Buffer B/C | Через аналогичные буферы |
[!warning] Документация DDC Полная спецификация DDC является проприетарной документацией Diebold Nixdorf и не находится в открытом доступе. Информация выше основана на общеизвестных отраслевых данных.
NDC/DDC и мультивендорное ПО
Современное ATM-ПО (KAL Kalignite, Diebold Vynamic, NCR APTRA) поддерживает оба протокола через абстрактный уровень:
graph TD
APP["ATM Application\n(мультивендорное)"]
ADAPTER["Protocol Adapter Layer"]
NDC_DRV["NDC Driver"]
DDC_DRV["DDC Driver"]
ISO_GW["ISO 8583 Gateway"]
HOST_NCR["NCR NDC Host"]
HOST_DIE["Diebold DDC Host"]
HOST_ISO["Universal ISO Host"]
APP --> ADAPTER
ADAPTER --> NDC_DRV --> HOST_NCR
ADAPTER --> DDC_DRV --> HOST_DIE
ADAPTER --> ISO_GW --> HOST_ISO
Связанные заметки
- ATM-Протоколы-обзор — обзор всех протоколов
- ATM-ISO-8583 — ISO 8583 как альтернатива/дополнение
- ATM-NCR — NCR ATM и APTRA (NDC-native)
- ATM-Diebold-Nixdorf — Diebold ATM (DDC-native)
- ATM-KAL-Kalignite — мультивендорное ПО с поддержкой NDC/DDC
- TERM-ndc · TERM-luno
Источники
- Нужен официальный публичный источник по конкретной версии NDC/DDC или внутренняя документация банка/вендора.