Asterisk

Dec 12, 2013
14 min read
May 27, 2023 09:13 EEST

Basics

My configuration:

                                                                <===>a/b (and door bell)
                                                                |
                                                                |
extern<===>NTBA<===>HFC-S(TE)<===>Asterisk<===>HFC-S(NT)<===>ISDN-PBX
                                     |                          |
                                     |                          |
                                     |                          <===>internal S0 (with internal phones)
                                     |
                                     <===>VoIP (SIP and IAX2)

ISDN: TE mode is used for connection between PBX and NTBA. NT mode is used for transparent connection, e.g. PBX and internal S0 bus.

Group 2 Group 1 Mode
b2 a2 b1 a1
6 3 5 4 TE-Mode
5 4 6 3 NT-Mode
yellow black green red or brown

Codecs

Codec number Codec Bitrate
G.711 ulaw 64kbps
G.711 alaw 64kbps
G.726 ADPCM 16/24/32/40 kbps
G.729 8 kbps (requires license)
GSM 13kbps

http://www.readytechnology.co.uk/open/ipp-codecs-g729-g723.1/

ISDN

      __
   ___| |____
  |          |
  | 12345678 |
  ------------

For crossed cable: s0_gekreuzt.jpg

Twisted-Pair-Kabel Steckerbelegung und Pinbelegung
für Netzwerk- und ISDN-Kabel bzw. -Dosen RJ45

Stecker:        RJ45 (HIROSE)
Kabel:          Cat.5-Leitung, 100 Ohm Wellenwiderstand, geschirmt/ungeschirmt
Verwendung:     Ethernet 10/100 MBit/s, Twisted-Pair, 10/100-Base-T/x, ISDN


Pin   Ethernet          [A]          [B]          [E]          [I]          ISDN   Pin
--------------------------------------------------------------------------------------
 1    Transmit Data +   grün/weiß    rot/weiß     braun/weiß                        1
 2    Transmit Data -   grün         rot          braun                             2
 3    Receive Data +    rot/weiß     grün/weiß    blau/weiß    braun/weiß    A2     3
 4    ungenutzt -       blau         blau                      blau          A1     4
 5    ungenutzt +       blau/weiß    blau/weiß                 blau/weiß     B1     5
 6    Receive Data -    rot          grün         blau         braun         B2     6
 7    ungenutzt +       braun/weiß   braun/weiß                                     7
 8    ungenutzt -       braun        braun                                          8


STANDART-KABEL 1:1 "Plain/Normal/Straight":
	Die Stecker an beiden Enden werden mit dem gleichen Farbcode belegt.
	Ethernet: entweder beide Enden mit Farbcode [A] oder beide [B]
		  (HUB <-> PC oder HUB <-> HUB)
	ISDN:     beide Enden mit Farbcode [I]
		  (Telefon <-> Anlage oder Dose <-> Dose)

GEKREUZTES KABEL "Crossed":
	Jeweils ein Stecker wird mit Farbcode [A] und
	(der am anderen Ende) mit Farbcode [B] belegt.
	Ethernet: (PC <-> PC oder auch HUB <-> HUB)

EINZELDOSEN:    Kabel       <-> Dose          Farbcode:
      Ethernet  Pin 1,2,3,6 <-> Pin 1,2,3,6   entweder beide [A] oder beide [B]
      ISDN      Pin 3,4,5,6 <-> Pin 3,4,5,6   beide [I]

DOPPELDOSEN:    Kabel                      <-> Dose
     1. Buchse: Ethernet  Pin 1,2,3,6  [B] <-> Pin 1,2,3,6  [B]
     2. Buchse: Ethernet  Pin 4,5,7,8  [E] <-> Pin 1,2,3,6  [B]
		(Kabel:braun<->Dose:rot und Kabel:blau<->Dose:grün verbinden)
     2. Buchse: ISDN      Pin 4,5,7,8  [I] <-> Pin 3,4,5,6  [B]
		(Kabel:braun<->Dose:grün und Kabel:blau<->Dose:blau verbinden)

WICHTIG: die Buchsen der Dose sollten nach unten zeigen (Staubfang) !

