[Gelöst] Faxe empfangen mit capicommand(receivefax)

Ralph*

Mitglied
Mitglied seit
7 Mrz 2006
Beiträge
369
Punkte für Reaktionen
2
Punkte
18
Nachdem die in meiner Signatur beschriebene Konfiguration zum Faxempfang bei umfangreichen Faxen (mehr als 3-4 Seiten) leider nicht störungsfrei funktioniert und ich mittelfristig den Faxserver unter Netware + Tobit David ausmustern will, suche ich jetzt Informationen zum Thema capicommand(receivefax).

Ich möchte zunächst nur den Empfang von Faxen direkt im Asterisk realisieren:

Die 2 Eicon Diva Server an den NTBAs empfangen die eingehenden Faxe mittels capicommand und legen eine SFF-Datei an:

Code:
exten => 1234567,1,capicommand(receivefax|/var/spool/asterisk/fax/${UNIQUEID})
exten => 1234567,2,Hangup()

Das funktioniert auch - zumindest höre ich die Faxkennung, wenn ich die Nummer 1234567 anrufe...

Jetzt möchte ich diese Datei logischerweise gerne in ein bekömmliches Dateiformat (BMP, TIFF, PDF... eins von den Dreien wäre toll) verwandeln lassen und dann per Mail an den Empfänger verschicken.

(Der Empfänger ergibt sich dabei aus der Zielrufnummer (Faxdurchwahl), den kann ich also im Dialplan angeben.)

