Hallo GSchlag,
dies ist eine der Schwachstellen der aktuellen Firmware, s.a. unser Ticket
https://support.gastro-mis.de/support/tickets/18937
Es gibt leider keine Möglichkeit, die ClientID's der offenen Transaktionen auszulesen, d.h. wenn man diese nicht selbst mitprotokolliert, steht man im Regen. Hier hilft es nur, entweder jede ClientID, die mal auf der TSE gearbeitet hat (so man sie hoffentlich protokolliert hat!), zu probieren oder eben gleich ein eigenes Log über alle Transaktionen zu führen.
Mehr darüber können Sie bei Interesse auf meiner neuen Seite https://www.tse-easy.de lesen.Viele Grüße
U. Kleinert
Hallo Herr Kleinert,
zum Glück führen wir in der Software ein eigenes Log zu den Transaktionen mit.
Darüber konnte ich das Problem erfolgreich lösen.
Herzliche Grüße
Geritt Schlag
ja, das problem hatte ich auch.
inzwischen kann ich über die Transaktionsnummer den Start Sector für die transanktionsnummer auslesen, in der ja der Client steht.
beispiel
sector: 246->24.01.2020 13:20:59
556E6978745F313537393837323035395F5369672D3132305F4C6F672D5472615F4E6F2D355F53746172745F436C69656E742D4B6F726F6E69782E6C6F670000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000303030303030303033373400313336313235363734373300303136333535002030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007573746172003030000000000000000000000000000000000000000000000000000000000000000000000000
Unixt_1579872059_Sig-120_Log-Tra_No-5_Start_Client-Koronix.log0000000037413612567473016355 0ustar00
*******************
also sectoren lesen - Tra_No-5_start_client suchen - dahinter steht der Client . . .
damit brauche ich nicht eine extra aufzeichnung . . . . .
Grüsse
Günter Schäfer
Hallo Herr Schäfer,
das klingt irgendwie vielversprechend, aber ich verstehe es noch nicht. Vielleicht stehe ich hier gerade auf dem Schlauch?
Aber selbst wenn man die Sektorennummer hat, kann man über das SDK ja
den Sektor in der TSE nicht direkt lesen, sondern muß einen
inkrementellen oder kompletten Tar-Export machen, was bei bis zu 7 GB
Daten in keinem Fall Freude macht.
******
Transaction 1 / Signatur 27 / Sektor 12
Transaction 161 / Signatur 187 / Sektor 332
******
U. Kleinert
die ausgabe über tarexport geht natürlich nicht, da die transaktion nicht abgeschlossen ist, zudem mühsam.
aber natürlich können sie die tse auslesen wie eine Festplatte mit einer sector leseroutine
sector von 0 an, 512 Byte, darin ist dann lesbar wie oben bechrieben.
stringsuche nach transaktionsnummer die nicht abgeschlossen ist
die bekommen sie unter - zeige offene Transaktionen
und nachdem sie ja in etwa wissen wo sie suchen können sie ja bei sector 1000 oder so anfangen
aber auch 10 000 sectoren sind sehr schnell gelesen, keine Sekunde
hier ein beispiel der sector lesefunktion, habe sie für mich etwas abgeändert
ein sector 512 Byte,
Private Function DirectReadDriveNT(sDrive As String, iStartSec As Long, ByVal iOffset As Long, ByRef lpBuffer() As Byte, ByVal cBytes As Long) As Long
Dim hDevice As Long
Dim abBuff() As Byte
Dim nSectors As Integer
'sDrive = stick & "\tse_comm.dat"
nSectors = Int((iOffset + cBytes - 1) / BytesPerSector) + 1
Rem hDevice = CreateFile("\\.\" & UCase(Left(sDrive, 1)) & ":", GENERIC_READ Or GENERIC_WRITE, FILE_SHARE_READ Or FILE_SHARE_WRITE, 0&, OPEN_EXISTING, 0&, 0&)
Rem 4-11-2008 Physical disk read/write modification
hDevice = CreateFile("\\.\" & sDrive, GENERIC_READ Or GENERIC_WRITE, FILE_SHARE_READ Or FILE_SHARE_WRITE, 0&, OPEN_EXISTING, &H20000000, 0&)
If hDevice = INVALID_HANDLE_VALUE Then Exit Function
Call SetFilePointer(hDevice, iStartSec * BytesPerSector, 0, FILE_BEGIN)
ReDim lpBuffer(cBytes - 1)
ReDim abBuff(nSectors * BytesPerSector - 1)
Call ReadFile(hDevice, abBuff(0), UBound(abBuff) + 1, cBytes, 0&)
CloseHandle hDevice
CopyMemory lpBuffer(0), abBuff(iOffset), cBytes
DirectReadDriveNT = cBytes
End Function
*********** und hier das ergebnis jeweils 4 Einträge wenn die Transaktion abgeschlossen ist
sector: 6228->02.12.2020 16:10:46
556E6978745F313630363932353434365F5369672D333131315F4C6F672D5472615F4E6F2D3735395F53746172745F436C69656E742D4B6F726F6E69782E6C6F670000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000303030303030303033333600313337363137333632303600303136363031002030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007573746172003030000000000000000000000000000000000000000000000000000000000000000000000000
Unixt_1606925446_Sig-3111_Log-Tra_No-759_Start_Client-Koronix.log0000000033613761736206016601 0ustar00
*******************
Hallo Herr Schäfer,
zuerst einmal Congratulations für Ihr Programm. So wie ich das sehe, haben Sie das SDK durchschaut...
Jetzt verstehe ich auch, was Sie meinen. Klar, wenn Sie die TSE nativ lesen, können Sie natürlich die SDK-Funktionen umgehen und die Daten der Sektoren (wie eine Festplatte) lesen. Haben Sie die Inhalte der Sektoren durch reverse engineering ermittelt oder haben sie auch eine Visualisierung der TLV-Records in den Sektoren gemacht?
So wie es aussieht, belegt jede Signatur jeweils zwei komplette Sektoren mit 512 Byte, obwohl sie i.d.R. deutlich kleiner ist (z.B. UpdateTime 199 Byte, start_transaction 210 Byte). Deshalb wohl auch 4 Sektoren pro Transaktion (2 Signaturen * 2 Sektoren = 4 Sektoren). Ich habe mir bisher noch nicht die Mühe gemacht, die TSE nativ zu lesen, sondern immer die Log-Messages bzw. das komplette Tar exportiert. Aber vielleicht sollte ich mir doch mal die Daten genauer ansehen...
Noch etwas: bei Sector 6229 steht bei start_transaction ein "Kassenbeleg-V1". Normal darf doch dort eigentlich laut Vorgabe kein Inhalt stehen (erst bei finish_transaction), oder?
ich habe lange die Daten ausgewertet die ich aus der TSE gelesen habe, Byte für Byte
sector: 2198->10.03.2020 12:26:43
556E6978745F313538333834333230335F5369672D313039365F4C6F672D5472615F4E6F2D3331385F53746172745F436C69656E742D4B6F726F6E69782E6C6F670000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000303030303030303033333600313336333137303336303300303136353633002030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007573746172003030000000000000000000000000000000000000000000000000000000000000000000000000
Unixt_1583843203_Sig-1096_Log-Tra_No-318_Start_Client-Koronix.log0000000033613631703603016563 0ustar00
*******************
hier ganz eindeutig der zusammenhang zwischen transaktionsnummer und client!
sie brauchen eigentlich nur ein paar bytes zu lesen um diese info zu bekommen . . .
es sind Bytes, also Bytes -> String
30 8201 11 020102060904007F0007030701018011
Finish Transaktion - 46696E6973685472616E73616374696F6E
Client - 8105 4130303032
8237 Beleg ....
42656C65675E3331382E30355F302E
30305F302E30305F302E30305F302E
30305E3130302E303A4261725F3231
382E30353A556E626172
830E Kassenbeleg 4B617373656E62656C65672D5631
850201E6 0420
seriennummer-F71C8F3F42C0A74B7BCF341FC012E0A61D500B18AE7D6E5A4580F8927473124B
300C060A04007F00070101040104020206B502045F7395EA0460
signatur-50C3F19A8066C978DD7C9584FAE083AA5375C9C18E29BC92C56C2980072658E2CA95EA699B81CB8CF4D677D65EE7C9CD061DE926BBCF355176796AB46AD051CCCBC60CD828F971F1F222C4E0123E005E57C0AC4ED299B54C6863E5CF7FFC1A60 000000000000000000000000000000000000000000000000
zu den offenen Transaktionsnummern :
sie brauchen den cleinten um die offene transaktion zu schliessen
eigentlich sollten sie alle clienten kennen!
mit client angemeldet
dann reicht TSE befehl zeige offene clienten
sollte client nicht bekannt sein dann liste der offenen transaktionen mit client erstelle
auch wenn sie auf sektor 0 anfangen zu lesen
Start transaktion (text) suchen
eintragen als offen mit client - steht als klartext im String
liste mit allen offenen erstellen
Finish Transaktion (text) suchen
transaktionsnummer schließen
übrig bleiben offenen nummern mit Client!
dauert nur wenig Zeit wenn sie direkt vom Stick lesen . . .
Noch etwas: bei Sector 6229 steht bei start_transaction ein "Kassenbeleg-V1". Normal darf doch dort eigentlich laut Vorgabe kein Inhalt stehen (erst bei finish_transaction), oder?
ja, eigentlich . .
hat aber keinen einfluss auf das Ergebnis
nur die länge Payload darf (bei start transaktion) nicht vorhanden sein!
Den Tar Export mache ich auch auf diese Art, wesentlich schneller natürlich auch bessere selektionsmöglichkeiten . .
Grüsse
Günter
habe mich mal kurz ein kleines Programm für die offenen Transaktionen gebaut.
nochmals überarbeitet
Sectoren lesen
alle starts mit sectornummer
Fehlerliste anzeigen
TSE Selbsttest ausführen, ist notwendig damit sectoren gelesen werden können
GSchlag
Über worm_transaction_listStartedTransactions kann ich die Nummern der verwaisten Transaktionen ermitteln.
Abschließen kann ich diese Transaktionen nur, wenn ich die korrekte ClientID dafür verwende. Derselbe Client muss die zu TransactionNumber gehörende Transaktion geöffnet haben, andernfalls wird das Finish abgelehnt.
Woher bekomme ich die passende ClientID aus der TSE, wenn mehrere Clients darauf arbeiten?
Bleibt mir nur die Möglichkeit, die Funktion worm_transaction_listStartedTransactions für jeden bekannten Client einzeln auszuführen oder geht es auch einfacher?