Mit dieser Pinbelegung ist es möglich 2 Anschlüsse mit einem Kabel zu bedienen.
Dabei muß darauf geachtet werden, daß das Ende des Kabels, welches die
Doppeldose bedient auch 2 Stecker bekommt !
Beide Enden müssen die gleichen Farbcodes wie die Dose aufweisen:
also zweimal Farbcode B für zwei Ethernet-Anschlüsse bzw.
einmal Farbcode B für das Kabelende von der ersten Buchse (Ethernet) und
einmal Farbcode I für das Kabelende von der zweiten Buchse (ISDN).


PINBELEGUNG BUCHSE "RJ-45":
(Draufsicht: dort wo der Stecher hineinkommt)

			----------
			|12345678|
			|        |
			---|  |---
			   ----

PINBELEGUNG STECKER "RJ-45":
(Draufsicht: so herum kommt er in die Buchse hinein)
						
		      /--------/|
		     /12345678/ |
		    /--------/  /
		   /        /  /|
		  |--------|  /--  <- Nase am Stecker
		  |   ()   | /
		  ---()-----
		    ()
	  Kabel -> ()
		  ()

isdn-bri-crossover.gif

MOH

be sure that /usr/ports/net/asterisk-addons/ is installed.

Edit the file /usr/local/etc/asterisk/musiconhold.conf

[[default]]
mode=files
directory=/usr/local/moh-asterisk
random=yes

Now copy the mp3s in the folder /usr/local/moh-asterisk and restart asterisk. You can test MoH with editing extensions.conf:

exten => 50,1,Answer
exten => 50,2,MusicOnHold
exten => 50,3,HangUp

Now dial 50 and you should hear MoH.

CDR

Create a file mysql_odbc:

[[MySQL]]
Description     = MySQL ODBC MyODBC Driver
Driver          = /usr/local/lib/libmyodbc3.so
FileUsage       = 1

Then load the file with:

odbcinst -i -d -f  mysql_odbc

Create a file mysql_odbc_ini:

[[MySQL-asterisk]]
Description     = MySQL ODBC Driver Testing
Driver          = MySQL
Socket          = /tmp/mysql.sock
Server          = localhost
User            = username
Password        = password
Database        = asteriskcdrdb
Option          = 3
  - Port            ======

Then load the file with:

odbcinst -i -s -f mysql_odbc_ini

To test it:

isql MySQL-asterisk <username> <password>

Create the file /usr/local/etc/asterisk/cdr_odbc.conf:

;
; cdr_unixodbc.conf
;

[[global]]
dsn=MySQL-asterisk
username=<username>
password=<password>
loguniqueid=yes

Create the following table in the mysql database:

CREATE TABLE cdr (
 calldate datetime NOT NULL default '0000-00-00 00:00:00',
 clid varchar(80) NOT NULL default //,  
 src varchar(80) NOT NULL default //,  
 dst varchar(80) NOT NULL default //,  
 dcontext varchar(80) NOT NULL default //,  
 channel varchar(80) NOT NULL default //,  
 dstchannel varchar(80) NOT NULL default //,  
 lastapp varchar(80) NOT NULL default //,  
 lastdata varchar(80) NOT NULL default //,  
 duration int(11) NOT NULL default '0',  
 billsec int(11) NOT NULL default '0',  
 disposition varchar(45) NOT NULL default //,  
 amaflags int(11) NOT NULL default '0',  
 accountcode varchar(20) NOT NULL default //,  
 uniqueid varchar(32) NOT NULL default //,  
 userfield varchar(255) NOT NULL default //  ```
);

Capi

For active ISDN cards with FreeBSD 5.x use Capi for BSD from the side http://www.shellbang.org/freebsd/introducingc4b.html and http://www.shellbang.org/freebsd/asteriskcapi.html .

For FreeBSD 6.x and newer use I4B (active cards are not working right now (ITK TK1)).
Get the new version with subversion:

mkdir -p /usr/local/src/i4b
cd !$
svn --username anonsvn --password anonsvn checkout svn://svn.turbocat.net/i4b

Go to the directory:

/usr/local/src/i4b/i4b/trunk/i4b/module

compile module with:

make depend all install
cd ../src/sys/dev/usb
cp usb_subr*[[ch]] /usr/src/sys/dev/usb/
make -C /usr/src/sys/modules/usb all install

ok now it’s time to reboot. After the pc is up again, load the kernel modules with:

kldload usb
kldload i4b

If you got an error message here be sure that usb is not included in the kernel, remove it recompile kernel and reboot again.

To debug use:

isdnconfig -u 0 -p DRVR_DSS1_NT
isdndecode -u 0 -i -o -x

