ZVT700 Protokoll und CRC Prüfsumme

Alle Fragen um die Programmierung, die sich sonst nicht kategorisieren lassen. Von Makro bis Codeblock, von IF bis ENDIF

Moderator: Moderatoren

Antworten
Benutzeravatar
urbi
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 142
Registriert: So, 26. Mär 2006 18:47
Wohnort: 76185 Karlsruhe
Kontaktdaten:

ZVT700 Protokoll und CRC Prüfsumme

Beitrag von urbi »

Hallo und guten Tag,

möchte über COM-Schnittstelle den Zahlbetrag an EC Terminal übergeben,
funktioniert auch, nur die CRC-Prüfsumme kann ich nicht ermitteln.
ging bisher über Cardterm.dll, habe hier auch die Prüfsummen ermittelt

Code: Alles auswählen

   cpassw:="000000"
   // Anmelden
   // 98309  = 2^16 + 2^15 + 2^2 + 1  
   m->csend := "10 02 06 00 06 "+cpassw+" 10 10 09 78 10 03 " //43 A6 
   m->csend:=CHARREM(" ",m->csend)
   ncrc :=  Com_CRC( m->csend,0,98309 ) 
   ccrc := NTOC( ncrc ,16)  
   // ccrc :=  "F3E6" müsste aber "43A6" sein
   // "43A6"  aus cardterm.og 
   m->csend+="43A6"
   COM_SEND(port, HexToStr(m->csend) )
   // warten auf OK 

auch der Zahlbetrag kommt am Terminal an wenn ich CRC aus Cardterm verwende.
wo könnte der Fehler liegen.

Gruss
Rainer
urbi
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15710
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 73 Mal
Danksagung erhalten: 38 Mal
Kontaktdaten:

Beitrag von brandelh »

Hi,

ich vermute dass dies die XBToolsIII Funktionen sind, die du einsetzt.
Bei COM_CRC() gibt es den 2. und 3. Parameter, die das Ergebnis wohl nachhaltig beeinflussen. Eventuell sind diese Einstellungen bei beiden nicht identisch ?

Warum kannst du eigentlich keine CardTerm.DLL Aufruf nutzen ?
Hast du dazu die Doku ?
Gruß
Hubert
Benutzeravatar
urbi
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 142
Registriert: So, 26. Mär 2006 18:47
Wohnort: 76185 Karlsruhe
Kontaktdaten:

Beitrag von urbi »

Hi Hubert,

bin dem Problem schon langsam auf der Spur, :idea:
1. das Terminal verwendet Polynom 2^16 + 2^15 + 2^10 + 2^3
2. nicht alle HexZeichen werden in der CRC-Berechnung berücksichtigt.

Doku gibts unter http://www.terminalhersteller.de

Da die neuen Terminals direkt auch unter LAN-Adr. angesprochen werden können, und Cardterm.dll ca. 170 Euro netto für Endkunden kostet macht es vielleicht doch Sinn ohne Cardterm auszukommen.

Gruss
urbi
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15710
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 73 Mal
Danksagung erhalten: 38 Mal
Kontaktdaten:

Beitrag von brandelh »

Hallo,

dort fand ich folgenden Beispielcode für die CRC Berechnung in VB:

Code: Alles auswählen

CRC-Berechnung

Beispielprogramm für Visual-Basic:
 
 
  ' * Zuerst die Codetabelle erzeugen *
  Dim CRCT(0 To 255) As Long       ' Codetabelle für CRC-16-Check
  Dim CRC As Long                  ' Kurzzeitige Verwendung
  Dim i as Integer                 ' Schleifenvariable
  Dim j as Integer                 ' Schleifenvariable
  Dim HB as Long                   ' CRC-Highbyte
  Dim LB as Long                   ' CRC-Lowbyte
  
  ' * Codetabelle erzeugen (CRC-16) *
  ' Dieses braucht nur 1x gemacht werden.
   For i = 0 To 255
      CRC = i
      For j = 1 To 8
         If (CRC And 1) = 1 Then
            CRC = Fix(CRC / 2) Xor 33800
         Else
            CRC = Fix(CRC / 2)
         End If
      Next j
      CRCT(i) = CRC
   Next i
   
 
   ' CRC über den String "Daten$" berechnen.
   ' Werte von CRC-Highbyte ist dann in HB, CRC-Lowbyte ist dann in LB.
   CRC = 0
   For i = 1 To Len(Daten$)
      HB = Fix(CRC / 256)
      LB = CRC - (256 * HB)
      CRC = CRCT(LB Xor Asc(Mid$(Daten$, i, 1))) Xor HB
   Next i
   HB = Fix(CRC / 256)    ' CRC-High-Byte
   LB = CRC - (256 * HB)  ' CRC-Low-Byte

 


