Nachdem wir gesehen haben, wie eingehende Anrufe behandelt werden, folgt nun eine sehr kurze Einführung, wie ausgehende Anrufe mit Hilfe des Idle-Skripts initiiert werden.
Wie bereits erwähnt, wird das Idle-Skript in regelmäßigen Abständen von CapiSuite aufgerufen, um irgendwo nach gespeicherten Aufträgen zu suchen und diese dann zu verschicken.
Das hier vorgestellte Beispiel sucht nach einer Datei job-XXXX.sff im Beispiel-Verzeichnis, das wir im letzten Abschnitt erzeugt haben. Diese Datei wird an das durch XXXX angegebene Ziel gefaxt. Wenn Sie kein gültiges Ziel haben, an das Sie zum Testen Faxe schicken können, warum nehmen Sie nicht einfach CapiSuite als Absender und Emfänger gleichzeitig? Ersetzten Sie in diesem Fall XXXX durch die Nummer, die Ihr Incoming-Skript behandelt. Dies funktioniert nich, wenn Ihre ISDN-Karte nicht zwei Fax-übertragungen parallel durchführen kann (einige alte AVM-B1-Karten haben z.B. diese Beschränkung).
Wir brauchen jetzt für unsere Tests ein oder mehrere Fax-Dateien im SFF-Format. Erzeugen Sie bitte welche mit einem Namen wie der oben gezeigte. Wenn Sie nicht wissen, wie Sie dies tun sollen, schauen Sie bitte unter dem „Erzeugen eines SFF“ nach.
Wenn ich ein CapiSuite-Skript entwicklen möchte, aber nicht sicher bin, wie es geht, fange ich oft mit einem normalen Skript an, das ich ohne CapiSuite testen kann. Lassen Sie uns also zuerst ein Skript erstellen, das die Dateien durchsucht und die Empfängernummern extrahiert. Wenn das funktioniert, können wir weiter machen und die CapiSuite-spezifischen Aufrufe einfügen.
Beispiel 2.5. idle_example.py
import os,remy_path="/path/to/your/capisuite-examples/" files=os.listdir(my_path)
files=filter (lambda s: re.match("job-.*\.sff",s),files)
for job in files:
destination=job[4:-3]
# Hmmm.. Ist das richtig? print "found",job,"to destination",destination
Speichern Sie das Skript jetzt als idle_example.py in unserem Beispielverzeichnis und lassen Sie es laufen, indem Sie python idle_example.py aufrufen.
Wenn Sie SFF-Dateien mit den richtigen Namen angelegt haben, sollten Sie nun Zeile für Zeile angezeigt werden. Aber... Offensichtlich funktioniert irgendetwas hier nicht richtig. Das Ziel enthält den ".". Ich habe tatsächlich einen Fehler beim indizieren des Strings gemacht. Es sollte destination=job[4:-4] anstatt [4:-3] heißen. ändern wir das also und probieren es nochmal. Es sollte jetzt funktionieren. Das ist der Grund, warum ich solche Skripte lieber zuerst außerhalb von CapiSuite schreibe. Das Debuggen geht so viel schneller...
Da wir jetzt wissen, dass die grundlegenden Teile funktionieren, können wir die richtigen Kommunikationsfunktionen hinzufügen.
Speichern Sie dieses Beispiel bitte wieder als idle_example.py in Ihrem Beispielverzeichnis.
Beispiel 2.6. idle_example.py, Version für CapiSuite
import os,re,capisuite my_path="/path/to/your/capisuite-examples/" my_number="678"my_stationID="+49 123 45678" my_headline="example headline" def idle(capi):
files=os.listdir(my_path) files=filter (lambda s: re.match("job-.*\.sff",s),files) for job in files: destination=job[4:-4] capisuite.log("sending "+job+" to destination "+destination,1)
try: (call,result)=capisuite.call_faxG3(capi,1,my_number,destination, 60,my_stationID,my_headline)
if (result!=0):
capisuite.log("job "+job+" failed at call setup with reason " +str(hex(result)),1) os.rename(my_path+job,my_path+"failed-"+job)
return
capisuite.fax_send(call,my_path+job)
(result,resultB3)=capisuite.disconnect(call)
except capisuite.CallGoneError: (result,resultB3)=capisuite.disconnect(call) if (result in (0,0x3400,0x3480,0x3490) and resultB3==0):
capisuite.log("job "+job+" was successful",1) os.rename(my_path+job,my_path+"done-"+job) return else: capisuite.log("job "+job+" failed during send with reasons " +str(hex(result))+","+str(hex(resultB3)),1) os.rename(my_path+job,my_path+"failed-"+job)
![]() | Einige Parameter für das Senden des Faxes werden hier gesetzt. my_number ist Ihre eigene Nummer, die zum Senden des Faxes verwendet wird. my_stationID ist die Fax-Gerätekennung, die an die Gegenstelle übermittelt und auf der gesendeten Fax-Seite angezeigt wird. Es sind nur Ziffern und das "+" erlaubt. Sie können außerdem in fax_headline einen kurzen Text definieren, der in der Fax-Kopfzeile angezeigt wird. |
![]() | Wie im „Das Idle-Skript“ erklärt, müssen Sie eine Funktion namens idle definieren, die dann in regelmäßigen Abständen von CapiSuite ausgeführt wird. Deshalb wurde aller Code in diese Funktion verschoben. |
![]() | Wir können keine Meldungen nach stdout ausgeben, da das Skript im Kontext eines Daemons läuft. Deshalb stellt CapiSuite Funktionen bereit, um Einträge in den CapiSuite-Log-Dateien zu erzeugen. log erwartet mindestens zwei Parameter: die Meldung und einen Log-Level. Dieser Level entspricht der Log-Level-Einstellung in der globalen CapiSuite-Konfiguration (siehe „Konfiguration von CapiSuite“). Wenn der Level der Meldung kleiner oder gleich verglichen mit dem Level in der Konfiguration ist, wird sie in die Logs geschrieben. Sie können also Meldungen zu Debug-Zwecken einfügen, die im Normalbetrieb nicht in die Logs geschrieben werden, indem Sie Level größer als 1 verwenden. |
![]() | Diese Funktion initiiert einen ausgehenden Anruf, bei dem der Fax-Service verwendet wird. Die Parameter sind:
Die Funktion gibt ein Tuple zurück, das eine Referenz auf den erzeugten Anruf und einen Fehler-Code enthält. |
![]() | Dieser Block prüft, ob der Verbindungsaufbau erfolgreich war. Eine detaillierte Beschreibung der möglichen Fehler-Codes finden Sie im „CapiSuite-Befehlsreferenz“. 0 bedeutet "alles war OK, die Verbindung wurde aufgebaut". |
![]() | Wenn der Anruf nicht erfolgreich war, wird die Fax-Datei umbenannt, um zu verhinden, dass die selbe Datei immer wieder verschickt wird. |
![]() | Vergessen Sie nicht, die idle-Funktion zu verlassen, wenn die Verbindung nicht aufgebaut werden konnte! |
![]() | Ein weiteres sehr einfaches CapiSuite-Kommando: verschickt die gegebene Datei als Fax-Dokument. |
![]() | Wir haben bislang die Gründe, warum eine Verbindung beendet wurde, ignoriert. Jetzt müssen wir sie analysieren, weil wir wissen müssen, ob die Datei erfolgreich übertragen wurde. Deshalb gibt disconnect ein Tuple zurück, das den physikalischen und logischen Fehler-Code enthält. Jede ISDN-Verbindung enthält eine physikalische und (mindestens) eine logische Verbindung. Man kann sich die physikalische Verbindung als "den Draht" vorstellen, der uns mit dem Empfänger verbindet, während sich die logische Verbindung auf das Fax-Protokoll bezieht, das diesen "Draht" verwendet. Sie müssen sich beide Werte ansehen, um entscheiden zu können, ob alles OK war. |
![]() | Erlaubte Werte für den physikalischen Verbindungsabbau sind 0,0x3400,0x3480 und 0x3490. Diese bedeuten alle "kein Fehler aufgetreten, Verbindung wurde normal beendet". Der logische Wert darf nur 0 sein, wenn alles OK ist. Weitere Informationen zu den Fehler-Codes finden Sie im „CapiSuite-Befehlsreferenz“. |
Nachdem Sie die Datei gespeichert und die Standard-Werte an Ihre eigene Konfiguration angepasst haben, ändern Sie bitte den Wert von idle_script in der CapiSuite-Konfiguration, damit er auf dieses Skript verweist (wie im „Konfiguration von CapiSuite“ beschrieben).
Starten Sie CapiSuite neu und beobachten Sie die Logs. Einige Minuten später sollten die Dateien job-XXX.sff verschickt worden und entweder in done-job-XXX.sff oder failed-job-XXX.sff umbenannt worden sein. Wenn der Auftrag fehlgeschlagen ist, schauen Sie bitte in das Error-Log und prüfen die Fehler-Codes, die im „CapiSuite-Befehlsreferenz“ und Anhang B. CAPI 2.0 Fehler-Codes beschrieben sind.
Hoffentlich hat Ihnen dieses Tutorial geholfen zu verstehen, wie Sie Ihre eigenen Skripte schreiben können. Machen Sie bitte weiter, indem Sie die Beispiele oder die Dateien, die mit CapiSuite geliefert werden, modifizieren (lesen Sie den „Struktureller überblick über die Standard-Skripte“ zuvor). Sie finden eine komplette Referenz der verfügbaren Kommandos im „CapiSuite-Befehlsreferenz“.
Wenn Sie Schwierigkeiten haben, Ihre eigenen Skripte zum Laufen zu bringe, nutzen Sie bitte die CapiSuite-Mailingliste. Und vergessen Sie nicht, Spaß dabei zu haben. ;-)