cd /usr/local/src/i4b/i4b/trunk/i4b/FreeBSD.i4b

enter

make distclean
make clean 
make S=../src package
make install
make install-userspace

Configure the Kernelconfiguration

#  I4B section
#
options IPR_VJ
device "i4bdss1"
device "i4b"
device "i4btrc"
device "i4bctl"
device "i4brbch"
device "i4btel"
device "i4bipr"
device "i4bisppp"
#
device ihfc
device usb
device pcm
#or device sound
#if device pcm does not exist

Recompile the kernel with (my kernel file is SERVER2, use your file here)

cd /usr/src && make buildkernel installkernel KERNCONF=SERVER2_I4B -DNOCLEAN -DNO_CLEAN

The Backupkernel can be found under:

/usr/local/src/i4b/i4b/devfs/trunk/FreeBSD.i4b/kernel

Reboot the system.

Now we can test if the isdn card is working. I use two ISDN cards, one in NT mode (device 0) and one in TE mode (device 1). For the device 0 (NT-mode) a crosslink ISDN cable is necessary. Connect for TE mode your ISDN card to your ISDN bus (ISDN phone has number *93 at home). Connect for NT mode a phone to a NTBA with a crosslinked cable (ISDN phone has number 93).

isdnconfig -u 0 -p DRVR_DSS1_NT
capitest -u 0 -o "93"
capitest -u 1 -o "*93"

For both tests the phone should ring.

Now compile and install the chan_capi module:

cd /usr/local/src/i4b/i4b/trunk/chan_capi
gmake
gmake install
gmake clean

Now make the configuration in asterisk. Edit capi.conf:

[general]
nationalprefix=0
internationalprefix=00
rxgain=1.0
txgain=1.0
digit_timeout=2

[ISDNTE]          ;this example interface gets name 'ISDN1' and may be any
                 ;name not starting with 'g' or 'contr'.
isdnmode=msn     ;'MSN' (point-to-multipoint)
incomingmsn=*    ;allow incoming calls to this list of MSNs/DIDs, * == any
controller=1     ;ISDN4BSD default (first controller)
group=1          ;dialout group
;prefix=0        ;set a prefix to calling number on incoming calls
softdtmf=on      ;enable/disable software dtmf detection, recommended for AVM cards
relaxdtmf=on     ;in addition to softdtmf, you can use relaxed dtmf detection
accountcode=     ;Asterisk accountcode to use in CDRs
context=capi-extern ;context for incoming calls
holdtype=local   ;when Asterisk puts the call on hold, ISDN HOLD will be used. If
                 ;set to 'local' (default value), no hold is done and Asterisk may
                 ;play MOH.
;immediate=yes   ;immediate start of pbx with extension 's' if no digits were
                 ;received on incoming call (no destination number yet)
echocancel=no    ;disable echo canceller
echosquelch=no   ;primitive echo suppression
;echocancelold=yes;use facility selector 6 instead of correct 8 (necessary for older eicon drivers)
;echotail=64     ;echo cancel tail setting
;bridge=yes      ;native bridging (CAPI line interconnect) if available
;callgroup=1     ;Asterisk call group
;deflect=1234567 ;deflect incoming calls to 1234567 if all B channels are busy
devices=2        ;number of concurrent calls on this controller
                 ;(2 makes sense for single BRI, 30 for PRI)

[ISDNNT]          ;this example interface gets name 'ISDN1' and may be any
                 ;name not starting with 'g' or 'contr'.
isdnmode=did     ;'MSN' (point-to-multipoint)
ntmode=yes
incomingmsn=*    ;allow incoming calls to this list of MSNs/DIDs, * == any
controller=0     ;ISDN4BSD default (first controller)
group=1          ;dialout group
;prefix=0        ;set a prefix to calling number on incoming calls
softdtmf=on      ;enable/disable software dtmf detection, recommended for AVM cards
relaxdtmf=on     ;in addition to softdtmf, you can use relaxed dtmf detection
accountcode=     ;Asterisk accountcode to use in CDRs
context=capi-intern ;context for incoming calls
holdtype=local   ;when Asterisk puts the call on hold, ISDN HOLD will be used. If
                 ;set to 'local' (default value), no hold is done and Asterisk may
                 ;play MOH.
;immediate=yes   ;immediate start of pbx with extension 's' if no digits were
                 ;received on incoming call (no destination number yet)