Dieses Beispiel wurde zur Verfügung gestellt von:
 
	Marco Bungalski GmbH
	Große Straße 117
	27283 Verden
	Telefon: 04231 - 3209999
	Fax:     04231 - 3209998
	www.bungalski.de

Ich kenne zwar die Funktion FIX() jetzt nicht, aber da das Endergebnis in eine LONG passen muss, denke ich bei uns ist das INT(CRC/2) ... ja genau, aber ich weiß nicht ob wir mit unserem einen Datentyp da mithalten können. Eventuell muss man auch BIN2L etc. bemühen.
Auf jeden Fall muss man immer wenn ein / vorkommt bei uns mit INT() die Zahl wieder auf Integer trimmen.

Wenn du nicht weiter kommst, melde dich nochmal, dann versuche ich eine DLL mit PowerBasic zu erstellen, die aus Xbase++ aufrufbar ist.
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15710
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 73 Mal
Danksagung erhalten: 38 Mal
Kontaktdaten:

Beitrag von brandelh »

Hi,

laut Anleitung
3.3 CRC-Berechnung
Die CRC-Prüfsumme wird nach CRC-XModem mit dem Polynom x16+ x15+ x10+ x3 gebildet.
Für die Prüfsummenberechnung werden alle Zeichen der APDU und das ETX verwendet (siehe Kapitel
Blockstruktur).
Für die CRC-Berechnung werden nicht verwendet:
€ das DLE der Anfangssequenz
€ STX
€ das DLE der Endesequenz (ETX geht in die Berechnung ein)
€ zur Codetransparenz in die Daten eingeführte zusätzliche DLEs
ist bei der CRC Berechnung lediglich das Polynom und die DATEN welche teilweise angereichert aber nicht berücksichtigt werden anders als bei einer Standardübertragung, also müsste das auch Funktionieren. Das VB Beispiel scheint gar keine Polynome zu nutzen, eventuell ist das schon älter ?
Gruß
Hubert
Benutzeravatar
urbi
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 142
Registriert: So, 26. Mär 2006 18:47
Wohnort: 76185 Karlsruhe
Kontaktdaten:

Beitrag von urbi »

Hallo Hubert,

Die Dokus weisen verschiedene Polynome aus, das richtige ist
aber wohl
nPolynom:= INT( 2^16 + 2^12 + 2^5 + 1 )
ergibt 69555 ist auch Default bei COM_CRT()

cpassw:="000000" // Auslieferzustand

csend := "10 02 06 00 06 "+cpassw+" 10 10 09 78 10 03 " Blank nur der Übersicht wegen werden nicht Gesendet
cpruef:= "06000600000010097803" sollte hex 43 A6 ergeben
geprüft soll lt. Doku nur der eingefärbte String wobei von 2.mal h10 nur einmal im Prüfstring sein muß

String csend:="10 02 06 00 06 00 00 00 10 10 09 78 10 03 43 A6" aus Cardterm.Log
csend:=CHARREM(" ",csend)
COM_SEND(port, HEXtoStr(csend) )

wird mit OK = h06 quitiert


wenns Funkt werd ich den code säubern und hier einstellen
urbi
Benutzeravatar
urbi
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 142
Registriert: So, 26. Mär 2006 18:47
Wohnort: 76185 Karlsruhe
Kontaktdaten:

