Как передать несколько типов данных через последовательный порт, используя JSS C? - PullRequest
1 голос
/ 15 апреля 2020

Мне поручено создать программу, которая может инициировать платеж на карточном терминале Ingenico. Это меньшая часть более крупного проекта по созданию собственной POS-системы для бизнеса. Но я сталкиваюсь с множеством препятствий, затрудняющих эту проблему.

  1. У меня нет опыта программирования с последовательными портами. Документация, которую я нашел в Интернете, содержит только записи строк или байтов. Примеры просты, но не дают мне достаточно информации.

  2. Нет документации для устройства, которое я использую. Ingenico не предоставляет эту информацию. Единственный способ выяснить, какие данные ожидает от читателя карты инициирование платежа, - это уже завершенный проект на github. Вот ссылка

https://github.com/Ousret/pyTeliumManager

Эта реализация в python и использует систему на основе linux. Мы бы использовали это, но нам нужна более индивидуальная реализация, поэтому я делаю это в java.

Я посмотрел и посмотрел в этом проекте, чтобы найти, как данные структурированы и затем отправляются через соединение через последовательный порт, но в этот момент я пропускаю их из-за незнания. Я совсем не знаком с python, и единственное, что я знаю, это то, что данные для инициирования платежа следующие ...

  • число с плавающей запятой для суммы транзакции

  • три строки, одна для типа валюты (доллары США, евро и c), способ оплаты (карта) и идентификатор кассы (может быть любым, для личного учета)

  • и три логических значения: одно, если вы хотите дождаться подтверждения транзакции, одно, если вы хотите получить подтверждение банка, и одно, если вы хотите, чтобы информация о платеже была сохранена. (Я установил все это в ложь, так как в данный момент они не нужны. Я просто пытаюсь написать что-то, что работает как доказательство концепции, прежде чем создавать интерфейс)

Теперь, Вот часть моего тестового кода, и большая часть этого похожа на то, что я нашел в inte rnet в моем исследовании.

    public static void main(String[] args) {
    SerialPort cerealPort = new SerialPort("COM9");

        try {


            System.out.println("Port opened: " + cerealPort.openPort());
            System.out.println("reading bytes " + cerealPort.readBytes());
            System.out.println("name " + cerealPort.getPortName());
            cerealPort.writeString("bing bong");



            //cerealPort.setEventsMask(256);


            System.out.println("Params setted: " + cerealPort.setParams(9600, 8, 1, 0));
            System.out.println("\"Hello World!!!\" successfully writen to port: " + cerealPort.writeBytes("Hello World!!!".getBytes()));

            System.out.println("Port closed: " + cerealPort.closePort());
        }
        catch (SerialPortException ex){
            System.out.println(ex);
        }
    }

} 

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

Теперь у меня есть класс с именем TelliumData, в котором содержатся описанные мной члены данных.

public class TelliumData {
float amount;
String paymentMode = "debit";
String currency = "USD";
String checkoutId = "1";
boolean transactionWait = false; // waits for trans to end. Set to True if you need valid transaction status otherwise, set it to False.
boolean collectPaymentInfo = false;
boolean forceBankVerify = false;

}

У меня есть 0 идей, как передать эту информацию в терминал, используя функции из JSS C

Мой вопрос, по сути, как мне отправить эти данные через последовательный порт?

Я пытался использовать .writebytes и .writeint для отправки всех данных по одному, но это ничего не делает и не вызывает инициализацию платежа на устройстве чтения карт.

I не понимаю, как реализация python сделала это тоже. Было бы здорово, если бы кто-то мог объяснить, как эти данные упаковываются и отправляются.

...