echocancel=yes    ;disable echo canceller
echosquelch=no   ;primitive echo suppression
;echocancelold=yes;use facility selector 6 instead of correct 8 (necessary for older eicon drivers)
;echotail=64     ;echo cancel tail setting
bridge=yes      ;native bridging (CAPI line interconnect) if available
;callgroup=1     ;Asterisk call group
;deflect=1234567 ;deflect incoming calls to 1234567 if all B channels are busy
devices=2        ;number of concurrent calls on this controller
                 ;(2 makes sense for single BRI, 30 for PRI)

Write e.g. the following in your extensions.conf:

[capi-in]
exten => 97,1,Ringing
exten => 97,2,Set(LANGUAGE()=de)
exten => 97,3,GotoIf($["${CALLERID}" = "91"]?97,1000) ; Myself, move to voicemail Menu
exten => 97,4,GotoIf($["${CALLERID}" = "92"]?97,1000) ; Myself, move to voicemail Menu
exten => 97,5,GotoIf($["${CALLERID}" = "93"]?97,1000) ; Myself, move to voicemail Menu
exten => 97,6,GotoIf($["${CALLERID}" = "94"]?97,1000) ; Myself, move to voicemail Menu
exten => 97,7,GotoIf($["${CALLERID}" = "12"]?97,1000) ; Myself, move to voicemail Menu
exten => 97,8,GotoIf($["${CALLERID}" = "13"]?97,1000) ; Myself, move to voicemail Menu
exten => 97,9,GotoIf($["${CALLERID}" = ""]?97,2000) ; No dialnumber move to voicemail
exten => 97,10,DIAL(${IDEFIXGROUP})
exten => 97,11,Hangup
exten => 97,1000,Answer
exten => 97,1001,VoicemailMain(2000) ; hear voicemail
exten => 97,1002,Hangup
; Caller without number, wait and then transfer to voicemail
exten => 97,2000,DIAL(${IDEFIXGROUP},15,j) ; No dialnumber, move to voicemail after some seconds
exten => 97,2001,Answer
exten => 97,2002,Voicemail(u2000)
exten => 97,2003,Hangup
; No callerid, no phone available
exten => 97,2101,Wait(15)
exten => 97,2102,Answer
exten => 97,2103,Voicemail(u2000)
exten => 97,2104,Hangup

[iax-out]
; Call from VoIP to ISDN
exten => _*.,1,Dial(CAPI/ISDN1/98:${EXTEN:1})
exten => _*.,2,Congestion
exten => _*.,3,HangUp

Now we must fix the permission problem with the capi device. For this we edit the file /etc/devfs.conf:

own     capi20  root:asterisk
perm    capi20  0660

Restart asterisk with:

asterisk -r
restart gracefully

CAPI from ports

To simplify installation Hans Petter moved everything to ports. To install by ports download it with:

svn --username anonsvn --password anonsvn \
      checkout svn://svn.turbocat.net/i4b/trunk/ports

Cleanup old files:

rm -f /usr/lib/libcapi*
rm -f /usr/share/man/*/i4b*
rm -f /usr/share/man/*/ihfc*
rm -f /usr/share/man/*/iavc*
rm -f /usr/share/man/*/capi20*
rm -f /usr/sbin/isdn*
rm -f /usr/sbin/capi*
rm /boot/kernel/i4b.ko

To install or upgrade:

svn up
cd comms

cd libcapi
make deinstall
make all install clean
cd ..

cd isdn4bsd-kmod
make deinstall
make all install clean
cd ..

cd isdn4bsd-utils
make deinstall
make all install clean
cd ..

cd chan_capi
make deinstall
make all install clean
cd ..

reboot

Debugging ISDN Protocol

You can trace the protocol with:

isdndecode -u 1 -i -o -x

Hardphones

  • The Grandstream GXP-2000 is working fine here with firmware 1.1.0.13.
  • Linksys SPA-941/942 I recommend the Linksys/Cisco/Sipura SPA-941
  • Polycom 501/601
  • Cisco 7960
  • Polycom 301
  • Snom 320/360

The pa1688 soon to be ra-1688 chipp speaks iax/sip/h323 Yughen phones YWH 10/12 YWH 100/110 to stata a few.

Yughen phones speak iax. ywh10 ywh12 ywh10 to point out a few PA 1688 chip set now new ar 1688 chip

http://www.voip-info.org/wiki/view/VOIP+Phones+Reviews