Beitrag von urbi »

Habe Die Funktion mal in Xbase Codiert

Code: Alles auswählen

FUNCTION  CRCT(cstring)
LOCAL CRCT[256]           //  Codetabelle für CRC-16-Check
LOCAL CRC                 
LOCAL i 
LOCAL j 
LOCAl cTable:=""
LOCAL HB 
LOCAL LB 
local cr := CHR(13)+CHR(10)

   For i = 1 To 256
      CRC = i
      For j = 1 To 8
         If BAND(CRC,1) = 1 
            CRC = BXOR( INT(CRC / 2) , 33800 )
         Else
            CRC = INT(CRC / 2)
         End If
      Next j
      CRCT[i] = CRC
   Next i
/*
   FOR i=1 To 256
       ctable += STR(i,3)+" - "+STR(crct[i])+cr
   next i
   STRFILE(ctable,"C:\bintable.txt")      
*/ 
   // CRC über cString berechnen.
   // Werte von CRC-Highbyte ist dann in HB, CRC-Lowbyte ist dann in LB.
   CRC = 0
   For i = 1 To Len(cstring)
      HB = INT(CRC / 256)
      LB = CRC - (256 * HB)
      CRC = CRCT[ BXOR( BXOR(LB, Asc(SUBSTR(cstring, i, 1))) , HB ) ]
   Next i
   HB = INT(CRC / 256)    // CRC-High-Byte
   LB = CRC - (256 * HB)  // CRC-Low-Byte
   RETURN {LB,HB}
scheint auch so zu funktonieren, habe nur keine Funktion zur Umwandlung in HEX gefunden auch nicht in den Tools, gibt es die vielleicht garnicht
urbi
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16586
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 116 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Rainer,
urbi hat geschrieben:scheint auch so zu funktonieren, habe nur keine Funktion zur Umwandlung in HEX gefunden auch nicht in den Tools, gibt es die vielleicht garnicht
gibt es nicht.
Habe ich mir mal selber gemacht - nicht nur für Hex, sondern noch weitergehend - müsstest Du Dir also dann anpassen für Deine Belange:

Code: Alles auswählen

function int2code( nWert )
local cErg, nI, nJ, nL, nA, nZahl
local aMap := { { 10, "A" }, { 11, "B" }, { 12, "C" }, { 13, "D" }, { 14, "E" }, { 15, "F" },;
					{ 16, "G" }, { 17, "H" }, { 18, "I" }, { 19, "J" }, { 20, "K" }, { 21, "L" },;
					{ 22, "M" }, { 23, "N" }, { 24, "O" }, { 25, "P" }, { 26, "Q" }, { 27, "R" },;
					{ 28, "S" }, { 29, "T" }, { 30, "U" }, { 31, "V" }, { 32, "W" }, { 33, "X" },;
					{ 34, "Y" }, { 35, "Z" } }
nZahl := int( nWert )
if nZahl < 0
	cErg := "0"
elseif nZahl < 10
	cErg := str( nZahl, 1 )
elseif nZahl < 36
	cErg := aMap[ ascan( aMap, { |a| a[ 1 ] == nZahl } ), 2 ]
else
	cErg := ""
	nL := Min( 10, len( alltrim( str( nZahl ) ) ) )
	for nA := nL to 1 step - 1
		nI := 36^( nA - 1 )
		nJ := 0
		do while nZahl >= nI
			nZahl -= nI
			nJ++
		enddo
		if nJ < 10
			cErg += str( nJ, 1 )
		else
			cErg += aMap[ ascan( aMap, { |a| a[ 1 ] == nJ } ), 2 ]
		endif
	next
endif
return cErg

function code2int( cWert )
local nErg, nI, nJ, nL, nA, lF, nF
local aMap := { { 10, "A" }, { 11, "B" }, { 12, "C" }, { 13, "D" }, { 14, "E" }, { 15, "F" },;
					{ 16, "G" }, { 17, "H" }, { 18, "I" }, { 19, "J" }, { 20, "K" }, { 21, "L" },;
					{ 22, "M" }, { 23, "N" }, { 24, "O" }, { 25, "P" }, { 26, "Q" }, { 27, "R" },;
					{ 28, "S" }, { 29, "T" }, { 30, "U" }, { 31, "V" }, { 32, "W" }, { 33, "X" },;
					{ 34, "Y" }, { 35, "Z" } }