Ich benötige also einen Dateikonverter (vermutlich sfftobmp?) und ein Script, das den Versand übernimmt. Und jetzt weiß ich leider nicht mehr weiter :(

Schön wäre auch, wenn die Informationen über Absender, Seitenzahl usw. (die von chan-capi kommen) ausgewertet und in der Mail aufgeführt werden könnten. Gibt es da bereits etwas, das ich nutzen könnte?

Vielen Dank für jede Hilfe!

Ralph
 
Zuletzt bearbeitet:
Mittlerweile habe ich das Script von http://wiki.ip-phone-forum.de/software:asterisk:ein_fax_mit_astersik_entgegennehmen
so einfach wie möglich gestaltet und in /var/lib/asterisk/scripts als fax2mail abgelegt:
Code:
#! /bin/sh
#
# $1 FAXFILE
# $2 FAXID
# $3 FAXPAGES
# $4 RECIPIENT
#
# Verschickt ein Fax per Mail

echo Faxfile $1 von $2 mit $3 Seiten empfangen >> /var/log/fax2mail.log

MAILBODY=$1.txt

echo >> $MAILBODY
echo Absender: $2 >> $MAILBODY
echo Anzahl Seiten: $3 >> $MAILBODY
echo >> $MAILBODY
echo Das Fax finden Sie im Dateianhang als TIFF- und PDF-Datei. >> $MAILBODY

cat $1.txt | mail -r "Asterisk" -s "Telefax" $4

echo Faxfile $1 von $2 an $4 weitergeleitet >> /var/log/fax2mail.log
Natürlich wird hier noch nichts am Dateiformat verändert und auch kein Dateianhang mitgeschickt, das ist mir klar. (Nur um Missverständnissen vorzubeugen).

In der extensions.conf sind folgende relevanten Einträge:
Code:
[macro-itsafax]
exten => s,1,Set(FAXFILE=/var/spool/asterisk/fax/${UNIQUEID})
exten => s,2,Set(MAILADRESS=${ARG1})
exten => s,3,capicommand(receivefax|${FAXFILE})
exten => s,4,Hangup()

exten => h,1,System(/var/lib/asterisk/scripts/fax2mail "${FAXFILE}" "${FAXID}" "${FAXPAGES}" "${MAILADRESS}")

Die h Extension möchte ich verwenden, damit zunächst die Verbindung getrennt wird und erst dann das Script abgearbeitet wird. (Stehen die Variablen ${FAXID} und ${FAXPAGES} von chan-capi dann überhaupt noch zur Verfügung?)

Code:
exten => 1234567,1,Macro(itsafax,[email protected])
exten => 1234567,2,Hangup()

Das Fax wird empfangen (im Verzeichnis var/spool/asterisk/fax liegt eine Datei), aber das Script wird nicht ausgeführt.

Auf dem CLI endet der Empfang dann auch mit folgenden Einträgen:
Code:
...
DISCONNECT_RESP ID=001 #0x0665 LEN=0012
  Controller/PLCI/NCCI            = 0x202

       > ISDN_TE2#02: CAPI INFO 0x3490: Normal call clearing
    -- CAPI queue frame: [ TYPE: Control (4) SUBCLASS: Hangup (1) ] [ISDN_TE2#02]
    -- capi receivefax: hangup.
    -- Closing fax file...
 capi receivefax: fax receive successful.
  == ISDN_TE2#02: CAPI Hangingup for PLCI=0x202 in state 4
  == ISDN_TE2#02: Interface cleanup PLCI=0x202
       > CAPI devicestate requested for ISDN_TE2/1234567
       > CAPI devicestate requested for ISDN_TE2/1234567

Warum wird mein Script nicht ausgeführt?

Ralph
 
Zuletzt bearbeitet:
Warum das mit der h extension nicht funktioniert kann ich nicht sagen (ich hab 'h' noch nie wirklch verwendet.

Warum rufst du das script nicht direkt nach capicommand auf? So klappt es bei mir.

Zum konvertieren mache ich folgendes:
sff2misc -p file.sff file #hier wird ein .ps erstellt
ps2pdf -sPAPERSIZE=a4 file.ps file.pdf

Armin
 
Armin,

ich wollte mit der h-extension erreichen, dass zunächst aufgelegt wird und dann erst das Script gestartet wird - damit kein ISDN-Kanal offen bleibt, falls in meinem Script etwas schief läuft.

Aber vermutlich trennt capicommand(receivefax) bereits den Channel und startet dann erst das Script...

Ich bin jetzt einen kleinen Schritt weiter: Ich rufe das Script jetzt über AGI auf und habe es darum auch in das AGI-Verzeichnis gestellt.

Es funktioniert, wenn ich das Script in der extensions.conf zum Testen und ohne capicommand(receivefax) direkt, also ohne Macro, aufrufe:
Code:
exten => 67,1,Set(FAXFILE=/var/spool/asterisk/fax/${UNIQUEID})
exten => 67,2,AGI(fax2mail.sh|${FAXFILE}|07123456|1|[email protected])
exten => 67,3,Hangup

Aber der Aufruf von
Code:
[macro-itsafax]
exten => s,1,Set(FAXFILE=/var/spool/asterisk/fax/${UNIQUEID})
exten => s,2,capicommand(receivefax|${FAXFILE})
exten => s,3,AGI(fax2mail.sh|${FAXFILE}|${FAXID}|${FAXPAGES}|${ARG1})
exten => s,4,Hangup()

mittels
Code:
exten => 1234567,1,Macro(itsafax,[email protected])
exten => 1234567,2,Hangup()

funktioniert nicht. Das Script wird nicht aufgerufen:
Code:
DISCONNECT_RESP ID=001 #0x6d40 LEN=0012
  Controller/PLCI/NCCI            = 0x201

       > ISDN_TE1#02: CAPI INFO 0x3490: Normal call clearing
    -- CAPI queue frame: [ TYPE: Control (4) SUBCLASS: Hangup (1) ] [ISDN_TE1#02]
    -- capi receivefax: hangup.
    -- Closing fax file...
 capi receivefax: fax receive failed reason=0x3490 reasonB3=0x0000
  == ISDN_TE1#02: CAPI Hangingup for PLCI=0xdead0000 in state 4
  == ISDN_TE1#02: Interface cleanup PLCI=0xdead0000
       > CAPI devicestate requested for ISDN_TE1/1234567
       > CAPI devicestate requested for ISDN_TE1/1234567

(Das war zugegebenerweise auch kein eingehendes Fax, sondern ein Anruf auf der Faxnummer. AGI sollte aber trotzdem aufgerufen werden? Hmmmmm)

Ralph
 
So, nun habe ich versucht, das Script auch mal außerhalb des Macros (aber mit capicommand davor) aufrufen zu lassen... es funktioniert nicht:

Code:
exten => 1234567,1,Set(FAXFILE=/var/spool/asterisk/fax/${UNIQUEID})
exten => 1234567,2,capicommand(receivefax|${FAXFILE})
exten => 1234567,3,AGI(fax2mail.sh|${FAXFILE}|${FAXID}|${FAXPAGES}|[email protected])
exten => 1234567,4,Hangup

Warum wird das Script nicht aufgerufen sobald capicommand zuvor ausgeführt wird? Was ist in meiner extensions.conf falsch? Es scheint, als ob nach dem capicommand nichts mehr ausgeführt wird.

Ein direkter Aufruf des Scriptes (also nicht von Asterisk aus) funktioniert. Das Script ist also vermutlich unschuldig.
Code:
cd /var/lib/asterisk/agi-bin
./fax2mail.sh /var/spool/asterisk/fax/1170790646.557 1234567 1 [email protected]

Der Vollständigkeit halber hier noch die aktuelle Version des Scriptes:
Code:
#!/bin/sh
#
# $1 FAXFILE
# $2 FAXID
# $3 FAXPAGES
# $4 MAILADRESSE

echo Faxfile $1 von $2 mit $3 Seiten empfangen >> /var/log/fax2mail.log

sfftobmp -tx $1 $1 

MAILBODY=$1.txt

echo >> $MAILBODY
echo Absender: $2 >> $MAILBODY
echo Anzahl Seiten: $3 >> $MAILBODY
echo >> $MAILBODY
echo Das Fax finden Sie im Dateianhang als TIFF-Datei. >> $MAILBODY

cat $1.txt | mail -r "asterisk" -s "Fax von "$2 -a "$1.tif" $4

echo Faxfile $1 von $2 an $4 weitergeleitet >> /var/log/fax2mail.log
 
Bei mir funktioniert es mit System() ohne Probleme.
Aber laut Doku wird AGI auch nicht bei einem 'toten' channel aufgerufen (das receivefax wurde ja beendet und ein hangup kam schon). Hierfuer gibt es
DeadAGI()

Armin
 
Armin,

danke für Deine schnelle Antwort.

Aha, nach dem receivefax wird ein HangUp durchgeführt. Ok. (Das ist ja auch durchaus sinnvoll.)

Mit DeadAGI habe ich aber leider auch keinen Erfolg und auch die Variante mit System funktioniert nicht.

Ich habe mir jeweils eine Extension eingerichtet, eine für den Scriptaufruf mit DeadAGI() und eine für System():

Code:
exten => 1234567,1,Set(FAXFILE=/var/spool/asterisk/fax/${UNIQUEID})
exten => 1234567,2,capicommand(receivefax|${FAXFILE})
exten => 1234567,3,DeadAGI(fax2mail.sh|${FAXFILE}|${FAXID}|${FAXPAGES}|[email protected])
exten => 1234567,4,Hangup

exten => 1234568,1,Set(FAXFILE=/var/spool/asterisk/fax/${UNIQUEID})
exten => 1234568,2,Set([email protected])
exten => 1234568,3,capicommand(receivefax|${FAXFILE})
exten => 1234568,4,System(/var/lib/asterisk/scripts/fax2mail.sh "${FAXFILE}" "${FAXID}" "${FAXPAGES}" "${MAILADR}")
exten => 1234568,5,Hangup

In beiden Fällen wird receivefax ausgeführt und die SFF-Datei korrekt angelegt, aber das Script wird nicht aufgerufen. Oder zumindest nicht korrekt. Es findet jedenfalls keine Formatkonvertierung statt und der MailBody wird ebenfalls nicht angelegt.

Dürfte ich Dich um den bei Dir funktionsfähigen Teil der extensions.conf und evtl. sogar das bei Dir verwendete Script bitten?

Ich stehe echt auf der Leitung...

Kann ich denn irgendwie Asterisk fälschlicherweise so konfiguriert haben, dass keine Scripte ausgeführt werden?

Ralph
 
Ich wollte eigentlich demnaechst ein neues chan-capi release machen, aber eventuell ist die letzte Aenderung in sachen Fax doch nicht ganz okay.
Koenntest Du bitte zum Test mal 0.7.1 statt HEAD verwenden?

Armin
 
armincm schrieb:
Koenntest Du bitte zum Test mal 0.7.1 statt HEAD verwenden?

Hier funktioniert der Faxempfang mit einem chan_capi HEAD (svn co Anfang Januar) problemlos.

Beim Inhalt der Faxe handelt es sich üblicherweise um Werbung, aber das will ich dem chan_capi nicht anlasten ;-)

In einem eigenen Context für Faxempfang (kein Macro) im wesentlichen:

exten => _X.,1,capiCommand(receivefax,...)
exten => _X.,2,Hangup

exten => h,1,NoOp(jetzt Script)
exten => h,2,System(/usr/local/bin/faxScript .....)

Zu beachten ist, das das Faxscript mit Rechten des Asterisk und nicht dem Environment eines interaktiven Users aufgerufen wird. Das Script kann also durchaus "Schuld" sein, auch wenn es interaktiv bestens funktioniert.

Zum Test am besten ein Script mit einem /bin/logger oder /usr/bin/logger Aufruf am Anfang versehen.

Ein DeadAgi direkt nach dem capicommand-receivefax wird zwar nicht beendet wenn die Gegenseite während der Scriptausführung auflegt, aber damit ist nicht sichergestellt, dass es überhaupt aufgerufen wird.

Stefan
 
Armin und Stefan,

ganz herzlichen Dank für Eure Hilfe!!

Ich wäre ja schon froh, wenn ich den Werbemüll empfangen könnte :)

Die Rechte des Scriptes fax2mail.sh liegen bei root, der auch Asterisk ausführt:
Code:
-rwxr-xr-x  1 root root   661 Feb  6 20:58 fax2mail.sh

Ich habe mich zunächst an Stefan's Rat gehalten und zusätzlich einen eigenen Context [handlefax] angelegt. Damit funktioniert es!

Leider funktioniert es mit dem Macro nicht... Asterisk führt weder das NoOp noch den Scriptaufruf aus.

Warum?

Könnte es tatsächlich an einem Fehler im chan-capi liegen? Ich werde jetzt mal auf die 0.7.1 downgraden und gleich wieder berichten. [EDIT: Es liegt anscheinend tatsächlich daran. Siehe nächsten Beitrag.]

Ich kann natürlich mit der Variante "eigener Context" leben - ich weiß nur noch nicht, wie ich dann den Mailempfänger an den Context weiterreiche. Ich möchte je nach Durchwahl, auf der die Faxe ankommen, einen bestimmten Mailempfänger vorgeben.

Deshalb habe ich zunächst das Macro favorisiert, denn dem kann ich ganz gemütlich den Empfänger als Argument mitgeben.


extensions.conf:
Code:
[handlefax]
exten => s,1,Set(FAXFILE=/var/spool/asterisk/fax/${UNIQUEID})
exten => s,2,Set([email protected])
exten => s,3,capicommand(receivefax|${FAXFILE})
exten => s,4,Hangup()

exten => h,1,NoOp(Script aus handlefax wird gestartet)
exten => h,2,System(/var/lib/asterisk/scripts/fax2mail.sh "${FAXFILE}" "${FAXID}
" "${FAXPAGES}" "${MAILADRESS}")


[macro-itsmyfax]
exten => s,1,Set(FAXFILE=/var/spool/asterisk/fax/${UNIQUEID})
exten => s,2,capicommand(receivefax|${FAXFILE})
exten => s,3,Hangup()

exten => h,1,NoOp(Script aus itsmyfax wird gestartet)
exten => h,2,System(/var/lib/asterisk/scripts/fax2mail.sh "${FAXFILE}" "${FAXID}
" "${FAXPAGES}" "${ARG1}")


[from-capi]
exten => 1234567,1,Goto(handlefax,s,1)
exten => 1234567,2,Hangup()

exten => 1234568,1,Macro(itsmyfax,[email protected])
exten => 1234568,2,Hangup()


Hier noch die jeweils letzten Zeilen aus dem "Mitschnitt" der eingehenden Faxe:

Eigener Context (funktioniert):
Code:
      > ISDN_TE1#02: CAPI INFO 0x3490: Normal call clearing
    -- CAPI queue frame: [ TYPE: Control (4) SUBCLASS: Hangup (1) ] [ISDN_TE1#02]
    -- capi receivefax: hangup.
    -- Closing fax file...
 capi receivefax: fax receive successful.
    -- Executing NoOp("CAPI/ISDN_TE1/1234567-396", "Script aus handlefax wird gestartet") in new stack
    -- Executing System("CAPI/ISDN_TE1/1234567-396", "/var/lib/asterisk/scripts/fax2mail.sh "/var/spool/asterisk/fax/1170875251.747" "+49" "1" "[email protected]"") in new stack
  == ISDN_TE1#02: CAPI Hangingup for PLCI=0xdead0000 in state 4
  == ISDN_TE1#02: Interface cleanup PLCI=0xdead0000
       > CAPI devicestate requested for ISDN_TE1/1234567
       > CAPI devicestate requested for ISDN_TE1/1234567

Macro (funktioniert nicht):
Code:
       > ISDN_TE2#02: CAPI INFO 0x3490: Normal call clearing
    -- CAPI queue frame: [ TYPE: Control (4) SUBCLASS: Hangup (1) ] [ISDN_TE2#02]
    -- capi receivefax: hangup.
    -- Closing fax file...
 capi receivefax: fax receive successful.
  == ISDN_TE2#02: CAPI Hangingup for PLCI=0xdead0000 in state 4
  == ISDN_TE2#02: Interface cleanup PLCI=0xdead0000
       > CAPI devicestate requested for ISDN_TE2/1234568
       > CAPI devicestate requested for ISDN_TE2/1234568
 
Zuletzt bearbeitet:
Armin,

ich kann jetzt definitiv sagen, dass die HEAD (Rev. 412) nicht funktioniert, 0.7.1 aber läuft.

Ich belasse es jetzt mal bei der 0.7.1 und hoffe, dass Dir diese Angaben weiterhelfen.

Wenn ich eine aktuelle HEAD-Version testen soll, stehe ich natürlich gerne zur Verfügung!

Bei den hier aufgeführten Ausgaben handelt es sich übrigens um Testanrufe von einem Telefon (lokales SIP/66 über CAPI) aus, es ist also kein echter Faxanruf... darum bricht receivefax ab. Wichtig ist hier ja, ob das Script aus dem Macro heraus aufgerufen wird.

Dass einmal die TE1 und einmal die TE2 den Anruf beantwortet hat, ist Zufall. Der Fehler tritt reproduzierbar bei beiden Karten auf. Dies nur, damit eine unterschiedliche Kartenkonfiguration ausgeschlossen werden kann.

HEAD (Rev. 412):
Code:
  == Registered channel type 'CAPI' (Common ISDN API Driver ($Revision: 412 $))
  == Registered application 'capiCommand'


   -- Executing Macro("CAPI/ISDN_TE1/1234568-3", "itsafax|"[email protected]"") in new stack
    -- Executing Set("CAPI/ISDN_TE1/1234568-3", "FAXFILE=/var/spool/asterisk/fax/1170878403.14") in new stack
    -- Executing capiCommand("CAPI/ISDN_TE1/1234568-3", "receivefax|/var/spool/asterisk/fax/1170878403.14") in new stack
  == ISDN_TE1#02: Answering for 1234568
    -- CAPI/ISDN_TE2/6669968-1 answered SIP/66-41103bb0
    -- ISDN_TE2#02: Fax detected, but not configured for redirection
  == ISDN_TE2#02: CAPI Hangingup for PLCI=0x102 in state 2
  == Spawn extension (default, 01234568, 1) exited non-zero on 'SIP/66-41103bb0'
       > ISDN_TE2#02: CAPI INFO 0x3490: Normal call clearing
       > ISDN_TE1#02: CAPI INFO 0x3490: Normal call clearing
 capi receivefax: fax receive failed reason=0x3490 reasonB3=0x0000
  == ISDN_TE1#02: CAPI Hangingup for PLCI=0xdead0000 in state 4

0.7.1:
Code:
  == Registered channel type 'CAPI' (Common ISDN API Driver (0.7.1))
  == Registered application 'capiCommand'


    -- Executing Macro("CAPI/ISDN_TE2/1234568-2", "itsafax|"[email protected]"") in new stack
    -- Executing Set("CAPI/ISDN_TE2/1234568-2", "FAXFILE=/var/spool/asterisk/fax/1170878500.17") in new stack
    -- Executing capiCommand("CAPI/ISDN_TE2/1234568-2", "receivefax|/var/spool/asterisk/fax/1170878500.17") in new stack
  == ISDN_TE2#01: Answering for 1234568
    -- CAPI/ISDN_TE2/1234568-0 answered SIP/66-41103bb0
    -- ISDN_TE2#02: Fax detected, but not configured for redirection
  == ISDN_TE2#02: CAPI Hangingup for PLCI=0x102 in state 2
  == Spawn extension (default, 01234568, 1) exited non-zero on 'SIP/66-41103bb0'
       > ISDN_TE2#02: CAPI INFO 0x3490: Normal call clearing
       > ISDN_TE2#01: CAPI INFO 0x3490: Normal call clearing
 capi receivefax: fax receive failed reason=0x3490 reasonB3=0x0000
    -- Executing Hangup("CAPI/ISDN_TE2/1234568-2", "") in new stack
  == Spawn extension (macro-itsafax, s, 3) exited non-zero on 'CAPI/ISDN_TE2/1234568-2' in macro 'itsafax'
  == Spawn extension (macro-itsafax, s, 3) exited non-zero on 'CAPI/ISDN_TE2/1234568-2'
    -- Executing NoOp("CAPI/ISDN_TE2/1234568-2", "Script aus itsafax wird gestartet") in new stack
    -- Executing System("CAPI/ISDN_TE2/1234568-2", "/var/lib/asterisk/scripts/fax2mail.sh "/var/spool/asterisk/fax/1170878500.17" "" "" ""[email protected]""") in new stack
  == ISDN_TE2#01: CAPI Hangingup for PLCI=0x302 in state 4
 
Zuletzt bearbeitet:
Ich habe das jetzt nochmal getestet (aktuelles HEAD ohne Aenderungen). Es ist voellig normal, dass weitere Eintraege nach dem Hangup nicht mehr ausgefuehrt werden. Dies wird von Asterisk so gesteuert. In chan-capi 0.7.1 wird der Hangup wohl von Asterisk etwas spaeter ausgefuehrt, wodurch noch ein paar Befehle ausgefuehrt werden. Aber fuer genau diesen Zweck gibt es ja 'h' und damit funktioniert es auch bei mir mit der HEAD Version.
Kannst Du das bitte nochmal testen? Wenn es nicht klappt, mach' doch bitte mal ein debug log. Nicht von chan-capi, sondern vom core:
set verbose 5
set debug 5

Armin
 
Armin,

ich verwende ja die h-extension...

Möglicherweise ist mittlerweile die Übersicht etwas verloren gegangen. Ich möchte gerne in einem Macro eingehende Faxe behandeln. Dazu verwende ich capiCommand(receivefax) und einen per h-extension nachgeschaltete Scriptaufruf. Ich poste hier nochmals meine Konfiguration:
Code:
[macro-itsafax]
exten => s,1,Set(FAXFILE=/var/spool/asterisk/fax/${UNIQUEID})
exten => s,2,capicommand(receivefax|${FAXFILE})
exten => s,3,Hangup()

exten => h,1,System(/var/lib/asterisk/scripts/fax2mail.sh "${FAXFILE}" "${FAXID}
" "${FAXPAGES}" "${FAXRATE}" "${ARG1}")

[from-capi]
exten => 1234567,1,Macro(itsafax,[email protected])
exten => 1234567,n,Hangup()

Ein Versuch mit dem ganz aktuellen chan-capi 1.0.0 (das ist erst ein paar Stunden alt, darum habe ich nicht die HEAD verwendet) zeigt leider den selben Fehler - im Macro wird zwar receivefax ausgeführt, das Script aber leider nicht.

Folgende Debug-Ausgaben wurden mit set verbose 5 und set debug 5 erstellt:

Mit der 1.0.0 geht es nicht:
Code:
  == ISDN_TE2#02: Incoming call '' -> '1234567'
    -- ISDN_TE2#02: Updated channel name: CAPI/ISDN_TE2/1234567-3
    -- Executing Macro("CAPI/ISDN_TE2/1234567-3", "itsafax|[email protected]") in new stack
    -- Executing Set("CAPI/ISDN_TE2/1234567-3", "FAXFILE=/var/spool/asterisk/fax/1171272788.378") in new stack
    -- Executing capiCommand("CAPI/ISDN_TE2/1234567-3", "receivefax|/var/spool/asterisk/fax/1171272788.378") in new stack
  == ISDN_TE2#02: Answering for 1234567
       > ISDN_TE2#02: CAPI INFO 0x3490: Normal call clearing
 capi receivefax: fax receive successful.
  == ISDN_TE2#02: CAPI Hangingup for PLCI=0xdead0000 in state 4

Und mit der 0.7.1 geht es:
Code:
  == ISDN_TE2#02: Incoming call '' -> '1234567'
    -- ISDN_TE2#02: Updated channel name: CAPI/ISDN_TE2/1234567-1
    -- Executing Macro("CAPI/ISDN_TE2/1234567-1", "itsafax|[email protected]") in new stack
    -- Executing Set("CAPI/ISDN_TE2/1234567-1", "FAXFILE=/var/spool/asterisk/fax/1171272488.375") in new stack
    -- Executing capiCommand("CAPI/ISDN_TE2/1234567-1", "receivefax|/var/spool/asterisk/fax/1171272488.375") in new stack
  == ISDN_TE2#02: Answering for 1234567
       > ISDN_TE2#02: CAPI INFO 0x3490: Normal call clearing
 capi receivefax: fax receive successful.
[b]    -- Executing Hangup("CAPI/ISDN_TE2/1234567-1", "") in new stack
  == Spawn extension (macro-itsafax, s, 3) exited non-zero on 'CAPI/ISDN_TE2/1234567-1' in macro 'itsafax'
  == Spawn extension (macro-itsafax, s, 3) exited non-zero on 'CAPI/ISDN_TE2/1234567-1'
    -- Executing System("CAPI/ISDN_TE2/1234567-1", "/var/lib/asterisk/scripts/fax2mail.sh "/var/spool/asterisk/fax/1171272488.375" "+49" "1" "14400" "[email protected]"") in new stack
[/b]  == ISDN_TE2#02: CAPI Hangingup for PLCI=0x202 in state 4

Was mir auffällt: Die Zeile "CAPI Hangingup" unterscheidet sich in den beiden Versionen: In der 1.0.0 ist ein "dead" dabei, in der 0.7.1 nicht. Hilft Dir das?

1.0.0:
Code:
  == ISDN_TE2#02: CAPI Hangingup for PLCI=0x[b]dead[/b]0000 in state 4

0.7.1:
Code:
  == ISDN_TE2#02: CAPI Hangingup for PLCI=0x202 in state 4


EDIT: Würde es denn helfen, die Zeile "exten => s,3,Hangup()" aus dem Macro zu entfernen? capiCommand legt ja schon auf, dann muss ich es ja eigentlich nicht mehr machen...

Ralph
 
Zuletzt bearbeitet:
Ralph* schrieb:
ich verwende ja die h-extension...

Ja, aber im Macro. Ich habe das noch nicht getestet, aber kann es sein, dass 'h' nur im eigentlichen (aufrufenden) context funktioniert?

Ralph* schrieb:
Was mir auffällt: Die Zeile "CAPI Hangingup" unterscheidet sich in den beiden Versionen: In der 1.0.0 ist ein "dead" dabei, in der 0.7.1 nicht. Hilft Dir das?

Das ist normal. Das habe ich in der 1.0.0 geaendert. PLCI ist nur eine Call-Referenz Nummer fuer CAPI und muss geloescht werden, wenn aufgelegt wurde. In 0.7.1 wurde das etwas zu spaet gemacht.

Armin
 
Armin,

Asche auf mein Haupt: In einem Macro gibt es keine h-extension. Das habe ich jetzt aus diversen Quellen erfahren. http://lists.digium.com/pipermail/asterisk-users/2004-December/069431.html

chan_capi 1.0.0 verhält sich also völlig korrekt! BTW: Herzlichen Glückwunsch zum neuen Release. Die 1.0 ist sicherlich gerechtfertigt!!

Weil ich aber sehr gerne mit einem Macro arbeiten würde, versuche ich es also mit einem Aufruf über DeadAGI:
Code:
[macro-itsagifax]
exten => s,1,Set(FAXFILE=/var/spool/asterisk/fax/${UNIQUEID})
exten => s,2,capicommand(receivefax|${FAXFILE})
exten => s,3,NoOp(AGI wird jetzt aufgerufen)
exten => s,4,DeadAGI(fax2mail.agi|${FAXFILE}|${FAXID}|${FAXPAGES}|${FAXRATE}|${A
RG1})

Funktioniert aber nicht, das Script wird nicht aufgerufen:
Code:
  == ISDN_TE2#02: Incoming call '' -> '1234567'
    -- ISDN_TE2#02: Updated channel name: CAPI/ISDN_TE2/1234567-4
    -- Executing Macro("CAPI/ISDN_TE2/1234567-4", "itsagifax|[email protected]") in new stack
    -- Executing Set("CAPI/ISDN_TE2/1234567-4", "FAXFILE=/var/spool/asterisk/fax/1171369384.92") in new stack
    -- Executing capiCommand("CAPI/ISDN_TE2/1234567-4", "receivefax|/var/spool/asterisk/fax/1171369384.92") in new stack
  == ISDN_TE2#02: Answering for 1234567
       > ISDN_TE2#02: CAPI INFO 0x3490: Normal call clearing
 capi receivefax: fax receive successful.
  == ISDN_TE2#02: CAPI Hangingup for PLCI=0xdead0000 in state 4

Fassen wir mal zusammen:

- es gibt keine h-extension in einem Macro.
- capiCommand(receivefax...) macht nach dem Faxempfang einen Hangup.
- AGI fällt für den Scriptaufruf deshalb also aus.
- DeadAGI wird (zumindest in einem Macro) nicht aufgerufen, wenn zuvor capiCommand(receivefax...) ausgeführt wurde. Warum?

In http://lists.digium.com/pipermail/asterisk-users/2004-December/069431.html hatte jemand exakt mein Problem. Dort wird vorgeschlagen, nicht mit einem Macro, sondern mit einem eigenen Context für den Faxempfang zu arbeiten. Das wurde mir in diesem Thread ja auch schon vorgeschlagen. Und das funktioniert ja auch.

Nur: Wenn ich mir einen eigenen Context für den Faxempfang mit einer h-extension für den Scriptaufruf einrichte, dann wird die h-extension blöderweise für jeden Anruf abgearbeitet, nicht nur für die Faxe. Zudem weiß ich nicht, wie ich dann die Parameterübergabe der Mailadresse realisieren soll...

Wie kann ich das denn lösen?

[EDIT]
Das kann ich lösen, indem ich den Context nicht mit include einbinde, sondern nur bei Bedarf per Goto direkt hinspringe.

Und indem ich vor Aufruf des Contextes eine Variable mit der Adresse des Faxempfängers fülle, die dann im Context ausgewertet werden kann.

Eine ausführliche Lösung folgt, wenn ich mir sicher bin, dass das alles so funktioniert.

Ralph
 
Zuletzt bearbeitet:
So, hier ist nach all den seltsamen Irrungen meinerseits die versprochene Lösung für die Frage:

Wie kann ich mit einer Eicon Diva Server ISDN-Karte und chan_capi Faxe empfangen und als TIFF-Datei per Mail weiterleiten?

Ich hoffe, dass hier jetzt keine Fehler mehr drin sind... bei mir läuft es jedenfalls seit rund 24 Stunden fehlerfrei.

Schritt1:

In der extensions.conf legt man einen extra Context an, der für alle Faxnummern bzw. -durchwahlen verwendet werden soll. Dieser Context wird nicht mit Include in den Default-Context eingebunden. Das verhindert, dass die h-extension dieses Contexts für alle Gespräche verwendet wird:
Code:
[handlefax]
exten => s,1,Set(FAXFILE=/var/spool/asterisk/fax/${UNIQUEID})
exten => s,2,capicommand(receivefax|${FAXFILE})
exten => s,3,Hangup()

exten => h,1,System(/var/lib/asterisk/scripts/fax2mail.sh "${FAXFILE}" "${FAXID}
" "${FAXPAGES}" "${FAXRATE}" "${MAILEMPF}")


Schritt 2:

Ebenfalls in der extensions.conf (bei mir landen die ankommenden ISDN-Gespräche im Context [from-capi]) werden die Faxnummern bzw. -durchwahlen so eingerichtet, dass sie den neuen Context [handlefax] verwenden. Zuvor wird die Mailadresse des Fax-Empfängers an eine Channel-Variable übergeben, die dann in [handlefax] ausgewertet wird:
Code:
[from-capi]
exten => 1234567,1,Set([email protected])
exten => 1234567,n,Goto(handlefax,s,1)
exten => 1234567,n,Hangup()

exten => 1234568,1,Set([email protected])
exten => 1234568,n,Goto(handlefax,s,1)
exten => 1234568,n,Hangup()
Unter der Nummer 1234567 eingehende Faxe sollen also an die Mailadresse ich @ domain.xyz weitergeleitet werden, die Faxnummer 1234568 bedient die Mailadresse du @ domain.xyz.


Schritt3:

Jetzt liegt das empfangene Fax als SFF-Datei im Verzeichnis /var/spool/asterisk/fax. Von dort soll es nun in eine TIFF-Datei umgewandelt werden und anschließend per Mail an den entsprechenden Empfänger verschickt werden.

Das hierzu verwendete Script mail2fax.sh [EDIT: Schreibfehler - es muss natürlich fax2mail.sh heißen] stammt im Wesentlichen hier aus dem Forum und wurde von mir nur etwas angepasst. Es befindet sich bei mir im Verzeichnis /var/lib/asterisk/scripts und sieht so aus:
Code:
#!/bin/bash
#
# *******************************************************************
# $1 FAXFILE       (Name der SFF-Datei)
# $2 FAXID         (Absenderkennung)
# $3 FAXPAGES      (Seitenzahl)
# $4 FAXRATE       (Geschwindigkeit)
# $5 MAILADRESSE   (Zieladresse Mail)
# *******************************************************************

# *************************************
# Datum und Uhrzeit formatieren
# *************************************
heute=$(date +"%d.%m.%Y %H:%M:%S")

# *************************************
# Eintrag in Log schreiben
# *************************************
echo $heute $1 von $2 mit $3 Seiten fuer $5 empfangen >> /var/log/fax2mail.log

# *************************************
# Umwandeln von SFF in Multipage-TIFF
# *************************************
sfftobmp -tx $1 $1 

# *************************************
# PDF ist auch denkbar
# *************************************
# sff2misc -p $1 $1.ps
# ps2pdf -sPAPERSIZE=a4 $1.ps $1.pdf

# *************************************
# Dateiname fuer Mailbody erstellen
# *************************************
MAILBODY=$1.txt

# *************************************
# Mailbody erzeugen
# *************************************
echo >> $MAILBODY
echo "Empfangen: ........ " $heute >> $MAILBODY
echo "Absender: ......... " $2 >> $MAILBODY
echo "Anzahl Seiten: .... " $3 >> $MAILBODY
echo "Geschwindigkeit: .. " $4 >> $MAILBODY
echo >> $MAILBODY
echo "Das Faxdokument finden Sie im Dateianhang als TIFF-Datei." >> $MAILBODY
echo "Alle Seiten befinden sich innerhalb dieser einer Datei..." >> $MAILBODY
echo >> $MAILBODY
echo "Ihr Asterisk" >> $MAILBODY

# *************************************
# Mail mit Dateianhang versenden
# *************************************
cat $MAILBODY | nail -r "asterisk" -s "Fax von $2" -a "$1.tif" $5

# *************************************
# Dateien loeschen
# *************************************
rm $MAILBODY
rm $1.tif
rm $1

# *************************************
# Eintrag in Log schreiben
# *************************************
echo $heute $1.tif an $5 verschickt >> /var/log/fax2mail.log

Im Script wird sfftobmp verwendet, das vermutlich nachinstalliert werden muss. Trotz seines Namens kann es SFF-Dateien (das ist das Dateiformat, das von capiCommand(receivefax) verwendet wird) auch in Multipage-TIFFS umwandeln.

Wenn der Mailversand auf dem Asterisk-Server korrekt eingerichtet wurde, landet nach dem Empfang eines Faxes eine Mail im Posteingang, die als Dateianhang die TIFF-Datei enthält.

[EDIT]: Zum Versand verwende ich hier ausdrücklich "nail" und nicht "mail", weil (zumindest die bei mir laufende Version von) "mail" keine Option zum Versand von Dateianhängen kennt. Mein SuSE 10.0 hat jedoch einen Link von "mail" auf "nail" gesetzt, so dass "mail" im Script trotzdem funktionieren würde. Wo das nicht der Fall ist, muss eben "nail" gegebenenfalls noch nachinstalliert werden.

Fertig!

Was ich noch nicht geschafft habe:

1. Vor der FAXID sind oft Leerzeichen, so dass eine Betreffzeile auch mal so aussehen kann:
Code:
Fax von       +49 711 12345-67
Hat jemand eine Idee, wie ich alle Leerzeichen aus der FAXID rausbekommen kann? Oder: Nur noch das Pluszeichen und Zahlen in der FAXID belassen. Bin leider kein guter Bash-Programmierer...

2. Wäre es nicht doch klüger, das Script über deadAGI aufzurufen? Mir ist der Unterschied zwischen System() und deadAGI noch nicht klar.

Nun ja, es funktioniert!

Danke an alle, die mir hier geholfen haben! Einen besonderen Dank natürlich an Armin für die Unterstützung und nicht zuletzt für chan_capi!!!

Ralph
 
Zuletzt bearbeitet:
@Ralph*

Du hast 2 kleine Fehler in deiner Anleitung.

Das im Context verwendete Script mail2fax.sh stammt im [...]
es sollte fax2mail.sh heißen, da du es in der extensions.conf über diesen Namen aufrufst


Inhalt der fax2mail.sh
cat $MAILBODY | nail -r "asterisk" -s "Fax von $2" -a "$1.tif" $5
es sollte "mail" anstatt "nail" heißen, schließlich willst du ja wohl E-Mail und keine Nägel versenden ;)

Grüße

Christian
 
indigo-inc schrieb:
es sollte "mail" anstatt "nail" heißen, schließlich willst du ja wohl E-Mail und keine Nägel versenden ;)

'nail' ist vollkommen korrekt. Das Programm (meist mit symlink auch als 'mail') heisst wirklich so.

Armin
 
Mein OpenSuse 10.2 kennt nail nicht... da hab ichs mit mail versucht, das ging dann. Naja vielleicht kannst du`s ja als Hinweis dazu schreiben.

Grüße

Christian
 
Christian,

Du hast Recht, das Script muss natürlich fax2mail.sh heißen... ich bitte um Verzeihung!

Was den Versand von Nägeln betrifft, ist "nail" jedoch korrekt. "nail" deshalb, weil "mail" keine Attachments versenden kann. Mein SuSE 10.0 hat einen Link von mail auf nail gesetzt, das wird bei Dir evtl. auch so sein. Falls nicht, kennt das bei Dir eingesetzte "mail" die Option -a möglicherweise... wie auch immer, wenn's bei Dir funktioniert, freut es mich sehr!

Ich habe beide Punkte in der obigen Anleitung entsprechend erwähnt.

Ralph
 
Zuletzt bearbeitet:

Zurzeit aktive Besucher

Statistik des Forums

Themen
246,219
Beiträge
2,248,330
Mitglieder
373,792
Neuestes Mitglied
gilbertsamson563
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.