1.1. Через разъем RJ-45 (Vendista v.1)
Pin |
RJ-45 (v.1) |
Master |
1 (бело-оранжевый) | VCC | VCC (5 - 40V) |
2 (оранжевый) | ||
3 (бело-зеленый) | GND | GND (5 - 40V) |
4 (синий) | ||
5 (бело-синий) | Uart Rx | Uart Tx |
6 (зеленый) | Uart Tx | Uart Rx |
7 (бело-коричневый) | ||
8 (коричневый) |
Схема кабеля:
1.2. Через разъем 10 pin ((Vendista v.2)
Pin |
10 pin (v.2) |
Master |
1 | VCC | VCC (5 - 40V) |
2 | ||
3 | GND | GND (5 - 40V) |
4 | Uart Tx | Uart Rx |
5 | Uart Rx | Uart Tx |
6 | ||
7 | ||
8 | ||
9 | ||
10 |
Схема кабеля:
Настройки Uart: 115200, 8 bit, 1 stop bit, no parity. Level: 3V (5V tolerant).
Uart также используется для DEX, поэтому UartTx имеет подтяжку к 5V.
Описание терминала:
Образец проекта реализации взаимодействия с Vendista в Slave (на STM32):
либо
https://drive.google.com/file/d/1ewv2FsLPCaoDXAWg_hO9GczVES-eSEsH/view?usp=sharing
Протокол бинарный.
Формат пакета:
Заголовок 1 (4 байта) |
Тело пакета |
||
Длина Тела пакета (2 байта) Максимум - 255 |
CRC16 Тела пакета (2 байта) |
Тип пакета (1 байт) |
Данные (от 0 до 254 байт) |
Если за секунду пакет целиком не успел приняться - терминал считает что это ошибка и сбрасывает пакет. Это нужно чтобы каждую секунду терминал всегда был в предсказуемом состоянии и не зависал при ошибке в формате пакета
В процессе взаимодействия с Vendista потребуется отправлять и принимать пакеты на/с сервера препроцессинга (MinPay) через интернет. Все пакеты зашифрованы, расшифровка происходит на стороне Vendista с последующей выдачей результата через uart.
Максимальная длина тела пакета - 255 байт
Соединение с MinPay происходит через обычный сокет. Можно использовать или не использовать SSL (на усмотрение Master). В любом случае, пакет с платежными данными будет дополнительно зашифрован по 3DES на стороне Slave
Адрес основного сервера: slave.ifuture.su
Порт 86 - без SSL, 85 - с SSL (для режима "full Slave", где весь трафик идет через Master).
Порт 88 - без SSL, 87 - с SSL (для гибридного режима подключения, где логи и команды от Сервера, при наличии SIM-карты, идут через встроенный GSM/LTE модем терминала порт 89)."
2.1. Варианты режима Slave
Существует 3 варианта работы терминала в Slave режиме. Терминал - Slave, ваше внешнее устройство - Master (модем телеметрии, торговый автомат, турникет и т.д.,) . Выбор варианта Slave происходит через отправку команды настройки терминалу на портале p.vendista.ru. После отправки команды настройка Slave режима сохраняется в постоянной энергонезависимой памяти терминала.
Если терминал выпущен в модификации Slave only (без модуля связи), настройку Slave режима поменять невозможно.
При отправке команды ReadCard, поле “Использовать канал GSM терминала” = 1
В этом режиме терминал использует свою сим-карту для транзакций, модуль связи Master не используется
2. Full Slave (настройки SlaveMode = 1, useWiFi = 0)
При отправке команды ReadCard, поле “Использовать канал GSM терминала” = 0
В этом режиме терминал использует модуль связи Master для связи с сервером
3. Slave + MDB (настройки SlaveMode = 0, useWiFi = 1)
Изначально этот режим использовался в модификации терминала для WiFi, но может использоваться и с любым устройством Master, обеспечивающим связь с интернет.
В этом режиме терминал использует модуль связи Master для связи с сервером, но сам подключается к MDB и берет на себя все взаимодействие с автоматом, фискализацию, оплату по QR и т.д. Отличие от MDB режима заключается только в том, что терминал, вместо своего канала GSM, для связи с сервером использует канал Master.
Для реализации режима, на стороне Master достаточно реализовать обработку пакетов PacketFromServer, PacketToServer и ServerConnectState.
Независимо от выбранного режима, если Slave не получает от Master корректных пакетов больше 60 минут, то он перезагружается.
3.1. ReadСard
Терминал в течение 30 секунд будет пытаться обнаружить карту NFC и считать с нее данные, необходимые для проведения платежной транзакции. В результате, терминал вернет пакет ReadCardResult
Формат тела пакета:
Тип пакета (1 байт) |
Сумма транзакции в копейках (4 байта) |
Валюта (2 байта) |
Текущее (местное) время в UnixTime (4 байта) |
Использовать канал GSM терминала (1 байт) |
0x01 (ReadCard) | 0x88 0x13 0x00 0x00 (50 рублей) | 0x06 0x43 (рубли) | 0x17 0x3B 0x87 0x5E (03.04.2020 13:33:11 по Москве)** |
0x00 (не использовать) 0x01 (использовать)* |
Пример (1 рубль, 04.06.2020, запрос авторизации отправляет Master):
0x0C 0x00 0x98 0xBC 0x01 0x64 0x00 0x00 0x00 0x06 0x43 0x4F 0xC4 0xD8 0x5E 0x00
Пример (1 рубль, 04.06.2020, запрос авторизации отправляет Slave через свой канал GSM):
0x0C 0x00 0x9D 0x3C 0x01 0x64 0x00 0x00 0x00 0x06 0x43 0x4F 0xC4 0xD8 0x5E 0x01
*Доступно только для модификации терминала Slave GSM
**Если Master не знает текущее время, то можно в этом поле передать нули (0x00). В этом случае Slave использует время из своего внутреннего таймера. После перезагрузки Slave необходимо установить начальное значение таймера. Сделать это можно отправив любой пакет на сервер (например, Ping) и передав ответ (время на Slave синхронизируется с временем сервера)
3.2. PacketFromServer
При получении пакета с сервера препроцессинга (MinPay), его нужно перенаправить терминалу
Внимание: Максимальная длина тела пакета - 255 байт
Тип пакета (1 байт) |
Данные, которые были получены с сервера (Х байт) |
0x02 (PacketFromServer) | 0x0A 0x00 0x3C 0x4F 0x93 0x46 0x73 0x34 0x45 0x70 0x00 0x0D 0x01 |
Пример 1:
0x0E 0x00 0x47 0xD5 0x02 0x0A 0x00 0x3C 0x4F 0x93 0x46 0x73 0x34 0x45 0x70 0x00 0x0D 0x01
Пример 2 (когда приходит обновление прошивки):
0x13 0x00 0xBD 0x00 0x02 0x0E 0x00 0xC0 0x95 0x8A 0x31 0x90 0x35 0x3B 0x70 0x00 0x07 0x02 0x07 0x00 0xE0 0xF2 0x02
0x92 0x00 0x9D 0x17 0x02 0x8D 0x00 0xB7 0x13 0x8A 0x31 0x90 0x35 0x3B 0x70 0x01 0x07 0x02 0x08 0x00 0x00 0x00 0x00 0x80 0x01 0x20 0x99 0x87 0x01 0x08 0x5D 0x81 0x01 0x08 0x5F 0x81 0x01 0x08 0x61 0x81 0x01 0x08 0x63 0x81 0x01 0x08 0x65 0x81 0x01 0x08 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x41 0x11 0x01 0x08 0x67 0x81 0x01 0x08 0x00 0x00 0x00 0x00 0xD1 0x11 0x01 0x08 0x35 0x12 0x01 0x08 0x01 0x88 0x01 0x08 0x01 0x88 0x01 0x08 0x01 0x88 0x01 0x08 0x01 0x88 0x01 0x08 0x01 0x88 0x01 0x08 0x01 0x88 0x01 0x08 0x01 0x88 0x01 0x08 0x15 0x82 0x01 0x08 0x01 0x88 0x01 0x08 0x01 0x88 0x01 0x08 0x01 0x88 0x01 0x08 0x01 0x88 0x01 0x08 0x01 0x88 0x01 0x08 0x01 0x88 0x01 0x08 0x01 0x88 0x01 0x08 0x69 0x81 0x01 0x08
(8 пакетов такой же длины подряд)
3.3. ShowPicture
Показать на LCD определенную картинку
Тип пакета (1 байт) |
Номер картинки (1 байт) |
0x03 (ShowPicture) | 0x01* |
Примеры:
0x02 0x00 0xF7 0xF5 0x03 0x01
0x02 0x00 0xFD 0xF5 0x03 0x02
0x02 0x00 0xC1 0xF5 0x03 0x08
0x02 0x00 0xC4 0x75 0x03 0x09
0x02 0x00 0xDF 0xF5 0x03 0x0D
*Варианты картинок:
1 - Нажмите кнопку для оплаты картой
2 - Выберите товар на автомате (для автоматов, поддерживающих always idle, может использоваться в качестве стартовой)
4 - Авторизация
5 - Успешно
6 - Отклонено
8 - Недоступно
9 - Ожидайте
12 - Ошибка
13 - Кастомная картинка (для загрузки вашей кастомной картинки обратитесь на support@vendista.ru)
14 - Отмена последней транзакции успешно выполнена (деньги вернулись на карту)
20 - Поднесите карту для определения скидки (в разработке)
Картинки могут использоваться типовые или могут быть кастомизированы (с логотипом и т.д.)
3.4. ShowQR
Показать на LCD QR код
Тип пакета (1 байт) |
Длина строки QR-кода (1 байт) |
Строка для QR-кода (Х байт) |
Длина строки заголовка (1 байт) |
Строка заголовка (Y байт) |
0x04 (ShowQR) | 0x43 (Х) | t=20200430T1246&s=2.00&fn=9280440300642012&i=5403&fp=3307954677&n=1 | 0x25 (Y) | ‘Кассовый чек’ |
Пример:
0x6B 0x00 0x22 0x36 0x04 0x43 0x74 0x3d 0x32 0x30 0x32 0x30 0x30 0x34 0x33 0x30 0x54 0x31 0x32 0x34 0x36 0x26 0x73 0x3d 0x32 0x2e 0x30 0x30 0x26 0x66 0x6e 0x3d 0x39 0x32 0x38 0x30 0x34 0x34 0x30 0x33 0x30 0x30 0x36 0x34 0x32 0x30 0x31 0x32 0x26 0x69 0x3d 0x35 0x34 0x30 0x33 0x26 0x66 0x70 0x3d 0x33 0x33 0x30 0x37 0x39 0x35 0x34 0x36 0x37 0x37 0x26 0x6e 0x3d 0x31 0x25 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0xca 0x20 0xe0 0x20 0xf1 0x20 0xf1 0x20 0xee 0x20 0xe2 0x20 0xfb 0x20 0xe9 0x20 0x20 0x20 0xf7 0x20 0xe5 0x20 0xea
3.5. Reboot
Перезагрузить терминал
Если в течение часа от Master не поступило пакетов - терминал перезагружается автоматически (по Watchdog)
Тип пакета (1 байт) |
0x05 (Reboot) |
Пример:
0x01 0x00 0xE3 0x02 0x05
3.6. PingServer
Запросить пинг сервера Termv. В ответ терминал вернет пакет PacketToServer
Тип пакета (1 байт) |
0x06 (PingServer) |
Пример:
0x01 0x00 0xE9 0x02 0x06
Пример ответа:
12 0A 00 59 B8 94 58 97 37 42 70 00 01 4D 00 0E 00 79 CC 94 58 97 37 42 70 00 02 5D 8D F9 28 BA 04
3.7. CancelLastTransaction
Отменить последнюю транзакцию (оплату с карты). В ответ терминал вернет пакет PacketToServer
Тип пакета (1 байт) |
0x07 (CancelLastTransaction) |
3.8. CancelReadCard
Отменить команду ReadCard.
Тип пакета (1 байт) |
0x08 (CancelReadCard) |
Пример:
0x01 0x00 0xCE 0x82 0x08
3.9. FillScreen
Очистить экран (заполнить одним цветом)
Тип пакета (1 байт) |
Цвет 16 bit (2 байта) |
0x09 (FillScreen) | 0x00 0x00 |
Генератор цветов 16 бит: https://ee-programming-notepad.blogspot.com/2016/10/16-bit-color-generator-picker.html
Примеры:
0x03 0x00 0x48 0x71 0x09 0x00 0x00
0x03 0x00 0x45 0xF1 0x09 0xFF 0xFF
3.10. WriteLine
Вывести на экран строку текста.
Тип пакета (1 байт) |
Цвет фона (2 байта) |
Цвет текста (2 байта) |
Номер шрифта (1 байт) |
Координата X (2 байта) |
Координата Y (2 байта) |
Длина строки (1 байт) |
Строка (Y байт) |
0x0A (WriteLine) | 0xFF 0xFF | 0x00 0x00 | 0x01* | 0x08 0x00 | 0x10 0x00 | 0x05 (Y) | чек |
*Шрифты:
0 - Кириллица (мелкий)
1 - Кириллица (крупный)
2 - Courier New 12pt (узкий), только латиница
3 - Courier New 12pt (широкий), только латиница
Примеры:
0x10 0x00 0xA4 0xC0 0x0A 0xFF 0xFF 0x00 0x00 0x00 0x08 0x00 0x10 0x00 0x05 0xf7 0x20 0xe5 0x20 0xea
0x10 0x00 0xE7 0x55 0x0A 0xFF 0xFF 0x00 0x00 0x01 0x08 0x00 0x10 0x00 0x05 0xf7 0x20 0xe5 0x20 0xea
0x13 0x00 0x8D 0x24 0x0A 0xFF 0xFF 0x00 0x00 0x02 0x08 0x00 0x10 0x00 0x08 0x31 0x32 0x33 0x20 0x2d 0x20 0x4f 0x6b
0x13 0x00 0x8F 0xA5 0x0A 0xFF 0xFF 0x00 0x00 0x03 0x08 0x00 0x10 0x00 0x08 0x31 0x32 0x33 0x20 0x2d 0x20 0x4f 0x6b
0x13 0x00 0x8B 0x22 0x0A 0xFF 0xFF 0x00 0x00 0x04 0x08 0x00 0x10 0x00 0x08 0x31 0x32 0x33 0x20 0x2d 0x20 0x4f 0x6b
3.11. ServerConnectState
Уведомить Slave о состоянии соединения с сервером (актуально только для режима Slave + MDB)
Тип пакета (1 байт) |
Rssi. Сила сигнала: от 0 до 4 (1 байт) |
Длина строки с названием сотового оператора или точки доступа WiFi (1 байт) |
Строка (Y байт) |
0x0B (ServerConnectState) | 0x03 | 0x03 | MTS |
Если Rssi = 0, Slave будет считать, что соединение с сервером разорвано и не будет принимать платежи
Если Rssi > 0, то Slave покажет на своем экране силу сигнала в виде столбиков (кол-во столбиков = Rssi)
Перед столбиками Rssi терминал выведет Строку с названием сотового оператора или точки доступа WiFi (максимум 7 символов)
3.12. SetCustomValue
Установить значение внутренней переменной в Slave
Тип пакета (1 байт) |
Значение переменной (4 байта) |
0x0C (SetCustomValue) | 0x01 0x00 0x00 0x00 |
3.13. Заводская инициализация терминала (0x0D)
Не использовать
3.14. VendReport
Зарегистрировать продажу (нал/безнал) с формированием фискального чека в онлайн кассе
Тип пакета (1 байт) |
Тип продажи* (1 байт) |
Цена товара в копейках (2 байта) |
Номер товара (1 байт) |
0x0E (VendReport) | 0x02 (Cashless) | 0x88 0x13 (50 рублей) | 0x04 |
Пример:
0x05 0x00 0x97 0x91 0x0E 0x02 0x88 0x13 0x04
* enum VendResults //Типы продажи
{
VendResult_Cash = 1, //Продажа за нал
VendResult_Cashless = 2, //Продажа за безнал
VendResult_ExternalCredit = 3, //Продажа за внешний кредит (начисленный внешней кассой или другим средством приема денег)
VendResult_Bonus = 4 // Продажа за бонусы
};
3.15. CustomPacketToExternalServer
Отправить на сервер произвольный пакет (для пересылки на Внешний сервер Master). В ответ Slave отправит пакет на свой сервер препроцессинга (если у него есть своя симка), и вернет на Master этот же пакет через PacketToServer
Тип пакета (1 байт) |
Пакет (Х байт) |
0x0F (CustomPacketToExternalServer) | 0x01 0x02 0x03 |
Пример:
0x04 0x00 0xC5 0x3F 0x0F 0x01 0x02 0x03
3.16. ServerConnectStateRequest
Запросить состояние соединения Slave со своим сервером процессинга. Актуально при использовании симки Slave
Тип пакета (1 байт) |
0x10 (ServerConnectStateRequest) |
Пример:
0x01 0x00 0x9E 0x82 0x10
3.17. WriteText&Rectangle
Предназначена для пакетной отрисовки примитивов(прямоугольников) и вывода текста.
Общий размер пакета не должен превышать 300 байт.
Формат тела пакета:
Тип пакета (1 байт) |
Объект №1 |
Объект №2 |
Объект №n |
0x30 (WriteText&Rectangle) | Примитив или текст. | Примитив или текст. | Примитив или текст. |
Формат объекта «примитив»:
Тип объекта (1 байт) |
Координаты верхнего левого угла по оси X (2 байта) |
Координаты верхнего левого угла по оси Y (2 байта) |
Координаты нижнего правого угла по оси X (2 байта) |
Координаты нижнего правого угла по оси Y (2 байта) |
Цвет (R,G,B) (3 байта) |
0x01 (прямоугольник) |
0x00 0x00 (0)*
|
0x00 0x00 (0)** |
0x3F 0x01 (319)* |
0xDF 0x01 (479)** |
0xFF 0x00 0x00 (красный)**** |
Формат объекта «текст»:
Тип объекта (1 байт) |
Координаты верхнего левого угла по оси X (2 байта) |
Координаты верхнего левого угла по оси Y (2 байта) |
Номер шрифта (2 байта) |
Цвет текста (R,G,B) (3 байта) |
Цвет фона (R,G,B) (3 байта) |
Длина строки (1 байт) |
Строка (Y байт) |
0x02 (текст) |
0x00 0x00 (0)*
|
0x00 0x00 (0)** | 0x01*** |
0xFF 0xFF 0xFF (белый)**** |
0xFF 0x00 0x00 (красный)**** | 0x03 (Y) | чек***** |
*для сборок терминала v2 и v2.5 c LCD 2,4" диапазон значений= 0..239; для v3 с LCD 3,5" диапазон значений= 0..319.
**для сборок терминала v2 и v2.5 c LCD 2,4" диапазон значений= 0..319; для v3 с LCD 3,5" диапазон значений= 0..479.
***Шрифт:
0 - Кириллица (мелкий)
1 - Кириллица (крупный)
2 - Courier New 12pt (узкий), только латиница
3 - Courier New 12pt (широкий), только латиница
4 - Только цифры (крупный)
****красный (255, 0, 0); зеленый (0, 255, 0); синий (0, 0, 255); белый (255, 255, 255); черный (0, 0, 0)
*****текст в кодировке Windows-1251
Пример команды вывода примитива:
“0x0D 0x00 0x7E 0x70 0x30 0x01 0x32 0x00 0x64 0x00 0xBD 0x00 0xDB 0x00 0xFF 0x00 0x00" - прямоугольник (координаты= 50,100,189,219; цвет= красный (R=255, G=0, B=0))
Пример команды вывода текста:
“0x15 0x00 0x39 0xF0 0x30 0x02 0x64 0x00 0x64 0x00 0x01 0xFF 0x00 0x00 0x00 0x00 0xFF 0x07 0xD2 0xE5 0xF1 0xF2 0x20 0x30 0x31"
текст (координаты= 100,100; шрифт = 1(кириллица (крупный)); цвет текста= красный (R=255, G=0, B=0); цвет фона= синий (R=0, G=0, B=255); длина = 7; строка = "Тест 01”)
Пример команды вывода примитива и текста поверх него:
“0x48 0x00 0x5D 0x7A 0x30 0x01 0x00 0x00 0x00 0x00 0xEF 0x00 0x3F 0x01 0x00 0x00 0x00 0x02 0x64 0x00 0x64 0x00 0x01 0xFF 0xFF 0xFF 0x00 0x00 0x00 0x07 0xD2 0xE5 0xF1 0xF2 0x20 0x30 0x31 0x02 0x64 0x00 0x82 0x00 0x01 0xFF 0xFF 0xFF 0x00 0x00 0x00 0x07 0xD2 0xE5 0xF1 0xF2 0x20 0x30 0x32 0x02 0x64 0x00 0xA0 0x00 0x04 0xFF 0xFF 0xFF 0x00 0x00 0x00 0x06 0x30 0x31 0x32 0x33 0x34 0x35”
Фрагменты этого пакета:
“0x01 0x00 0x00 0x00 0x00 0xEF 0x00 0x3F 0x01 0x00 0x00 0x00” - прямоугольник (координаты= 0,0,239,319; цвет= черный)
“0x02 0x64 0x00 0x64 0x00 0x01 0xFF 0xFF 0xFF 0x00 0x00 0x00 0x07 0xD2 0xE5 0xF1 0xF2 0x20 0x30 0x31” - текст (координаты = 100,100; шрифт = 1(кириллица (крупный)); цвет текста = белый; цвет фона = черный; длина = 7; строка = “ТЕСТ 01”)
“0x02 0x64 0x00 0x82 0x00 0x01 0xFF 0xFF 0xFF 0x00 0x00 0x00 0x07 0xD2 0xE5 0xF1 0xF2 0x20 0x30 0x32” - текст (координаты = 100,130; шрифт = 1 (кириллица (крупный)); цвет текста = белый; цвет фона = черный; длина = 7; строка = “ТЕСТ 02”)
“0x02 0x64 0x00 0xA0 0x00 0x04 0xFF 0xFF 0xFF 0x00 0x00 0x00 0x06 0x30 0x31 0x32 0x33 0x34 0x35” - текст (координаты = 100,160; шрифт = 4 (только цифры (крупный)); цвет текста = белый; цвет фона = черный; длина = 6; строка = “012345”)
3.18. VendRequest
Запрос на продажу для получения QR на оплату (QR СБП).
Таймаут для индикации обратного отсчета выставляется в “MDB. Таймауты” - “Таймаут (в сек) поднесения карты”.
Под QR можно отображать наименование товара (всего до 8-ми товаров), задаваемое в ЛК “Текстовые строки в Pulse”.
Команду VendRequest следует отправлять перед командой ReadСard, если предполагается использовать считывание банковской карты.
Формат тела пакета:
Тип пакета (1 байт) |
Цена товара в копейках (4 байта) |
Номер товара (2 байта) |
Использовать канал GSM терминала (1 байт) |
0x31 (VendRequest) |
0x88 0x13 0x00 0x00 (50 рублей) |
0x01 0x0 (товар №2)** |
0x00 (не использовать) 0x01 (использовать)* |
*Доступно только для модификации терминала Slave GSM.
** Отсчет 1-го товара начинается с 0x00 0x00.
Пример команды:
“0x08 0x00 0xD2 0x0F 0x31 0x64 0x00 0x00 0x00 0x01 0x00 0x01” (Цена=1руб, Товар= 2. Отправляется через встроенный LTE/GSM модем)
“0x08 0x00 0xD7 0x8F 0x31 0x64 0x00 0x00 0x00 0x01 0x00 0x00” (Цена=1руб, Товар= 2. Отправляется через Мастер-контроллер)
4.1 Touch
Уведомление о нажатии на LCD
Тип пакета (1 байт) |
0x11 (Touch) |
4.2 PacketToServer
Инструкция для Master - отправить пакет на сервер MinPay
Тип пакета (1 байт) |
Данные, которые нужно отправить на сервер (Х байт) |
0x12 (PacketToServer) |
Пример:
12 0A 00 59 B8 94 58 97 37 42 70 00 01 4D 00 0E 00 79 CC 94 58 97 37 42 70 00 02 5D 8D F9 28 BA 04
После получения этого пакета нужно отправить на сервер:
0A 00 59 B8 94 58 97 37 42 70 00 01 4D 00 0E 00 79 CC 94 58 97 37 42 70 00 02 5D 8D F9 28 BA 04
4.3 Card Read Result
Результат поиска и чтения карты
Тип пакета (1 байт) |
Результат (1 байт) |
Номер прочитанной карты (8 байт) |
0x13 (CardReadResult) |
0x00 - карта не обнаружена 0x01 - карта обнаружена, но не считана 0x02 - карта считана успешно |
Номер карты в BCD, средние 8 цифр затираются нулями для безопасности. Передается только если Результат = 0x02 |
При ответе 0x02, перед этим пакетом придет пакет PacketToServer с данными карты
Пример пакета:
0A 00 AB F6 13 02 42 97 00 00 00 00 86 57
4.4 CardAuthorizationResult
Тип пакета (1 байт) |
Результат (1 байт) |
0x14 (CardAuthorizationResult) |
0x00 - оплата отклонена 0x01 - оплата принята |
4.5 Ack
Подтверждение приема пакета от Master
Тип пакета (1 байт) |
CRC16 принятого пакета (2 байта) |
0x15 (Ack) |
4.6 RebootReport
Уведомление о перезагрузке
Тип пакета (1 байт) |
ID терминала (4 байта) |
0x16 (RebootReport) |
4.7 ServerConnectStateReport
Уведомление о состоянии соединения Slave со своим сервером процессинга
Тип пакета (1 байт) |
Состояние * (1 байт) |
0x18 (ServerConnectStateReport) |
4.8 CustomPacketToMaster
Передача произвольного пакета данных пользователя на Master.
Тип пакета (1 байт) |
Данные, которые получены с сервера(максимум 256 байт) |
0x1B (CustomPacketToMaster) |
(X байт) |
Пример пакета:
“01019AB81B303132333435363738393031323334353637383930313233343536373839303132333435363738393031323334353637383930313233343536373839303132333435363738393031323334353637383930313233343536373839303132333435363738393031323334353637383930313233343536373839303132333435363738393031323334353637383930313233343536373839303132333435363738393031323334353637383930313233343536373839303132333435363738393031323334353637383930313233343536373839303132333435363738393031323334353637383930313233343536373839303132333435363738393031323334”
* enum ConnectStates {
ConnectState_None = 0,
ConnectState_Disconnected = 1,
ConnectState_SIM800Found = 2,
ConnectState_SIM800NotFound = 3,
ConnectState_SIMFound = 4,
ConnectState_GSMRegPassed = 5,
ConnectState_PhoneNumAcquired = 6,
ConnectState_GPRSActive = 7,
ConnectState_IPAcquired = 8,
ConnectState_ServerConnected = 9
};
5. Коды символов кириллицы LCD
А | 0xC0 | К | 0xCA | Ф | 0xD4 | Ю | 0xDE | и | 0xE8 | т | 0xF2 | ь | 0xFC |
Б | 0xC1 | Л | 0xCB | Х | 0xD5 | Я | 0xDF | й | 0xE9 | у | 0xF3 | э | 0xFD |
В | 0xC2 | М | 0xCC | Ц | 0xD6 | а | 0xE0 | к | 0xEA | ф | 0xF4 | ю | 0xFE |
Г | 0xC3 | Н | 0xCD | Ч | 0xD7 | б | 0xE1 | л | 0xEB | х | 0xF5 | я | 0xFF |
Д | 0xC4 | О | 0xCE | Ш | 0xD8 | в | 0xE2 | м | 0xEC | ц | 0xF6 | ||
Е | 0xC5 | П | 0xCF | Щ | 0xD9 | г | 0xE3 | н | 0xED | ч | 0xF7 | Ё | 0xA8 |
Ж | 0xC6 | Р | 0xD0 | Ъ | 0xDA | д | 0xE4 | о | 0xEE | ш | 0xF8 | ё | 0xB8 |
З | 0xC7 | С | 0xD1 | Ы | 0xDB | е | 0xE5 | п | 0xEF | щ | 0xF9 | ||
И | 0xC8 | Т | 0xD2 | Ь | 0xDC | ж | 0xE6 | р | 0xF0 | ъ | 0xFA | ||
Й | 0xC9 | У | 0xD3 | Э | 0xDD | з | 0xE7 | с | 0xF1 | ы | 0xFB |
#define _u8 unsigned char
#define _u16 unsigned short
_u16 crcTable [256];
//--------------------------------------------------------------------------------------------------------------------------
void MakeCRC16Table()
{
_u16 r;
int s, s1;
for(s = 0; s < 256; s++)
{
r = ((_u16)s)<<8;
for (s1 = 0; s1 < 8; s1++)
{
if (r&(1<<15))
r = (r<<1)^0x8005;
else
r = r<<1;
}
crcTable[s] = r;
}
}
//--------------------------------------------------------------------------------------------------------------------------
_u16 GetCRC16(const _u8 *buf, _u16 len)
{
_u16 crc;
crc = 0xFFFF;
while (len--)
{
crc = crcTable [((crc>>8)^*buf++)&0xFF] ^ (crc<<8);
}
crc ^= 0xFFFF;
return crc;
}