lF := .f.
if ( len( cWert ) == 1 ) .and. ( alltrim( str( val( cWert ) ) ) == cWert )
	nErg := val( cWert )
else
	nErg := 0
	nL := Min( 10, len( cWert ) )
	nL := len( cWert )
	for nA := 1 to nL
		nI := 36^( nL - nA )
		nJ := 0
		if alltrim( str( val( substr( cWert, nA, 1 ) ) ) ) == substr( cWert, nA, 1 )
			nJ := val( substr( cWert, nA, 1 ) )
		else
			nF := ascan( aMap, { |a| a[ 2 ] == upper( substr( cWert, nA, 1 ) ) } )
			if nF > 0
				nJ := aMap[ nF, 1 ]
			else
				lF := .t.
			endif
		endif
		nErg += ( nI * nJ )
	next
endif
if lF
	nErg := 0
endif
return int( nErg )
Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
urbi
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 142
Registriert: So, 26. Mär 2006 18:47
Wohnort: 76185 Karlsruhe
Kontaktdaten:

Beitrag von urbi »

Hallo Martin,
danke für die Anregung, habs auch gleich umgesetzt,
da ich nur 1 Byte umsetze sieht das jetzt so aus.

Code: Alles auswählen

FUNCTION Byte2Hex(num)
LOCAL HEX_ARR:= {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}
LOCAL c1:="0"
LOCAL c2:="0"
LOCAL nrest:=0
IF num > 0 .and. num < 256
   IF num > 16
      nrest := INT (num % 16)
      c1:= HEX_ARR[ (INT( num - nrest ) / 16) +1 ]
      IF nrest > 0
         c2:= HEX_ARR[ nrest +1 ] 
      ENDIF
  ELSE
    c2:= HEX_ARR[ num ] 
  ENDIF
ENDIF
RETURN c1+c2
viele Grüsse
Rainer
urbi
Volker
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 26
Registriert: Sa, 29. Okt 2005 13:57
Wohnort: Hof
Hat sich bedankt: 14 Mal
Kontaktdaten:

Re: ZVT700 Protokoll und CRC Prüfsumme

Beitrag von Volker »

Hallo Martin,
hallo Urbi,

hat Eure CRC-Berechnung im Zusammenhang mit dem ZVT-Protokoll funktioniert?
Ich bin gerade an der Umsetzung des ZVT-Protokolls und komm absolut nicht auf die
Beispiel-Prüfsumme bei meiner Berechnung.

Das Polynom ist laut meiner ZVT-Doku x16 + x 15 + x10 + x3

Ich bin schon ein paar Tage über der CRC-Berechnung und dreh mich langsam im Kreis

Volker
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16586
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 116 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: ZVT700 Protokoll und CRC Prüfsumme

Beitrag von Martin Altmann »

Hallo Volker,
sorry - ich mache keinerlei CRC-Prüfung und auch nichts im Zusammenhang mit ZVT-Protokoll.
Ich habe nur eine fortlaufende Nummer generiert, die ich entsprechend in Buchstaben und Ziffern "umkodiere".

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21248
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 211 Mal
Danksagung erhalten: 71 Mal

Re: ZVT700 Protokoll und CRC Prüfsumme

Beitrag von Manfred »

Hi,

ist zwar schon asbachuralt der Thread, aber in den ToolsIII sind unter verschiedene Netzwerkfunktionen Kapitel 30 ein paar Funktionen, die mit HEX rechnen. Ich weiß jetzt nicht, ob das gemeint war/ist, aber ich bin da gestern drauf gestossen (worden). Wenn es nicht zum Thema passen sollte, dann könnt ihr das ja geflissentlich überlesen, was ich geschrieben habe. ;-)
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Antworten