Skip to content

Instantly share code, notes, and snippets.

@frazei
Last active March 11, 2021 16:12
Show Gist options
  • Save frazei/3b0b370d52bad4ee00d533102b2803b9 to your computer and use it in GitHub Desktop.
Save frazei/3b0b370d52bad4ee00d533102b2803b9 to your computer and use it in GitHub Desktop.
Come configurare FOIP su FreePBX in modo pulito #asterisk #freepbx #voip #t.38 #hylafax

Come configurare FOIP su FreePBX in modo pulito

Cos'è il FOIP?

Fax Over IP è in pratica la trasmissione/ricezione di FAX tramite una linea VOIP, senza una linea telefonica RTG o ISDN.

Perchè una cosa apparentemente così semplice merita una guida ad hoc?

Perchè ho scoperto che nel corso degli anni si sono stratificate molte informazioni, guide e idee sbagliate/confuse al riguardo. Molte di queste idee risalgono al periodo in cui il fax veniva gestito esclusivamente tramite linee telefoniche tradizionali che avevano moltissime complessità in meno rispetto al VOIP. La configurazione tipica, in caso di centrale Asterisk, era la seguente: linea telefonica > asterisk > iax modem > hylafax. Questo tipo di configurazione andava bene perchè sulle linee tradizionali non è necessario implementare il protocollo T.38, che serve proprio per permettere in modo affidabile la trasmissione di fax su linee VOIP. Pertanto se io configuro una centrale Asterisk con una linea VOIP utilizzando il metodo qui sopra otterrò un sistema molto poco affidabile, che sarà in grado di gestire fax solo verso un numero ristretto di interlocutori (altri dispositivi fisici e non VOIP che non utilizzano il T.38). Il problema principale è che la componente "iax modem" non supporta il T.38!

Gestire i fax su Asterisk senza Hylafax è possibile?

Asterisk implementa già da tempo spandsp che al suo interno contiene una macchina FAX completa con il supporto al T.38. Il modulo Fax Pro di FreePBX si basa appunto su questa funzionalità ed in questa guida percorrerò tutte le fasi necessarie a configurare Asterisk in modo che supporti la ricezione e l'invio di FAX con/senza Fax Pro.

Creare una linea gratuita Orchestra

Il servizio IRIDEOS Orchestra (che prima si chiamava Clouditalia Orchestra e che ancora prima si chiamava Eutelia) permette di sottoscrivere una linea FAX gratuita per i fax in entrata.

Lo stesso servizio permette anche di ottenere una linea telefonica gratuita che può essere configurata su un qualsiasi client SIP o su un centralino Asterisk/FreePBX per ricevere chiamate su linea urbana o per effettuare chiamate (gratuitamente verso altre numerazioni Eutelia).

In questo caso, invece di utilizzare il servizio fax di Eutelia, per fare delle prove, ho voluto utilizzare il mio centralino per gestire i fax. Ovviamente la guida qui sotto rimane valida per qualsiasi linea VOIP IRIDEOS/Clouditalia/Eutelia ed in generale dovrebbe essere valida per qualsiasi altro provider.

Predisposizione di Asterisk tramite FreePBX

Questa guida è stata creata su un NethServer 7.9.2009 su cui è stato installato FreePBX 14.0.16.4 tramite il software center integrato.

Configurazioni di base

  1. Dalla dashboard di FreePBX selezionare "Settings" > "Asterisk SIP Settings"
  2. Nella sezione "General SIP Settings":
# General SIP Settings #
	- Configurare attentamente la sezione "NAT Settings"
	[Audio Codecs]
		- T38 Pass-Through = Yes
		- Codecs = alaw, ulaw
# Chan PJSIP Settings #
	- upd - 0.0.0.0 - All = Yes
	- Port to Listen On = 5060
  1. Dal menu di FreePBX selezionare "Admin" > "Module Admin" ed installare i moduli "User Management" e "Fax Configuration"

Nota riguardo il codec G.711: there are two varieties of this Codec, namely U-law and A-Law. U-law is typically utilised within North America and Japan, whilst A-law is typically used by the rest of the world. G.711 will give the best call quality for VoIP on the basis that it uses no compression at all, and as a result, the call quality sounds like using a regular ISDN phone. This Codec is supported by most VoIP providers.