Good phones could be:

Softphones

IAX2 Software: http://www.marccharbonneau.com/asterisk/mediaxphone.php

SIP Software: http://www.kapanga.net/IP/home.cfm

Sipgate

Edit sip.conf and sip_custom.conf replace with the 7 digit username and with the sip-password:

sip.conf:

[general]
...
disallow=all                    ; First disallow all codecs
;allow=speex
allow=alaw
allow=ulaw                      ; Allow codecs in order of preference
allow=g729
allow=slinear
allow=gsm
allow=ilbc                      ; Note: codec order is respected only in [general]
nat=yes
register => <userid>:<password>@sipgate.de/<userid>

sip_custom.conf

[sipgate-out]
type=friend
context=incoming_sipgate
username=<userid>
fromuser=<userid>
authuser=<userid>
secret=<password>
host=sipgate.de
fromdomain=sipgate.de
;dtmfband=inband
insecure=very ; otherwise I get authentication errors
nat=yes
qualify=yes
canreinvite=no

[200]
type=friend
username=testuser
secret=geheim
host=dynamic
dtmfmode=rfc2833
context=sip-out
canreinvite=no
mailbox=2000@default

Edit extensions_custom.conf:

[incoming_sipgate]
exten => <userid>,1,Ringing
exten => <userid>,2,Set(LANGUAGE()=de)
exten => <userid>,3,DIAL(${IDEFIXGROUP})
exten => <userid>,4,Hangup

exten => _X.,1,NoOp(--- ${CALLERID} calling on sipgate (${EXTEN}) ---)
exten => _X.,2,Set(LANGUAGE()=de)
exten => _X.,3,Ringing
exten => _X.,4,Wait,4
exten => _X.,5,Answer
exten => _X.,6,Playback(invalid)
exten => _X.,7,Hangup

[sip-out]
include => sip-sipgate-out

[sip-sipgate-out]
exten => _1XXX.,1,SetCallerId(<userid>)
exten => _1XXX.,2,Dial(SIP/${EXTEN:1}@sipgate-out,,trRg)
exten => _1XXX.,3,Hangup

Sipport

Sipport can use SIP and IAX2 so I splitted it into two sections.

SIP

Replace with the user sipXXXXX and with your SIP password, edit sip.conf:

[general]
...
qualify=yes
disallow=all                    ; First disallow all codecs
;allow=speex
allow=alaw
allow=ulaw                      ; Allow codecs in order of preference
allow=g729
allow=slinear
allow=gsm
allow=ilbc                      ; Note: codec order is respected only in [general]
nat=yes
register => <userid>:<password>@sip.sipport.de

Edit sip_custom.conf

[sipportunity-out]
type=friend
context=incoming_portunity
username=<userid>
fromuser=<userid>
authuser=<userid>
secret=<password>
host=sip.sipport.de
fromdomain=sip.sipport.de
;dtmfband=inband
;insecure=very ; otherwise I get authentication errors
nat=yes
qualify=yes
canreinvite=no

[200]
type=friend
username=testaccount
secret=geheim
host=dynamic
dtmfmode=rfc2833
context=sip-out
canreinvite=no
;callerid=5550273
mailbox=2000@default

The incoming rule [incoming-portunity] for IAX2 and SIP is equal, edit extensions_custom.conf:

[incoming-portunity]
exten => s,1,DIAL(${IDEFIXGROUP})
exten => s,2,Hangup
;exten => s,1,NoOp(--- ${CALLERID} calling on portunity over IAX2 (${EXTEN}) ---)
;exten => s,2,Set(LANGUAGE()=de)
;exten => s,3,Ringing
;exten => s,4,Wait,4
;exten => s,5,Answer
;exten => s,6,Playback(invalid)
;exten => s,7,Hangup

[sip-out]
include => sip-sipport-out
...

[sip-sipport-out]
; with leading 2 using SIP-sipport
exten => _2XXX.,1,Dial(SIP/${EXTEN:1}@sipportunity-out,,trRg)
exten => _2XXX.,2,Hangup

IAX2

Replace with the iax-userid iaxXXXXX and with your IAX2 password, edit iax.conf:

[general]
...
register => <userid>:<password>@iax.iaxport.de

Edit iax_custom.conf:

[portunity-out]
type=peer
host=iax.iaxport.de
username=<userid>
secret=<password>
;peercontext=iaxport
context=incoming-portunity
;notransfer=yes

