app_rxfax and app_txfax
app_rxfax and app_txfax are two Asterisk applications to send and receive faxes. They are simple interfaces to Steve Underwood's spandsp library, which does the real work. Up to date versions may be obtained from http://sf.net/projects/agx-ast-addons
They consist of three files app_rxfax, app_txfax and apps_makefile.patch which you should put on your Asterisk's source code directory and apply the patch (which may or may not work according to the current state of Asterisk). For more directions consult http://soft-switch.org/installing-spandsp.html which explains how to install spandsp and then app_rxfax and app_txfax.
There's an application called astfax that can use app_txfax to create a mail-to-fax gateway.
app_rxfax and app_txfax is distributed next to spandsp (but not in the same tarball). The latest version is on http://www.soft-switch.org/downloads/snapshots/spandsp/ inside the directory 'test-apps-asterisk-1.2' and 'test-apps-asterisk-1.4'.
AGX Extra Addons for Asterisk contains enhanced version of app_rxfax and app_txfax for 1.4
Sending (txfax)
If the variable LOCALHEADERINFO has been set when txfax is run, the value of that variable will be used as the user defined part of the header text. The page number, date and time, and calling FAX ID will be filled in by the software to make a complete header line, of the kind produced by most FAX machines.If the variable LOCALSTATIONID has been set when txfax is run, the value of that variable will be used to identify itself to the remote fax machine.
exten => _X.,1,SetVar(FAXFILE=/var/spool/asterisk/fax/mydocument.tif)
exten => _X.,2,SetVar(LOCALHEADERINFO=Company name and department)
exten => _X.,3,SetVar(LOCALSTATIONID=Company name)
exten => _X.,4,txfax(${FAXFILE}|caller)
Document format
When sending a fax you need to use a tiffg3 document, to convert a document to tiffg3 you can use ghostscript with this command:/usr/bin/gs -q -sDEVICE=tiffg3 -sPAPERSIZE=a4 -r204x196 -dNOPAUSE -sOutputFile=/var/spool/asterisk/outgoing/mydocument.tif -- /var/spool/asterisk/outgoing/mydocument.pdf
If you can't get Asterisk to recognize an incoming call as a fax, check the wiring of your jacks. Reversed wires in an RJ-11 jack prevented Asterisk from recognizing the fax polling tones and caused the server to dump the call into a regular extension instead of recognizing it as a fax
See also
- http://www.soft-switch.org Steve Underwood's Web Site
- SpanDSP tutorial on asteriskguru
- Faxing with Asterisk by Scott Laird
- spandsp
- astfax
- Asterisk Fax
- AGX Extra Addons for Asterisk contains enhanced version of app_rxfax and app_txfax for 1.4
- Bakelite email/fax gateway
Page Changes
Problem with rxfax && post receipt printing
asterisk-1.4.17
spandsp-0.0.4-pre18
agx-ast-addons-1.4.5
zaptel-1.4.9.2
libpri-1.4.3
asterisk-addons-1.4.6
Compiled && installed w/o issue
This USED to work w/1.2 && older versions of rxfax:
co2
exten => s,1,NoOp(Inbound Call)
exten => s,2,NoOp(CALLERID=${CALLERID})
exten => s,3,Set(_menu=menu-000)
exten => s,4,Goto(fax,90)
; Queue and print
exten => fax,90,Set(FAXFILE=/var/spool/asterisk-fax/${UNIQUEID}.tif)
exten => fax,91,rxfax(${FAXFILE})
exten => fax,92,NoOp(REMOTESTATIONID ${REMOTESTATIONID})
exten => fax,93,NoOp(FAXPAGES ${FAXPAGES})
exten => fax,94,NoOp(FAXBITRATE ${FAXBITRATE})
exten => fax,95,NoOp(FAXRESOLUTION ${FAXRESOLUTION})
exten => fax,96,System(/usr/local/bin/printfax -p ${FAXPAGES} -r ${FAXRESOLUTION} ${FAXFILE})
exten => fax,97,NoOP(Fax Complete)
exten => fax,98,NoOP
exten => fax,99,Hangup
Now When the fax is done I don't get the printfax to run . . . (from the log):
Apr 9 11:51:44 VERBOSE12856 logger.c: Apr 9 11:51:44 — Starting simple switch on 'Zap/4-1'
Apr 9 11:51:45 VERBOSE12856 logger.c: Apr 9 11:51:45 — Executing s@co2:1 NoOp("Zap/4-1", "Inbound
Call") in new stack
Apr 9 11:51:45 VERBOSE12856 logger.c: Apr 9 11:51:45 — Executing s@co2:2 NoOp("Zap/4-1", "CALLERI
D=") in new stack
Apr 9 11:51:45 VERBOSE12856 logger.c: Apr 9 11:51:45 — Executing s@co2:3 Set("Zap/4-1", "_menu=me
nu-000") in new stack
Apr 9 11:51:45 VERBOSE12856 logger.c: Apr 9 11:51:45 — Executing s@co2:4 Goto("Zap/4-1", "fax|90"
) in new stack
Apr 9 11:51:45 VERBOSE12856 logger.c: Apr 9 11:51:45 — Goto (co2,fax,90)
Apr 9 11:51:45 VERBOSE12856 logger.c: Apr 9 11:51:45 — Executing fax@co2:90 Set("Zap/4-1", "FAXFI
LE=/var/spool/asterisk-fax/1207756304.353.tif") in new stack
Apr 9 11:51:45 VERBOSE12856 logger.c: Apr 9 11:51:45 — Executing fax@co2:91 RxFAX("Zap/4-1", "/va
r/spool/asterisk-fax/1207756304.353.tif") in new stack
Apr 9 11:51:45 DEBUG12856 chan_zap.c: Took Zap/4-1 off hook
Apr 9 11:51:45 DEBUG12856 chan_zap.c: Engaged echo training on channel 4
. . . <blah,blah>
Apr 9 11:52:56 DEBUG12856 /usr/src/asterisk/agx-ast-addons/app_rxfax.c: Fax successfully received.
Apr 9 11:52:56 DEBUG12856 /usr/src/asterisk/agx-ast-addons/app_rxfax.c: Remote station id:
Apr 9 11:52:56 DEBUG12856 /usr/src/asterisk/agx-ast-addons/app_rxfax.c: Local station id:
Apr 9 11:52:56 DEBUG12856 /usr/src/asterisk/agx-ast-addons/app_rxfax.c: Pages transferred: 4
Apr 9 11:52:56 DEBUG12856 /usr/src/asterisk/agx-ast-addons/app_rxfax.c: Image resolution: 8031 x 3850
Apr 9 11:52:56 DEBUG12856 /usr/src/asterisk/agx-ast-addons/app_rxfax.c: Transfer Rate: 14400
Apr 9 11:52:56 DEBUG12856 /usr/src/asterisk/agx-ast-addons/app_rxfax.c: ================================
=====================================
Apr 9 11:52:58 DEBUG12856 /usr/src/asterisk/agx-ast-addons/app_rxfax.c: Got hangup
Apr 9 11:52:58 VERBOSE12856 logger.c: Apr 9 11:52:58 — Hungup 'Zap/4-1'
Apr 9 12:04:40 VERBOSE12857 logger.c: Apr 9 12:04:40 — Starting simple switch on 'Zap/4-1'
PHHHT. Huk!
From an older log:
Oct 11 10:09:14 DEBUG4959: Fax successfully received.
Oct 11 10:09:14 DEBUG4959: Remote station id: Mortgage Services
Oct 11 10:09:14 DEBUG4959: Local station id:
Oct 11 10:09:14 DEBUG4959: Pages transferred: 1
Oct 11 10:09:14 DEBUG4959: Image resolution: 7700 x 3850
Oct 11 10:09:14 DEBUG4959: Transfer Rate: 9600
Oct 11 10:09:14 DEBUG4959: ===========================================================================
Oct 11 10:09:14 VERBOSE4959: Oct 11 10:09:14 — Executing NoOp("Zap/4-1", "REMOTESTATIONID Mortgage Se
rvices ") in new stack
Oct 11 10:09:14 VERBOSE4959: Oct 11 10:09:14 — Executing NoOp("Zap/4-1", "FAXPAGES 1") in new stack
Oct 11 10:09:14 VERBOSE4959: Oct 11 10:09:14 — Executing NoOp("Zap/4-1", "FAXBITRATE 9600") in new st
ack
Oct 11 10:09:14 VERBOSE4959: Oct 11 10:09:14 — Executing NoOp("Zap/4-1", "FAXRESOLUTION 3850") in new
stack
Oct 11 10:09:14 VERBOSE4959: Oct 11 10:09:14 — Executing System("Zap/4-1", "/usr/local/bin/printfax -
p 1 -r 3850 /var/spool/asterisk-fax/1192111704.363.tif") in new stack
Oct 11 10:09:14 VERBOSE4959: Oct 11 10:09:14 — Executing NoOp("Zap/4-1", "Fax Complete") in new stack
Oct 11 10:09:14 VERBOSE4959: Oct 11 10:09:14 — Executing NoOp("Zap/4-1", "") in new stack
Oct 11 10:09:14 VERBOSE4959: Oct 11 10:09:14 — Executing Hangup("Zap/4-1", "") in new stack
Oct 11 10:09:14 VERBOSE4959: Oct 11 10:09:14 == Spawn extension (co2, fax, 99) exited non-zero on 'Zap/4
-1'
</pre>
I'm at a loss, I can think of a few work-arounds, but this must have something to do with a change in asterisk on a hangup. Processing stops now? Perhaps an explicit off-hook is needed. Any insight useful.
Newer information
Rxfax keeps the channel up
but the problem is really strange, i can receive fax successfully but rxfax keeps the channel up forever untill i softhangup the channel. here is the output
softswitch-vas*CLI> show channels verbose
Channel Context Extension Prio State Application Data CallerID Duration Accountcode BridgedTo
Zap/3-1 fax s 3 Up RxFAX /var/spool/asterisk/fax/1 0212792161 00:16:44 (None)
1 active channel
1 active call
output from /var/log/asterisk/full:
Sep 12 15:00:47 DEBUG2499 app_rxfax.c: ===========================================================================
Sep 12 15:00:49 DEBUG2499 app_rxfax.c: ========================================================================
Sep 12 15:00:49 DEBUG2499 app_rxfax.c: Fax successfully received.
Sep 12 15:00:49 DEBUG2499 app_rxfax.c: Remote station id: 2792161
Sep 12 15:00:49 DEBUG2499 app_rxfax.c: Local station id:
Sep 12 15:00:49 DEBUG2499 app_rxfax.c: Pages transferred: 1
Sep 12 15:00:49 DEBUG2499 app_rxfax.c: Image resolution: 8037 x 3850
Sep 12 15:00:49 DEBUG2499 app_rxfax.c: Transfer Rate: 9600
Sep 12 15:00:49 DEBUG2499 app_rxfax.c: ===========================================================================
any idea why rxfax keeps running.
regards
destination number
ext-test-custom
exten => 667,1,Goto(ext-fax,out_fax,1)
ext-fax
exten => s,1,Answer
exten => s,2,Goto(in_fax,1)
exten => in_fax,1,StopPlayTones
exten => in_fax,2,GotoIf($"${FAX_RX}" = "system"?3:analog_fax,1)
exten => in_fax,3,Macro(faxreceive)
exten => in_fax,4,system(/var/lib/asterisk/bin/fax-process.pl --to ${EMAILADDR} --from ${FAX_RX_FROM} --subject "Recebendo Fax de ${CALLERID(number)} ${CALLERID(name)}" --attachment ${CALLERID(number)}.pdf --type application/pdf --file ${FAXFILE});
exten => in_fax,5,Hangup
exten => analog_fax,1,GotoIf($"${FAX_RX}" = "disabled"?4:2) ;if fax is disabled, just hang up
exten => analog_fax,2,Set(DIAL=${DB(DEVICE/${FAX_RX}/dial)});
exten => analog_fax,3,Dial(${DIAL},20,d)
exten => analog_fax,4,Hangup
;appexten => out_fax,1,wait(7)
exten => out_fax,1,Answer()
exten => out_fax,2,AbsoluteTimeout(35)
exten => out_fax,3,SetVar(FAXFILE=/home/fax/mydocument.tif)
exten => out_fax,4,SetVar(LOCALHEADERINFO=company)
exten => out_fax,5,SetVar(LOCALSTATIONID=company)
exten => out_fax,6,txfax(${TXFAX_NAME}|caller)
exten => out_fax,7,Hangup
exten => h,1,Hangup()
Asterisk 1.4.4, spandsp 0.0.3
Asterisk 1.4.4, spandsp 0.0.3, Debian 4.0 etch, libtiff, autconf (2.61-4) and automake from the standard Debian 4.0 archive.
Don't remember how exactly i compiled spandsp, but for Asterisk 1.4.2 and Asterisk 1.4.4, i didn't do autconf in
autoconf
./bootstrap.sh
./configure
make menuselect
just boststrap.sh in a FRESH unzipped asterisk-1.4.x dir was enough.
I use the app-r/tx.c files from January 2007, the latest are from June 2007, haven't tested them.
If you have problems, also check, if app_t/rxfax.so are linked against libspandsp and libtiff (with ldd apps/app_rxfax.so)
Edit /BTW: Haven't had the problem that Leonardo reported.
rxfax and txfax with Asterisk 1.4.4
I've compiled it exactly as Ray's comment below, but with a bit difference when re-creating the Makefile with bootstrap.sh
I'm using:
Asterisk 1.4.4
SpanDSP 0.0.3: http://www.soft-switch.org/downloads/spandsp/spandsp-0.0.3.tgz
Hint: The autoconf 2.6 or above and automake are essentially.
Do the same things that Ray said below, then after run ./bootstrap.sh, it re-creates the configure file, but it merge the SPEEX and SPANDSP session incorrectly. So, open the configure, find the SPANDSP session (below the RADIUS), then remove everything from SPANDSP and SPEEX (there are lot of things repeated). The clean code is this:
SPANDSP_DESCRIP="spandsp Library"
SPANDSP_OPTION="spandsp"
if test "${with_spandsp+set}" = set; then
withval=$with_spandsp;
case ${withval} in
n|no)
USE_SPANDSP=no
;;
y|ye|yes)
SPANDSP_MANDATORY="yes"
;;
*)
SPANDSP_DIR="${withval}"
SPANDSP_MANDATORY="yes"
;;
esac
fi
PBX_SPANDSP=0
SPEEX_DESCRIP="Speex"
SPEEX_OPTION="speex"
if test "${with_speex+set}" = set; then
withval=$with_speex;
case ${withval} in
n|no)
USE_SPEEX=no
;;
y|ye|yes)
SPEEX_MANDATORY="yes"
;;
*)
SPEEX_DIR="${withval}"
SPEEX_MANDATORY="yes"
;;
esac
fi
PBX_SPEEX=0
Now just continue with ./configure and the next steps.
Re: rxfax and txfax with Asterisk 1.4.2
I followed your instructions; compiling was ok, but when invoking rxfax asterisk instantly dies...
rxfax and txfax with Asterisk 1.4.2
(using an older Fedora 3 i686 system)<BR><BR>
wget http://ftp.digium.com/pub/asterisk/releases/asterisk-1.4.2.tar.gz<BR>
wget http://www.soft-switch.org/downloads/snapshots/spandsp/spandsp-20070413.tar.gz<BR>
wget http://www.soft-switch.org/downloads/snapshots/spandsp/test-apps-asterisk-1.4/app_rxfax.c<BR>
wget http://www.soft-switch.org/downloads/snapshots/spandsp/test-apps-asterisk-1.4/app_txfax.c<BR>
wget http://www.soft-switch.org/downloads/snapshots/spandsp/test-apps-asterisk-1.4/asterisk.patch<BR><BR>
tar -zxvf spandsp-20070413.tar.gz<BR>
cd spandsp-0.0.4<BR>
make uninstall<BR>
make clean<BR>
autoconf<BR>
./configure<BR>
make<BR>
make install<BR><BR>
tar -zxvf asterisk-1.4.2.tar.gz<BR>
cd asterisk-1.4.2<BR>
cp ../asterisk.patch .<BR>
cp ../app_rxfax.c apps/<BR>
cp ../app_txfax.c apps/<BR><BR>
(at this point, you SHOULD be able to do "patch -bp0 < asterisk.patch", but the patch is partially broken. Look at the asterisk.patch and you'll see several different sections where the patch looks for one block of text in a certain file, then inserts the lines that starts with the "+". You need to manually add the lines with the "+" character into the spots that the patch file point to. Remember to remove the "+" from the beginning of the line.)<BR><BR>
cp /usr/local/include/spandsp/plc.h include/asterisk/plc.h<BR><BR>
(I had to copy the plc.h that was installed from the spandsp into the asterisk folder to get around some error messages)<BR><BR>
make clean<BR>
autoconf<BR>
./bootstrap.sh<BR>
./configure<BR>
make menuselect<BR><BR>
(at this point, check to see if the app_txfax and app_rxfax are selected. It should not be marked as unavailable, ie., no XXX's)<BR><BR>
make<BR>
make install<BR><BR>
If it compiles without error, If it does not coredump when you run asterisk, you should be able to see usage information from the console by running these commands:<BR>
core show application RxFax<BR>
core show application TxFax<BR><BR>
I had to manually upgrade my autoconf, because there are no RPM's for autoconf 2.6 or newer.<BR><BR>
Ray
State consult
The complete post is here.</p>
rxfax and txfax vs. Asterisk 1.4