Configurare il trunk VOIP

  1. Dal menu di FreePBX selezionare "Connectivity" > "Trunks"
  2. Dal menu "Add Trunk" click su "Add SIP (chan_pjsip) Trunk"
  3. Compila i campi qui sotto: [numero],[password] = sono i valori assegnati da orchestra; i campi non specificati vanno lasciati come sono di default.
# General #
	- Trunk Name = [numero]
	- Outbound CallerID = [numero]
# pjsip Settings #
	[General]
		- Username = [numero]
		- Secret = [password]
		- SIP Server = voip.eutelia.it
		- SIP Server Port = 5060
	[Advanced]
		- Contact User = [numero]
		- From Domain = voip.eutelia.it
		- Support T.38 UDPTL = Yes
		- T.38 UDPTL Error Correction = Redundancy
		- T.38 UDPTL NAT = Yes
		- T.38 UDPTL MAXDATAGRAM = 400
		- Fax Detect = No

Creare una nuova extension

  1. Dal menu di FreePBX selezionare "Applications" > "Extensions"
  2. Dal menu "Add Extension" click su "Add New Virtual Extension"
# General #
	- User Extension = 1199
	- Display Name = FAX
	- Select User Directory = PBX Internal Directory
	- Link to a Default User = Create New User
  1. Dal menu di FreePBX selezionare "Admin" > "User Management"
  2. Editare l'utente 1199 appena creato
  3. Nel tab "User Details" inserire la mail a cui i fax in entrata saranno inoltrati nella voce Email Address
  4. Nel tab "FAX" selezionare
	- Enabled = YES
	- Attachment Format = PDF