[portunity-in]
type=user
context=incoming-portunity
permit=82.139.223.1/255.255.255.255
disallow=all
allow=ulaw     ; asterisk 1.2.8 seems to have a codec problem so force it to ulaw
;allow=alaw
;allow=gsm

[202]
type=friend
host=dynamic
context=iax-out
username=testaccount
secret=geheim
permit=192.168.0.0/255.255.255.0
mailbox=2000@default
notransfer=1

The dialin context [incoming-portunity] is for IAX2 and SIP equal, edit extensions_custom.conf:

[incoming-portunity]
exten => s,1,DIAL(${IDEFIXGROUP})
exten => s,2,Hangup
;exten => s,1,NoOp(--- ${CALLERID} calling on portunity over IAX2 (${EXTEN}) ---)
;exten => s,2,Set(LANGUAGE()=de)
;exten => s,3,Ringing
;exten => s,4,Wait,4
;exten => s,5,Answer
;exten => s,6,Playback(invalid)
;exten => s,7,Hangup

[iax-out]
include => iax2-sipport-out

[iax2-sipport-out]
; with leading 3 using IAX-sipport
exten => _3XXX.,1,Dial(IAX2/portunity-out/${EXTEN:1},,trRg)
exten => _3XXX.,2,Hangup

BLF

Edit extensions_custom.conf:

...
[iax-out]
include => internal
...

[sip-out]
include => internal
...

[internal]
include => hint

exten => 200,1,Dial(SIP/200)
exten => 200,2,Hangup

exten => 201,1,Dial(SIP/201)
exten => 201,2,Hangup

exten => 202,1,Dial(IAX2/202)
exten => 202,2,Hangup

[hint]
exten => 200,hint,SIP/200
exten => 201,hint,SIP/201
exten => 202,hint,IAX2/202
...

Edit sip.conf:

[general]
...
subscribecontext=hint
...

Reload asterisk and control it with:

asterisk -r
reload
show hints

You should see something like:

    -= Registered Asterisk Dial Plan Hints =-
   202                 : IAX2/202              State:Idle            Watchers  1
   201                 : SIP/201               State:Idle            Watchers  1
   200                 : SIP/200               State:Unavailable     Watchers  1
----------------
- 3 hints registered

Now configure your phone to display the status.

Fax

We will use iaxmodem and hylafax.

Install necessary software:

cd /usr/ports/comms/spandsp-devel
make install
cd /usr/ports/net/iaxmodem/
make install
cd /usr/ports/comms/hylafax
make install

Asterisk can receive and send fax with spandsp and the application app_rxfax and app_txfax. Test the script with:

/usr/local/share/asterisk/scripts/fax2mail "54" "" "1" "email" "/var/spool/asterisk/fax/1157137152.7"

Receiving a fax

Edit the extensions.conf:

; =========== START fax stuff ===========                                                                                                                                                                       
[macro-faxreceive]                                                                                                                                                                                              
 exten => s,1,Wait(3)                                                                                                                                                                                           
 exten => s,n,SetVar(SCRIPTFILE=/usr/local/share/asterisk/scripts/fax2mail)                                                                                                                                     
 exten => s,n,SetVar(FAXFILE=/var/spool/asterisk/fax/${UNIQUEID})                                                                                                                                               
 exten => s,n,SetVar(MAILADDR=idefix@fechner.net)                                                                                                                                                               
 exten => s,n,rxfax(${FAXFILE})                                                                                                                                                                                 
 exten => s,n,system("${SCRIPTFILE}" "${CALLERIDNUM}" "${CALLERIDNAME}" "${FAXPAGES}" "${MAILADDR}" "${FAXFILE}")                                                                                               
                                                                                                                                                                                                                
[fax]                                                                                                                                                                                                           
 exten => 666,1,Macro(faxreceive)                                                                                                                                                                               
 exten => 666,2,Hangup                                                                                                                                                                                          
; ^^^^^^^^^^^^^^ END fax stuff ^^^^^^^^^^^^^^                                                                                                                                                                   

Install perl modules:

cd /usr/ports/mail/p5-MIME-Lite
make install clean

Use the script /usr/local/share/asterisk/scripts/fax2mail:

#!/usr/local/bin/perl                                                                                                                                                                                           
                                                                                                                                                                                                                
