blutiger anfänger in python sucht hilfe :)

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

sape hat geschrieben:Dan wünsche ich dir viel glück :) Halte uns auf den Laufenden. Würde gerne dein fazit zu Python und wxPython in dem Kontext wissen. obwohl ich schon die Antwort kenne ;) :)
Hi sape!

Es ist so weit. Das Programm wurde von der FDI (diese Firma ist dafür zuständig) kontrolliert und lizensiert. 8)

Und hier mein Erfahrungsbericht:

Es ging um eine Schnittstelle zwischen meinem Kassensystem (programmiert in Visual Basic 6) und den in Österreich üblichen Bankomatkassen-Terminals.

Bild

Eigentlich sollte die Abnahme schon am 18.1. erfolgen, aber diesen Termin musste ich verschieben, denn es war doch mehr Arbeit, als ich mir zuerst gedacht habe. Der Abnahmetermin wurde auf 5.2. verschoben. Diese zusätzliche Zeit brauchte ich auf jeden Fall.

Da ich am Visual Basic 6 Programm nicht viel ändern wollte und die Schnittstelle auch später mit anderen Programmen einsetzen will, lag es auf der Hand, Python und wxPython für die Programmierung der Schnittstelle heran zu ziehen.

Es gibt von der Firma FDI ein Kommandozeilenprogramm, welches direkt mit dem Bankomatkassen-Terminal kommuniziert. Ich brauchte mich also nicht mehr um die Low-Level-Programmierung zu kümmern. Man muss nur das Kommandozeilenprogramm (HKA.exe) starten, ein paar Sekunden warten, bis es mit der Bankomatkasse eine Verbindung aufgebaut hat und schon kann es los gehen. Das Programm HKA.exe muss im Hintergrund laufen und sich um Journaling usw. kümmern. Die Kommunikation mit der HKA.exe passiert über XML-Dateien. Schreibt man eine XML-Datei in einen bestimmten Ordner, dann arbeitet das Programm HKA.exe die XML-Datei ab und gibt eine oder mehrere XML-Dateien in einen anderen Ordner zurück. In den XML-Dateien steht dann, ob die Transaktionen erfolgreich waren oder nicht. (Es ist natürlich etwas komplizierter, aber in etwa stimmt es so.)

Ich entschloss mich für eine Client-Server-Lösung. Der BKS-Server (= Bankomatkassen Schnittstelle Server) soll quasi unsichtbar im Hintergrund laufen und direkt mit der HKA.exe kommunizieren. Und der BKS-Client (= Bankomatkassen Schnittstelle Client) ist ein GUI-Programm (wxPython), das vom Handelskassenprogramm aus aufgerufen wird. Der BKS-Client und der BKS-Server kommunizieren per XMLRPC. Dadurch kann die Bankomatkasse an einem anderen Computer angeschlossen sein. Mehrere Clients können mit einem Server arbeiten. Ich habe nur unterbunden, dass die Clients gleichzeitig mit dem Server arbeiten. Alles muss schön hintereinander abgearbeitet werden, sonst kommt das Bankomatkassen-Terminal und die HKA.exe durcheinander.

Da Meldungen vom Bankomatkassen-Terminal auch während einer laufenden Transaktion auftreten können und sofort auf dem Bildschirm angezeigt werden müssen, musste ich auch vom BKS-Server eine XMLRPC-Verbindung zum BKS-Client aufbauen. Im Hintergrund musste ich deshalb auch recht viel mit Threads arbeiten, damit keine Anzeige oder kein "Arbeitsschritt" blockiert.

Da XML mit Visual Basic 6 nicht gerade der Hammer ist, habe ich mich dafür entschieden, den BKS-Client per Kommandozeilenparameter und per INI-Datei(en) steuerbar zu machen. Man kann die Einstellungen UND die Arbeitsanweisungen über INI-Datei(en) (In VB per Windows-API; GetPrivateProfileString, WritePrivateProfileString) an den BKS-Client übergeben. Der BKS-Client reicht die Anfragen weiter und bekommt vom BKS-Server die Antworten zurück. Die wichtigen Werte und auch die Texte, die auf den Handelskassen-Bon zu drucken sind, werden entweder nach STDOUT (im INI-Format) oder in eine vordefinierte INI-Datei geschrieben. Diese kann das Handelskassenprogramm wieder auslesen und erfährt somit, ob die Transaktion erfolgreich war und was auf den Bon zu drucken ist.

