[Gelöst] IAXMODEM Fax in Dialplan

cherzberg

Mitglied
Mitglied seit
21 Mai 2006
Beiträge
239
Punkte für Reaktionen
0
Punkte
0
Hallo zusammen,

ich habe mir einen kleinen Asterisk 1.6 inkl. Hylafax und iaxmodem installiert.
Die Modems werden im Dialplan nacheinander versucht anzurufen, wenn ein Modem besetzt ist, soll einfach das nächste angewählt werden.
Sind alle Modems besetzt, kommt ein besetzt für 20 Sekunden und dann lege ich auf. In der Theorie ja ganz einfach.

Alle Modems heben auch ab, wenn sie klingeln und es kommen Faxe an. Soweit so gut, aber!!! Nur beim ersten Modem wird mir die DID (Extension) mitgegeben ud ich kann diese mit der FaxDispatch auch verteilen. Bei allen anderen Modems bekomme ich nur "h" als DID angezeigt.

Hier mal mein Dialplan:

Code:
[fax-in]
exten=>_.X,1,NoOp(Fax Kontext entered ${EXTEN})
exten=>_.X,n,Dial(IAX2/iaxmodem0/${EXTEN},5)
exten=>_.X,n,NoOp(Fax Kontext entered >>>>>>>>>>>>>>>>>>${EXTEN}<<<<<<<<<<<<<<<<<<<<)
exten=>_.X,n,Dial(IAX2/iaxmodem1/${EXTEN},5)
exten=>_.X,n,NoOp(Fax Kontext entered >>>>>>>>>>>>>>>>>>${EXTEN}<<<<<<<<<<<<<<<<<<<<)
exten=>_.X,n,Dial(IAX2/iaxmodem2/${EXTEN},5)
exten=>_.X,n,NoOp(Fax Kontext entered >>>>>>>>>>>>>>>>>>${EXTEN}<<<<<<<<<<<<<<<<<<<<)
exten=>_.X,n,Dial(IAX2/iaxmodem3/${EXTEN},5)
exten=>_.X,n,NoOp(Fax Kontext entered >>>>>>>>>>>>>>>>>>${EXTEN}<<<<<<<<<<<<<<<<<<<<)
exten=>_.X,n,Dial(IAX2/iaxmodem4/${EXTEN},5)
exten=>_.X,n,NoOp(Fax Kontext entered >>>>>>>>>>>>>>>>>${EXTEN}<<<<<<<<<<<<<<<<<<<<)
exten=>_.X,n,Dial(IAX2/iaxmodem5/${EXTEN},5)
exten=>_.X,n,NoOp(Fax Kontext entered >>>>>>>>>>>>>>>>>>${EXTEN}<<<<<<<<<<<<<<<<<<<<)
exten=>_.X,n,NoOp(WARNING: INCOMING FAX OVERFLOW - FAX BANK FULL - DIALSTATUS: ${DIALSTATUS})
exten=>_.X,n,Busy(20)
exten=>_.X,n,Hangup()

Hat einer von Euch eine Idee?

Besten Dank für Eure Hilfe
Christian
 
Zuletzt bearbeitet:
Unbeachtlich des (vermutlichen) Übertragungsfehlers (exten=>_.X soll vermutlich exten=>_X. sein), sollte es wie folgt funktionieren (NoOps weggelassen):

Code:
[fax-in]
exten=>_X.,1,NoOp(Fax Kontext entered ${EXTEN})
exten=>_X.,n,Set(DID=${EXTEN})
exten=>_X.,n,Dial(IAX2/iaxmodem0/${DID},5)
exten=>_X.,n,Dial(IAX2/iaxmodem1/${DID},5)
exten=>_X.,n,Dial(IAX2/iaxmodem2/${DID},5)
exten=>_X.,n,Dial(IAX2/iaxmodem3/${DID},5)
exten=>_X.,n,Dial(IAX2/iaxmodem4/${DID},5)
exten=>_X.,n,Dial(IAX2/iaxmodem5/${DID},5)
exten=>_X.,n,NoOp(WARNING: INCOMING FAX OVERFLOW - FAX BANK FULL - DIALSTATUS: ${DIALSTATUS})
exten=>_X.,n,Busy(20)
exten=>_X.,n,Hangup()

