MICROS 8700 Возвращен Фиксированный формат сообщения не зарегистрирован - PullRequest
0 голосов
/ 09 ноября 2018

Я работаю над интерфейсом между POS, отправляющим фиксированное сообщение MICROS 8700 через последовательный COM-порт, и нашей PMS. Мой опыт работы с C #, MVC, AJAX, веб-приложением и более современными технологиями. Я довольно потерян со всеми коммуникациями последовательного порта COM и эмуляцией Micros, но сделал то, что могу.

Я создал службу Windows C #, которая получает сообщение и (из того, что я вижу) возвращает сообщение. Программное обеспечение POS отправляет свое сообщение через последовательный COM-порт. У меня есть программное обеспечение сторонних производителей, которое преобразует его в TCP. (Я вижу данные, передаваемые из POS и в POS в этом программном обеспечении сторонних производителей.)

Мое программное обеспечение прослушивает определенный порт TCP.

Прекрасно принимает поток байтов.

преобразует в строку ASCII.

контрольная сумма создается на основе строки ответа, но без включения SOH и вплоть до символа ETX. Ссылка

ответ преобразуется в байтовый массив с использованием кодировки ASCII.

Он отвечает тем, что я считаю правильным форматом, но он не регистрируется программным обеспечением POS.

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

Я начинаю каждое сообщение с символа SOH (\ u0001) и заканчиваю EOT (\ u0004). Я также разделяю сообщение с STX (\ u0002) и ETX (\ u0003)

Я не могу даже записать базовое сообщение об ошибке.

Просто, чтобы я не казался ленивым / некомпетентным, все, от чего мне нужно работать - это пример файла журнала и то, что я могу найти в Интернете.

Я думаю, что мне нужно "Руководство по спецификации интерфейса 1000/2000/4700/8700 pms", но я не могу получить копию этого.

Моя программа получает сообщение

1Rev 1 1 120 2001069B

, что

SOH 1Rev 1 STX 1 120 2001ETX069BEOT

и моя программа отвечает

1Rev 1 1 / Неверный ввод 0AC5

, что

SOH 1Rev 1 STX 1 / НЕПРАВИЛЬНЫЙ ВХОД ETX0AC5EOT

ID терминала SOH STX 1 / НЕПРАВИЛЬНЫЙ ВХОД ETXchecksumEOT

Иногда каждые 30 секунд, когда время ожидания соединения со стороны POS истекает, первый символ ответа отображается в журналах POS, но я считаю, что это как-то связано с буферами.

Возможно, я отправляю что-то очень неправильное, и программное обеспечение для POS не получает ожидаемого, поэтому оно не регистрирует / не обрабатывает его.

Я отправляю EOT, который, как мне кажется, сообщает POS, что сообщение завершено, и служба Windows также закрывает поток. Поэтому я не думаю, что POS ожидает окончания сообщения.

Я прочитал несколько постов, которые могли быть полезными Ссылка Ссылка

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

С Ссылка «Контрольная сумма является 16-разрядным двоичным дополнением (исключая четность, если применимо) всех символы после SOH, вплоть до символа ETX. Контрольная сумма изначально установлен на ноль. Для передачи контрольная сумма представлена ​​в виде четырех ASCII-Hex символы ".

        private static string GetChecksum(string s)
    {
        int checksum = 0;

        byte[] binary = Encoding.ASCII.GetBytes(s);

        foreach (byte b in binary)
        {
            checksum = ((checksum + b) & 0xFF);
        }
        checksum = (((checksum ^ 0xFF) + 1) & 0xFF);
        return checksum.ToString("X4");
    }

 private static string GetChecksum(string data)
    {
        short checksum = 0;
        int byteCount = data.Length;
        int index = 0;
        char current;
        byte intOffset = 48;
        byte alphaOffset = 55;
        byte scale = 16;

        if (byteCount < 2) // bad string
            return "Error";

        while (index < byteCount - 1)
        {
            current = data[index++];
            if (current < 'A')
            {
                checksum += (byte)(((byte)current - intOffset) * scale);
            }
            else
            {
                checksum += (byte)(((byte)current - alphaOffset) * 16);
            }
            current = data[index++];
            if (current < 'A')
            {
                checksum += (byte)(((byte)current - intOffset));
            }
            else
            {
                checksum += (byte)(((byte)current - alphaOffset));
            }
            index++;
        }
        return checksum.ToString("X4");
    }

1 Ответ

0 голосов
/ 12 ноября 2018

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

Десятичный октальный шестнадцатеричный двоичный символ

006 006 0x06 00000110 ACK (подтверждение)

или для C #

static char ACK = '\u0006';


byte[] ackMsg = System.Text.Encoding.ASCII.GetBytes(ACK.ToString());
                            stream.Write(ackMsg, 0, ackMsg.Length);

, а также рассчитать контрольную сумму, как показано ниже

теперь мои ответы проверяются и отображаются программным обеспечением.

"ASCII-символы, представляющие контрольную сумму. Там всегда 4 номера. Они HEX (от 0 до 9 представлен шестнадцатеричным 0x30 .. 0x39, а A-F представлен Hex от 0x41 до 0x46). Контрольная сумма вычисляется изначально установив его на 0, затем добавив все символы, начиная с (но НЕ ВКЛЮЧАЯ), и через (и ВКЛЮЧАЯ) персонаж. Полученное число затем представляется используя символы ASCII и помещенные в сообщение «

 private static string GetChecksum(string s)
        {//this gives matching checksums
            int checksum = 0;

            byte[] binary = Encoding.ASCII.GetBytes(s);

            foreach (byte b in binary)
            {
                checksum = ((checksum + b));
            }
            return checksum.ToString("X4");
        }

Надеюсь, это поможет любому, кто застрял, работая над старой технологией.

...