Handelskassenprogram --> INI-Datei --> BKS-Client --> XMLRPC --> BKS-Server --> HKA.exe --> Bankomatkassen-Terminal

Bankomatkassen-Terminal --> HKA.exe --> BKS-Server --> XMLRPC --> BKS-Client --> INI-Datei --> Handelskassenprogramm

Auf diese Weise habe ich die Transaktionen "Payment", "Payment with Authorisation Number", "Manual Data Entry on Request", "Refund", "Reversal", "Slip Reprint", "Protocol Status Query" und "End of Day" umgesetzt.

Die Fehlerbehandlung passiert im BKS-Client und teilweise im BKS-Server. Die Handelskasse muss nur eine INI-Datei generieren, den BKS-Client aufrufen, ein paar Kommandozeilenparameter übergeben und warten, bis das Programm BKS-Client mit der Arbeit fertig ist. Danach muss nur die Ergebnis-INI-Datei geparst werden und schon kann die Handelskasse weiter arbeiten. Die Anpassungen der Handelskasse waren sehr gering. :D

Ich habe bis zuletzt an dem Tool gearbeitet und bin ziemlich nervös zur Abnahme des Programms in die FDI gefahren (Montag 5.2.2007). Dort haben wir -- unser Technischer Leiter der mich mit gefilterten Informationen und Dokumentationen versorgt hat und ich -- einen Kassencomputer mit Drucker aufgebaut. Dort wurde ein Computer über die Serielle Schnittstelle angeschlossen. Dieser Computer simulierte eine Bankomatkasse und hat die BKS-Schnittstelle mit möglichen und unmöglichen Reaktionen und Journalsätzen beschossen. Danach wurde mit echten Bankomatkassen-Terminals getestet.

Während dieser Tests musste ich noch ein paar Kleinigkeiten ausbessern, was aber dank Python nicht wirklich ein Problem darstellte. :twisted: :twisted:
Ich musste nur eine zusätzliche Warnmeldung einbauen, einen Fehlertext ändern, statt "MAESTRO" musste ich "Maestro" auf einen Kreditkarten-Bon schreiben. Dann hatte ich noch einen kleinen Programmierfehler entdeckt und ausgebessert. Aber, wie schon geschrieben, das war alles kein Problem, da ich die Änderungen direkt vor Ort durchführen konnte und diese sofort wieder getestet wurden.

Das ist das Changelog. Wie man sieht, musste nicht viel geändert werden. 8)

Code: Alles auswählen

 	18	- Die Fehlermeldung "RUFE" hinzugefügt.
 	19
 	20	- Bei "End of Day" kein Wiederholen möglich
 	21	 
 	22	- Wenn record.remaining_transactions unter 10 dann Warnung ausgeben 
 	23	 
 	24	- "XML Error" durch "KEIN ERGEBNIS" ersetzt 
 	25	 
 	26	- MAESTRO gegen Maestro getauscht
Alles in Allem, war die Zertifizierung nach einem halben Tag durch. -- Die schnellste, erfolgreiche Abnahme einer Bankomatkassen-Schnittstelle durch FDI. :-) Und warum? Weil Python und wxPython einfach unschlagbar sind! :mrgreen:

Hier habe ich noch ein paar Bilder der Schnittstelle.

http://gerold.bcom.at/bilder/bksserver_debugmode.gif
http://gerold.bcom.at/bilder/bksclient_menu.gif
http://gerold.bcom.at/bilder/bksclient_payment.gif
http://gerold.bcom.at/bilder/bksclient_ ... credit.gif
http://gerold.bcom.at/bilder/bksclient_reversal.gif

Mein Fazit: Python und wxPython sind sehr gut für solche Anwendungen geeignet. :P

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

Hi Gerold!

Es freut mich das alles geklappt hat und vielen Dank für dein Feedback und deine Ausführliche Erklärung, wodurch man eine Vorstellung bekommt was du da genau gemacht hast :) -- Die Realisierung ist sehr spannend, interessant und Wahnsinn das man sowas in so kurzer Zeit realisieren kann.

