シリアル com ポートを介して MICROS 8700 固定メッセージを送信する POS と PMS の間のインターフェイスに取り組んでいます。私の経験は、C#、MVC、AJAX、webapp 側、およびより最新のテクノロジです。すべての COM シリアル ポート通信と Micros エミュレーションでかなり迷っていますが、できる限りのことをしました。
メッセージを受信し、(私が見ることができるものから) メッセージを返す C# Windows サービスを作成しました。POS ソフトウェアは、シリアル COM ポート経由でメッセージを送信します。これをTCPに変換するサードパーティのソフトウェアが中間にあります(このサードパーティのソフトウェアで、POSからPOSへのデータの受け渡しを確認できます)。
ソフトウェアが特定の TCP ポートをリッスンしています。
バイトストリームを正常に受信します。
ASCII 文字列に変換します。
応答文字列に基づいてチェックサムが作成されますが、SOH は含まれず、ETX 文字まで含まれます。リンク
応答は、ASCII エンコーディングを使用してバイト配列に変換されます。
正しい形式だと思いますが、POS ソフトウェアによってログに記録されません。
チェックサムが正しく計算されていないという理論に取り組んでいましたが、チェックサムの決定方法を変更しても進歩がありませんでした。
すべてのメッセージは SOH (\u0001) 文字で始まり、EOT (\u0004) で終わります。また、メッセージを STX (\u0002) と ETX (\u0003) で区切ります。
基本的なエラー メッセージをログに記録することさえできません。
私が怠け者/無能に見えないように、私が作業しなければならないのは、ログファイルの例とインターネットで見つけられるものだけです。
「1000/2000/4700/8700pms インターフェース仕様説明書」が必要かと思いますが、コピーが取れません。
私のプログラムはメッセージを受け取ります
1Rev 1 1 120 2001069B
これは
SOH 1Rev 1 STX 1 120 2001ETX069BEOT
私のプログラムは次のように応答します
1Rev 1 1/無効なエントリ 0AC5
これは
SOH 1Rev 1 STX 1/無効なエントリ ETX0AC5EOT
SOH端末ID STX 1/INVALID ENTRY ETXchecksumEOT
場合によっては、POS 側からの接続がタイムアウトになる 30 秒ごとに、返信の最初の文字が POS ログに表示されることがありますが、これはバッファに関係していると思います。
多分私は何か非常に間違ったものを送信しており、POS ソフトウェアは期待したものを取得していないため、ログや処理を行っていません。
私は EOT を送信しています。これは、メッセージが終了したことを POS に伝え、Windows サービスもストリームを閉じます。だから私はPOSがメッセージの終わりを待っているとは思わない。
役に立つかもしれないいくつかの投稿を読みました リンク リンク
本当に、チェックサムを生成する方法についての提案、または私の問題が何であるかについての他の提案が欲しいです。私が試した 2 つの異なるチェックサム コード ブロックを参照してください。
From Link 「チェックサムは、SOH の後の ETX 文字までのすべての文字の 16 ビットのバイナリ加算 (該当する場合はパリティを除く) です。チェックサムは最初はゼロに設定されています。送信の場合、チェックサムは次のように表されます。 4 つの 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");
}