Hintergrund: Aus auch mir nicht ganz klaren Gründen "vergißt" respektive überschreibt Asterisk ${EXTEN} schon mal. Deshalb habe ich mir angewöhnt, die Variable bei Bedarf lieber in eine User-Defined-Variable umzuschrieben, da ist man sicher ;)

Abgesehen davon kannst Du das (ab 1.6) natürlich auch eleganter lösen, indem Du mit DEVICE_STATE und dem Hyla-internen State-Modell arbeitest (hier als AEL-Snippet):

Code:
globals {
// Global vars
maxinfax=6;
HylaStatusDir=/var/spool/hylafax/status; // ggf. anpassen je nach Distri
}

context fax-in {
_X. => {
Set(DID=${EXTEN});
// Search for a free Modem
for (x=0; ${x}<=$[{maxinfax}-1];x=${x}+1) {
    if ((${DEVICE_STATE(IAX2/iaxmodem${x})} = UNKNOWN) | (${DEVICE_STATE(IAX2/iaxmodem${x})} = NOT_INUSE)) {
	Set(HylaState=${FILTER(a-z,${SHELL(cat ${HylaStatusDir}/ttyIAX${x} | awk '{printf "%s",$3}')})}); // ggf. anpassen je nach Devicenamen
	if ("X${HylaState}"="Xidle") {
		Dial(IAX2/iaxmodem${x}/${DID},10);
                Hangup;
	}
   }
}
NoOp(WARNING: INCOMING FAX OVERFLOW - FAX BANK FULL - DIALSTATUS: ${DIALSTATUS});
Busy(20);
Hangup();
}

h => Hangup();
}
 
Hallo abw1oim,

besten Dank für deine Antwort. Sowas hatte ich mir fast schon gedacht.
Jetzt bekommen alle meine Modems die Nummer durchgereicht.

Viele Grüße
Christian
 
Hallo Hallo abw1oim,

ich habe jetzt mal das mit deinem AEL2 Script versucht. leider funktioniert das bei mir nicht. Ich setze zwar Asterisk 1.6 ein, aber es sieht so aus, als wenn er die For Schleife nicht abarbeitet.
Die Variablen passen alle zu meiner Distribution. Der Shell befahlt passt auch. hast Du noch eine Idee? Asterisk sprint auch in den Context und setzt die Variablen und schreibt mir auch noch x=0 hin.
Code:
    -- Goto (fax-in-ael,2940,1)
    -- Executing [2940@fax-in-ael:1] Set("SIP/berofix-000d47bd", "DID=2940") in new stack
    -- Executing [2940@fax-in-ael:2] MSet("SIP/berofix-000d47bd", "x=0") in new stack
    -- Executing [2940@fax-in-ael:3] GotoIf("SIP/berofix-000d47bd", "0?4:13") in new stack
    -- Goto (fax-in-ael,2940,13)
    -- Executing [2940@fax-in-ael:13] NoOp("SIP/berofix-000d47bd", "Finish for_fax-in-ael_457") in new stack
    -- Executing [2940@fax-in-ael:14] NoOp("SIP/berofix-000d47bd", "WARNING: INCOMING FAX OVERFLOW - FAX BANK FULL - DIALSTATUS: ") in new stack
    -- Executing [2940@fax-in-ael:15] Busy("SIP/berofix-000d47bd", "20") in new stack
  == Spawn extension (fax-in-ael, 2940, 15) exited non-zero on 'SIP/berofix-000d47bd'
    -- Executing [h@fax-in-ael:1] Hangup("SIP/berofix-000d47bd", "") in new stack
  == Spawn extension (fax-in-ael, h, 1) exited non-zero on 'SIP/berofix-000d47bd'

So sieht das dann aus.

Besten Dan kund viele grüße
Christian
 
Da war im Snippet ein Tippfehler. Tausche mal die Zeile

Code:
for (x=0; ${x}<=$[{maxinfax}-1];x=${x}+1) {

mit

Code:
for (x=0; ${x}<=$[${maxinfax}-1];x=${x}+1) {

dann sollte es auch klappen. Sorry, aber das war der Tippfehlerteufel :mad:
 
Hallo,

besten Dank für die schnelle Antwort. jetzt wo ich es lese, fällt es mir auch auf, dass das "$" fehlt. :-)
Funktioniert übrigens wunderbar!!!:D
 
Kostenlos!

Statistik des Forums

Themen
249,052
Beiträge
2,309,532
Mitglieder
378,850
Neuestes Mitglied
IchBinEsDoch