lg
Benutzeravatar
nkoehring
User
Beiträge: 543
Registriert: Mittwoch 7. Februar 2007, 17:37
Wohnort: naehe Halle/Saale
Kontaktdaten:

Hi und hallo... ich hab gerade super gute Laune und weiß nicht wieso... also wenn ich ueberschwenglich formuliere, einfach drueber weg sehen... danke :)

@err0r: Das mit dem Ueberpruefen, welches System da laeuft, laesst sich meiner Meinung nach schoener mit os.name realisieren.

Denn dein Programm wird (wenn du auf auf linux* oder win* pruefst) nicht unter *BSD laufen, was aber genauso cabextract nutzen sollte, wie es bei alles *nixen (ehem... Unix-Derivaten) meist der Fall ist.

Pruefst du nur auf win* oder nicht win*, hast du das Problem, dass dein Programm unter Systemen laeuft, bei denen es doch wieder anders sein koennte.

Laut Doc sollte os.name entweder 'posix', 'nt', 'os2', 'mac', 'ce' oder 'riscos' sein. Damit kannst du also sowas machen wie:

Code: Alles auswählen

import os

# All das sollte natuerlich in Funktionen und/oder Klassen gebunden sein:

if os.name in ("posix", "mac"):
# [...] dein Code fuer cabextract

elif os.name == "nt":
# [...] dein Code fuer windoze... Hierbei stellt sich uebrigens die Frage, ob
# man "ce" einbeziehen sollte, aber ich weiß weder ob damit auch wirklich
# WinCE gemeint ist, noch ob das mit dem Extrahieren dort genauso funktioniert
#[b]EDIT:[/b] außerdem waere interessant, was os.name zu nicht-NT-Windozen sagt... also zB zu Win95/98.

else:
# ja nun sei es an dir, eine passende Exception (mit raise Exception) zu
# werfen oder einfach eine passende Fehlerausgabe zu machen
# (zB: print "Sorry, the OS-Class %s currently not supported :(" %os.name

Des weiteren Empfehle ich fuer Pfadsachen os.sep zu verwenden, falls du ihn selber generierst. Das nur als kleine Anmerkung, da du in diesem Projekt ja eigentlich keine eigenen Dateipfade generierst.
Allgemein koennte die Hilfe zum os-Modul (help("os")) sehr interessant fuer dich sein.
Zuletzt geändert von nkoehring am Donnerstag 8. Februar 2007, 09:33, insgesamt 1-mal geändert.
[url=http://www.python-forum.de/post-86552.html]~ Wahnsinn ist auch nur eine andere Form der Intelligenz ~[/url]
hackerkey://v4sw6CYUShw5pr7Uck3ma3/4u7LNw2/3TXGm5l6+GSOarch/i2e6+t2b9GOen7g5RAPa2XsMr2
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

nkoehring hat geschrieben:[...]
@sape: Das mit dem Ueberpruefen, welches System da laeuft, laesst sich meiner Meinung nach schoener mit os.name realisieren.
[...]
Ehm *hust*.Du verwechselst mit einen anderen aus den Thread. So, etwas, und das folgende von dir, habe ich nicht geschrieben. ;)

http://www.python-forum.de/post-53710.html#53710
Benutzeravatar
nkoehring
User
Beiträge: 543
Registriert: Mittwoch 7. Februar 2007, 17:37
Wohnort: naehe Halle/Saale
Kontaktdaten:

sape hat geschrieben:
nkoehring hat geschrieben:[...]
@sape: Das mit dem Ueberpruefen, welches System da laeuft, laesst sich meiner Meinung nach schoener mit os.name realisieren.
[...]
Ehm *hust*.Du verwechselst mit einen anderen aus den Thread. So, etwas, und das folgende von dir, habe ich nicht geschrieben. ;)

http://www.python-forum.de/post-53710.html#53710
EDIT: oops... ich meinte err0r, nicht sape... sorry ^^ habs gleich verbessert...
[url=http://www.python-forum.de/post-86552.html]~ Wahnsinn ist auch nur eine andere Form der Intelligenz ~[/url]
hackerkey://v4sw6CYUShw5pr7Uck3ma3/4u7LNw2/3TXGm5l6+GSOarch/i2e6+t2b9GOen7g5RAPa2XsMr2
Antworten