Completare la configurazione FAX

  1. Dal menu di FreePBX selezionare "Settings" > "Fax Configuration"
  2. Compilare i seguenti campi:
	- Default Fax header
	- Default Local Station Identifier
	- Outgoing Email address = indirizzo da cui arriveranno le notifiche email
	- Email address = lascialo vuoto se vuoi che venga utilizzato quello dell`utente sopra creato
	- Error Correction Mode = Yes
	- Maximum transfer rate = 14400
	- Minimum transfer rate = 9600
	- Default Paper Size = A4

Verifiche varie

Questi comandi non servono a nulla, ma sono utili per verificare che sia tutto ok.

# asterisk -rv
> module show like fax
Module                         Description                              Use Count  Status      Support Level
res_fax.so                     Generic FAX Applications                 1          Running              core
res_fax_spandsp.so             Spandsp G.711 and T.38 FAX Technologies  0          Running          extended
2 modules loaded
> fax show version
FAX For Asterisk Components:
        Applications: 13.38.1
        Spandsp FAX Driver: 20110122 075024
> fax show settings
FAX For Asterisk Settings:
        ECM: Enabled
        Status Events: Off
        Minimum Bit Rate: 9600
        Maximum Bit Rate: 14400
        Modem Modulations Allowed: V17,V27,V29
        T.38 Negotiation Timeout: 5000


FAX Technology Modules:

Spandsp (Spandsp FAX Driver) Settings:
> fax show capabilities 


Registered FAX Technology Modules:

Type            : Spandsp
Description     : Spandsp FAX Driver
Capabilities    : SEND RECEIVE T.38 G.711 GATEWAY

1 registered modules

FAX in entrata

Creare la rotta in entrata

  1. Dal menu di FreePBX selezionare "Connectivity" > "Inbound Routes"
  2. Click su "Add Inbound Route"
# General #
	- Description = default
	- DID Number = ANY
	- CallerID Number = ANY
	- Set Destination = Fax Recipient / FAX (1199)
# Fax #
	- Detect Faxes = No

Ricezione del FAX

Eseguiti tutti i passaggi qui sopra il centralino sarà in grado di ricevere correttamente FAX sulla linea telefonica Orchestra, sia da dispositivi tradizionali su linee tradizionali, sia da sistemi VOIP che anche da dispositivi tradizionali connessi a VOIP tramite FXS. Il FAX ricevuto sarà trasformato in PDF ed inviato all'indirizzo e-mail specificato (NOTA: si presume che nel NethServer sia stato correttamente configurato l'invio di e-mail, ad esempio tramite uno smarthost). Qualora sia necessario attivare ulteriori trunk VOIP o altre rotte in entrata basterà seguire le istruzioni qui sopra. Possono essere realizzate molteplici combinazioni tra trunks/extensions/routes per gestire tutti i casi possibili.

FAX in uscita

Per l'invio dei FAX ci sono due alternative: la prima consiste nell'acquisto del modulo FAX Pro per FreePBX, la seconda richiede un po' di lavoro manuale. Ovviamente io ho percorso la seconda ma cito la prima per completezza.

Si tratta di una componente inclusa nella subscription a pagamento di FreePBX che consente la gestione completa dei FAX in entrata ed in uscita. La cosa interessante è che è integrata all'interno del pannello web UCP che permette agli utenti del sistema di gestirsi i FAX in entrata ed in uscita in modo molto semplice.

ReceiveFAX() e SendFAX()

ReceiveFAX() e SendFAX() sono due applicazioni integrate in Asterisk che sfruttano il sopra citato spandsp. Per verificare che siano installate è possibile lanciare il comando > core show applicationsdalla console di Asterisk.

Pur non avendola ancora citata esplicitamente, la applicazione ReceiveFAX() è quella che abbiamo utilizzato qui sopra per abilitare la ricezione dei FAX direttamente dalla interfaccia di FreePBX, come si può vedere aprendo il file /etc/asterisk/extensions_additional.conf.

Il fatto che FreePBX, per utilizzare la applicazione SendFAX(), richieda la sottoscrizione di una licenza, non significa che il sistema non sia già dotato di tutte le componenti necessarie per inviare FAX.

Extensions Custom

Per cominciare è necessario creare una destinazioni personalizzata (contesto del dialplan) che potremo utilizzare come rotta in uscita dei nostri FAX. Per farlo, su NethServer, è opportuno utilizzare e-smith in modo da essere sicuri che la configurazione non venga sovrascritta successivamente da un aggiornamento di sistema.

  1. Creare il custom template in /etc/e-smith delle extensions:
# cd /etc/e-smith/templates-custom
# mkdir -p etc/asterisk/extensions_custom.conf/
# cd etc/asterisk/extensions_custom.conf/
# vim sendfax
  1. Il testo da inserire prevede 1 extension per i fax in invio e 3 per i diversi output della funzione:
[sendfax]
exten => s,1,Noop(Sending Fax to: $\{dest\})
exten => s,n,Set(FAXOPT(headerinfo)=$\{headerinfo\})
exten => s,n,Set(FAXOPT(localstationid)=$\{localstationid\})
exten => s,n,SendFAX($\{faxfile\},d)
exten => failed,1,Set(FAXSTATUS=DIALFAIL)
exten => failed,n,Set(FAXERROR=No Answer)
exten => failed,n,Set(FAXPAGES=0)
exten => failed,n,Hangup
exten => h,1,NoOp(FaxStatus : $\{FAXSTATUS\})
exten => h,n,NoOp(FaxStatusString : $\{FAXSTATUSSTRING\})
exten => h,n,NoOp(FaxError : $\{FAXERROR\})
exten => h,n,NoOp(RemoteStationID : $\{REMOTESTATIONID\})
exten => h,n,NoOp(FaxPages : $\{FAXPAGES\})
exten => h,n,NoOp(FaxBitRate : $\{FAXBITRATE\})
exten => h,n,NoOp(FaxResolution : $\{FAXRESOLUTION\})
exten => h,n(sendfax),System($\{AMPBIN\}/fax2mail.php --remotestationid "$\{REMOTESTATIONID\}" --dest "$\{dest\}" --to $\{email\} --file $\{faxfile\} --direction "outgoing")

  1. Espandere il template:
# expand-template /etc/asterisk/extensions_custom.conf
  1. Fare il reload di asterisk
# asterisk -rx "core reload"

Creare un callfile

Asterisk ci da la possibilità di generare una chiamata (nel nostro caso un FAX in uscita) tramite uno spool nel quale è sufficiente inserire un file di testo. Questo file si chiama callfile. Lo spool di default si trova in /var/spool/asterisk/outgoing/.

  1. Creare un callfile a mano faxtest.call che contenga il seguente testo in cui sostituire [destinatario],[mittente],[email] e [file.tif]:
Channel: Local/[destinatario]@outbound-allroutes
MaxRetries: 1
RetryTime: 30
WaitTime: 30
Context: sendfax
Extension: s
Priority: 1
Set: faxfile=[file.tif]
Set: headerinfo=FAX TEST
Set: localstationid=[numero]
Set: dest=[destinatario]
Set: email=[email]
  1. Mandare il call file in esecuzione:
# chown asterisk:asterisk faxtest.call
# mv faxtest.call /var/spool/asterisk/outgoing
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment