Fax über VoIP

Faxübertragungen sind Datenverbindungen, die einen sehr konstanten Datenstrom brauchen und andere Frequenzen als die menschliche Sprache verwenden. Daher muß eine auf Sprache ausgerichtete, nicht verlustfrei arbeitende Kompremierung der Frequenzen bei Faxen unweigerlich zu Fehlern führen. Auch sind IP-Netze nicht auf einen gleichmäßigen Datenstrom ausgelegt, so dass kleine Aussetzer, die der Mensch im VoIP Gespräch vielleicht noch nicht einmal wahrnimmt, leicht eine Fax-Verbindung stören können.

Solange Fax-Server oder -Geräte direkt an das leitungsgebundene Telefonnetz angeschlossen waren, gab es daher hier auch kaum Probleme. Bei einem VoIP-Anschluss fehlt es nun jedoch an dieser für Faxgeräte notwendigen, sehr zuverlässigen leitungsgebundenen Anbindung.

Um auch zuverlässig über eine Voice-over-IP (VoIP) Verbindung in Echtzeit faxen zu können, wird das Protokoll T.38 benötigt. In diesem werden die Spezifikationen der Fax-Übertragung dazu verwendet, eine zuverlässigere Verbindung durch künstliche Redundanz zwischen den Fax-Geräten herzustellen, um so Fax-Abbrüche, die auf den typischen Merkmalen einer Paket-basierten Anbindung (Verzögerungen (delay), Laufzeitschwankungen (jitter) und Paketverlust (paket loss)) basieren, deutlich zu reduzieren.
Leider sind die T.38 Spezifikationen jedoch nicht alle kompatibel umgesetzt worden. Als besonders zuverlässig gilt dabei das von Steve Underwood entwickelte FreeSWITCH-Modul mod_spandsp. Mit ihm lassen sich die wesentlichen Funktionen eines elektronischen Fax-Servers, wie Hylafax, leicht direkt in FreeSWITCH nachbilden, auch wenn mit GOfax.ip seine Anbindung ohne virtuelle Modems möglich wäre.

Auch wenn der Provider kein T.38 unterstützt, können möglicherweise (in Abhängigkeit der jeweiligen Netzwerkverbindung) trotzdem längere Faxe empfangen werden. Wir haben dies mit den folgenden Einstellungen für die Rufnummer 82242457 im Dialplan erfolgreich bei uns getestet:

 <extension name="fax-eingang">
  <condition field="destination_number" expression="^(82242457)$">
   <action application="export" data="absolute_codec_string=PCMA,PCMU"/> 
   <action application="ring_ready"/>
   <action application="set" data="ringback=${de-ring}"/>
   <action application="set" data="fax_use_ecm=false"/>
   <action application="set" data="fax_enable_t38=false"/>
   <action application="set" data="fax_enable_t38_request=false"/>
   <action application="set" data="fax_disable_v17=false"/>
   <action application="lua" data="fax-retry.lua ${caller_id_number}"/>
   <action application="sleep" data="2000"/>
   <action application="set" data="accountcode=fax-eingang"/>
   <action application="set" data="process_cdr=a_only"/>
   <action application="set" data="session_in_hangup_hook=true"/>
   <action application="set" data="api_hangup_hook=lua fax-in.lua"/> 
   <action application="answer"/>
   <action application="playback" data="silence_stream://2000"/>
   <action application="set" data="fax_enable_image_resizing=true"/> 
   <action application="set" data="fax_ident=$1"/>
   <action application="rxfax" data="$${temp_dir}/FAX-${uuid}.tif"/>
   <action application="hangup"/>
  </condition>
 </extension>
Die beiden Lua-Scripte behandeln alternative Empfangseinstellungen für einzelne Rufnummern. Ferner wird im Skript fax-in.lua eine externe Nachbearbeitung des empfangenen Faxes angestossen. Hierzu kann es ferner sinnvoll sein, ein spezielles CDR-Template fax-eingang für den Fax-Eingang anzulegen.