use strict;                                                                                                                                                                                                     
use MIME::Lite;                                                                                                                                                                                                 
use File::Temp qw(tempdir);                                                                                                                                                                                     
                                                                                                                                                                                                                
my $emailFrom= 'email';                                                                                                                                                                               
                                                                                                                                                                                                                
my $faxFrom=shift(@ARGV);                                                                                                                                                                                       
my $faxFromName=shift(@ARGV);                                                                                                                                                                                   
my $faxPages=shift(@ARGV);                                                                                                                                                                                      
my $emailTo=shift(@ARGV);                                                                                                                                                                                       
my $file=shift(@ARGV);                                                                                                                                                                                          
                                                                                                                                                                                                                
system("tiff2pdf -o $file.pdf -j $file");                                                                                                                                             
                                                                                                                                                                                                                
my $mail=new MIME::Lite(                                                                                                                                                                                        
                        From => $emailFrom,                                                                                                                                                                     
                        To => $emailTo,                                                                                                                                                                         
                        Type => 'text/plain; charset=iso-8859-1',                                                                                                                                               
                        Subject => sprintf('Fax from %s (%s)',$faxFrom,$faxPages),                                                                                                                              
                        Data => sprintf('Fax station ID of the sender..: %s                                                                                                                                     
Caller-ID of the sender.......: %s                                                                                                                                                                              
Number of pages...............: %d',$faxFrom,$faxFromName,$faxPages)                                                                                                                                            
                        );                                                                                                                                                                                      
$mail->attach(                                                                                                                                                                                                  
              Type => 'application/pdf',                                                                                                                                                                        
              Filename => sprintf('Fax.pdf'),                                                                                                                                                                   
              Path => "$file.pdf"                                                                                                                                                                               
              );                                                                                                                                                                                                
$mail->send();                                                                                                                                                                                                  
unlink("$file.pdf");                                                                                                                                                                                            

Sending a Fax

Download http://www.inter7.com/eps/eps-1.5.tar.gz .

tar xzvf eps-1.5.tar.gz
cd eps-1.5

Edit Makefile:

LIBDIR = /usr/local/lib
INCDIR = /usr/local/include/eps

Compile and install it with:

make
make install
make clean

Download http://www.inter7.com/astfax/astfax-1.0.tar.gz .

tar xzvf astfax-1.0.tar.gz
cd astfax-1.0

Edit Makefile:

DEFS=-Wall -I/usr/local/include/eps -DVERSION=1.0
LIBS=-leps -L/usr/local/lib

Compile it with:

make

Now we configure ast_fax by editing the file ast_fax.call:

Channel: CAPI/ISDNTE/FROMNUMBER:$[[PHONE]]/b
MaxRetries: 0
WaitTime: 20
Application: txfax
Data: $[[FILE]]|caller

Now we can test if astfax works correctly:

cp testfax.eml my_testfax.eml

Edit my_testfax.eml.

From: <idefix@fechner.net>
To: <54@fax>

Now send it with:

cat my_testfax.eml|./ast_fax

Adding G.722 - Support

To add support for G.722, decompress and copy this File to /usr/local/lib/asterisk/modules/: Download compressed codec here: Codec g722.so.tar.bz2

It’s possible the File “libpthread.so.0” is missing. You can avoid this by creating /etc/libmap.conf and add/enter the following code:

[/usr/local/lib/asterisk/modules/codec_g722.so]
libpthread.so.0         libpthread.so.2

LDAP Lookup

For asterisk 1.4 I used an asterisk addon that searches the name for the given phonenumber in my ldap directory. With the update of asterisk to version 1.6 that addon stops compiling. I replaced now the line:

exten => s,n,Set(CALLERID(name)=${SHELL(ldapsearch -w password -D "cn=x,dc=x,dc=x" -h localhost -b "ou=people,dc=x,dc=x" -s children 
"(&(objectClass=person)(|(telephoneNumber=${CALLERID(number)})(otherPhone=${CALLERID(number)})(primaryPhone=${CALLERID(number)})
(companyPhone=${CALLERID(number)})(mobile=${CALLERID(number)})(homePhone=${CALLERID(number)})(pager=${CALLERID(number)})
(primaryPhone=${CALLERID(number)})))" cn | grep ^cn |
perl -MMIME::Base64 -lpe 's/^([^:]*:):(\s*)(.*)/"$1$2".decode_base64($3)/e' |cut -d: -f2 | xargs echo -n)})