Я работаю над интерфейсом между 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");
}