FoIP-Server (T.38) mit Windows Bordmitteln und OpenSource

Viele Unternehmen haben heute das Problem das sie in einer sich verändernden IT-Infrastruktur immernoch ein altes Relikt aus der Vergangenheit der Telekommunikation unterbringen müssen, das Fax.
Fax entspricht nicht den heutigen Gepflogenheiten zu kommunizieren da es sich um eine analoge Übertragung von digitalen Daten handelt. Aus diversen Gründen ist Fax aber trotzdem heute noch ein wichtiges Instrument der Dokumenten- und Nachrichtenübermittlung. Damit das heutzutage auch noch reibungslos möglich ist, wurde ein spezielles Protokoll entwickelt um ein einst leitungsvermitteltes Medium über ein paketvermitteltes zu übertragen, das Protokoll "T.38" (FoIP).

Oftmals arbeiten selbst moderne Fax-Server immernoch ausschließlich auf Modem- oder CAPI-Basis. Das bedeutet man braucht eine Schnittstellenkarte die entweder an einem Analog- oder einem ISDN-Anschluss betrieben wird und einen Treiber der den Fax-Server mit dem Telefonanschluss verbindet. Zur Zeit grassieren jedoch 2 neue "Unsitten":
  1. Virtualisierung
  2. Umstellung von ISDN- oder Analoganschlüssen auf VoIP (SIP)
Im 1. Fall möchte man den Faxserver in eine virtualle Maschine packen. Aber wie bekommt man dann die Verbindung zum Telefonanschluss hin wenn man keine Verbindung mehr zur Schnittstellenkarte über das Betriebssystem aufnehmen kann ? Ganz einfach, man kauft ein Gateway welches T.38 unterstützt, was an Stelle der ehemaligen Schnittstellenkarte an den Telefonanschluss gehängt wird.
Im 2. Fall ist das Problem das zurzeit im ALLIP-Wahn herkömmliche Telefonanschlüsse seitens der Provider einfach gekündigt bzw. auf VoIP umgestellt werden. An einen VoIP-Anschluss kann man jedoch keine analoge oder ISDN-Schnittstellenkarte mehr anschließen.
In beiden Fällen muss der Faxserver an eine SIP-Infrastruktur angebunden werden. Nun werden alle sagen, ja, das ist doch einfach. Die Faxserver-Hersteller haben doch bestimmt SIP-Schnittstellen eingebaut. Nun, weit gefehlt, aus irgendeinem Grund macht das kaum einer, jedenfalls nicht von den großen. Daher sind Faxserver  i. d. R. immernoch darauf ausgelegt mit einer CAPI oder mit einem Modem zu arbeiten. Die Lösung einen FaxServer trotzdem SIP-fähig zu machen liegt in einer virtuellen Schnittstelle, die dem Fax-Server vorgaukelt eine CAPI- (ISDN) oder Modemschnittstelle (analog) zu sein.
Wer eine CAPI einsetzen will, oder muß, für den gibt es kommerzielle Lösungen wie "XCAPI" oder den "NG MediaServer". Diese Lösungen stellen nach oben ein CAPI bereit und nach "unten" wird nicht etwa eine Schnittstellenkarte über einen Treiber angesprochen, sondern direkt SIP gesprochen". Dies ist natürlich auch aus einer VM möglich, da es sich ja um reine IP-Kommunikation handelt.
Die älteste und ursprünglichste Kommunikationsart die ein Faxserver jedoch kennt ist das Modem. Und nun kommen wir endlich zu dem was die Überschrift dieses Posts verspricht, die Anbindung des WindowsFaxService über eine virtuelle Modemschnittstelle an eine SIP-Umgebung.

Folgende Komponenten werden benötigt:


  1. virtueller COM-Port: com0com
    http://com0com.sourceforge.net/<br>
  2. t38modem mit ptlib und opal<br>
  3. Windows-Service-Wrapper: cygrunsvr

1. virtueller COM-Port mit com0com

Der virtuelle COM-Port wird benötigt, weil auch ein virtuelles Modem einen COM-Port braucht über den es kommunizieren kann. Installieren Sie dafür com0com:

Download: 
http://sourceforge.net/projects/com0com/files/com0com/2.2.2.0/com0com-2.2.2.0-x64-fre-signed.zip/download

Speichern Sie die ZIP-Datei in Ihrem Download-Ordner und packen Sie sie dort auch aus. In dem ausgepackten Verzeichnis "com0com-2.2.2.0-x64-fre-signed" befindet sich eine Setup-Datei.
Führen Sie das Setup aus und installieren Sie com0com.
Bei der Installation brauchen Sie nicht viel beachten. Es wird per default ein COM-Port-Paar installiert "CNCA0<->CNCB0". Das geschieht während der Installation und es wird gefordert die Signierung als vertrauenswürdig zu bestätigen, was Sie auch tun müssen um das Programm ordnungsgemäß zu installieren.

2. virtuelles Faxmodem t38modem

Vor ein paar Jahren bin ich auf dieses Projekt gestoßen. Es handelt sich hierbei um ein virtuelles Modem welches Fax über SIP/T.38 versenden und empfangen kann. Diese Software benötigt dafür 2 Bibliotheken (DLL's) aus anderen Projekten, die PTLib und die OPAL-Lib. Eigentlich sind diese 3 Programme vorrangig für den Einsatz unter Linux gedacht, aber die Macher haben jeweils auch die Möglichkeit geschaffen diese Programm für Windows zu übersetzten. Das habe ich dann vor ein paar Jahren auch gemacht und hatte Erfolg. Ich habe die Versionen t38modem-1.1.0, ptlib-2.6.1 und opallib-3.6.1 für Windows übersetzt. Mittlerweile gibt es von allen 3 Komponenten schon neuere Versionen, aber leider ist es mir bisher nicht gelungen diese für Windows zu übersetzen. Da diese 3 Komponenten nicht binär (übersetzt) vorliegen, müsste man, bevor man so eine Lösung einsetzen kann, die Quellen selbst übersetzten. Dies wird jedoch für die meisten Leute eine große bis unüberwindbare Hürde sein. Daher stelle ich hier die Versionen die ich damals kompiliert habe zur Verfügung. Bisher habe ich keine Kenntnis darüber das die Funktionalität in irgendeiner Weise eingeschränkt ist mit diesen Versionen. Für die Leute die die neuen Versionen einsetzen wollen, bleibt nur die Quellen selbst zu übersetzen. Wenn es jemand schafft, dann möge er sich bei mir melden und mir sagen was ich falsch mache.
Die Quelldateien für diese 3 Komponenten können Sie bei Interesse hier herunterladen:

t38modem-1.1.0
opal-3.6.1
ptlib-2-6-1

3. Windows-Service-Wrapper "cygrunsrv"

Ein "WindowsServiceWrapper" ist ein Hilfsprogramm mit dem man beliebiges Programm als WindwosService laufen lassen kann. "cygrunsrv" ist Teil des Cygwinprojektes (www.cygwin.com) und bietet genau diese Möglichkeit. Mit diesem Programm werden wir t38modem als Windows-Service anmelden, damit der Faxserver auch im nicht angemeldeten Zustand Faxe empfangen und senden kann.

Einrichtung des FaxModems und des WindowsService

Laden Sie sich das von mir vorbereitete Paket herunter und packen Sie es an einem passenden Ort aus, z. B. unter C:\Programme (x86). Das ZIP-File beinhaltet einen Ordner namens "t38faxmodem" dieser sollte nach dem Entpacken dort landen: C:\Programme (x86)\t38faxmodem.
In dem entpackten Verzeichnis befinden sich die beschriebenen Dateien und eine WindowsBatch-Datei namens "install-service.bat", die hier im wesentlich das Tut was wir wollen, ein Faxmodem einrichten und einen Dienst installieren. Damit aber auch Faxserver-Seitig und SIP-Seitig alles so läuft wie wir es uns gedacht haben, müssen wir uns diese Datei genauer ansehen, denn hier wird u. a. festgelegt wie die Rufe nachher verteilt werden:

cygrunsrv.exe ^
-I "T38FaxModem" --desc "T38FaxService installed a la voip-guru.de"^
-y "FAX"^
-p "%~dp0t38modem.exe"^
-t auto ^
-a "--no-h323 --sip-old-asn -n --ptty \\\\.\\CNCA0 --route ""modem:.*=sip:<dn>@10.0.0.102"" --route ""sip:.*=modem:<dn>"" -o ""%~dp0t38faxmodem.log"" -t"

Wenn man "cygrunsrv.exe --help" ausführt erhält man ein Übersicht aller gültigen Argumente für dieses Programm inklusive einer kurzen Erklärung. Der interessanteste Parameter ist hier "-a". Mit ihm werden die Argumente an die auszuführende exe gegeben, in unserem Fall t38modem.exe.
Auch die t38modem.exe gibt auf Verlangen mit "--help" eine Übersicht der gültigen Argumente inkl. Erklärung aus.
Gehen wir die Parameter einmal für dieses Beispiel einmal durch:

--no-h323
Gibt an das wir kein h323 benutzen wollen.

--sip-old-asn
Gibt an das der SIP-Parser mit einer alten ASN1-Version arbeiten soll um die SIP-Nachrichten zu dekodieren. Das muß man scheinbar angeben, ansonsten geht das mit SIP nicht richtig, zumindest haben meine Tests das ergeben.

--ptty
Hier werden die COM-Ports angegeben die mit einem virtuellen Modem belegt werden sollen. D.h. also, man kann soviele Modems erstellen wie die Performance des Systems hergibt, also auch entspr. viele Faxe gleichzeitig empfangen bzw. senden. Dafür müssen nur entspr. viele COM-Port-Paare mit com0com angelegt werden. Die Syntax für die Angabe des zu belegenden COM-Ports sieht so aus: " [num@]\\.\[,...]". Beispiel, in unserem Fall haben wir nur das Paar CNCA0/CNCB0 angelegt, also belegen wir CNCA0 mit dem Faxmodem:
--ptty "\\.\CNCA0".

HINWEIS: In dem Batch-File sehen Sie die "\" für diesen Parameter doppelt, das muss so sein, damit der Batch-Interpreter diese "\" auch richtig weiterverarbeitet.

Wenn man möchte kann man das Modem auch fest mit einer Nummer belegen, z B. so: --ptty "100@\\.\CNCA0". Das bewirkt das von SIP kommende Rufe nur dann auf dem Modem angenommen werden wenn sie als Zielnummer die "100" haben. Möchte man mehrere Modems gleichzeitig haben, erstellt man soviel COM-Port-Paare wie man Modems haben  möchte und gibt diese entpr. mit Kommatas getrennt an: --ptty "100@\\.\CNCA0,200@CNCB0,...". Jeweils die andere Seite des COM-Port-Paares wird später als Faxmodem unter Windows eingerichtet. Ist es egal welche Nummer auf welchem Modem landet, lässt man das "@" mit der Nummer vorne einfach weg, dann wird einfach das erste freie Modem genommen.

--route "modem:.*=sip:<dn>@10.0.0.102"
Diese Route beschreibt den Weg von einem beliebigen Modem von welchem eine beliebige Nummer
gewählt wurde und via SIP an die 10.0.0.102 gesendet wird. "<dn>" steht hier für die "destination number" also das was auf der Modem-Seite gewählt wurde und mit ".*" verglichen wurde. ".*" steht für eine beliebige Zeichenfolge. "dn" repräsentiert hier, wie schon erwähnt, die gewählte Nummer, kann hier aber noch manipuliert werden. Beispielsweise kann man ein bestimmte Anzahl von Ziffern vom Anfang abschneiden, bevor Sie an die SIP-Gegenstelle geleitet werden. Beispiel: <dn!2> schneidet die ersten beiden Ziffern von "dn" ab.

--route "sip:.*=modem:<dn>"
Diese Route beschreibt den Weg eines von SIP kommenden Rufes mit von einer beliebigen IP-Adresse und einer beliebigen Zielrufnummer und die Weiterleitung mittels "dn" an die konfigurierten Modems. Haben die Modems keine Nummernzuordnung, wird einfach das erste freie Modem angewählt.

-o
Gibt den Pfad und den Dateinamen  der Log-Datei an in der alle Logs geschrieben werden. In unserem Fall wird der Pfad mit "%~dp0" bestimmt was bedeutet der Pfad in der die Batch-Datei ausgeführt wurde. Also landet in "C:\Program Files (x86)\t38faxmodem" eine Datei namens "t38faxmodem.log"

-t
Gibt an das das DebugLog aktiviert werden soll. Das Loglevel wird mit der Anzahl von übergebenen "t" bestimmt. Übergebe ich ein einziges t ist das Loglevel "1". Übergebe ich "ttt" dann wäre das Loglevel 3. Für den Normalbetrieb ist es ratsam das Loglevel auf 1 zu belassen, denke ich.

In unserem Beispiel wird mit dem Ausführen der Batch-Datei "install-service.bat" ein neuer Windowsdienst namens "T38FaxModem" installiert. Das Faxmodem lauscht auf Port 5060 (default wenn nichts anderes mit --sip-listen" angegeben) und nimmt jeden SIP-Ruf an und leitet diesen auf das Modem "CNCA0". Andersherum werden alle Rufe die von "CNCA0" kommen an die Adresse "10.0.0.102", Port 5060 geleitet.
Sie fragen sich vielleicht was ist eigentlich wenn ich an meiner SIP-Gegenstelle registriert sein muss ? Das ist auch kein Problem , dann muss man noch den Parameter --sip-register mit angeben.

Wenn Sie also nun alles so eingestellt haben wie Sie es brauchen, dann fügen Sie die Parameter entsprechend in die install-service.bat mit ein bzw. ändern Sie sie ab.
Danach gehen Sie auf "Start", drücken die rechte Maustaste und wählen Sie "Eingabeaufforderung (Administrator)" aus. Es öffnet sich ein Kommandofenster. Wechseln Sie in der Kommandozeile in das Verzeichnis "C:\Program Files (x86)\t38faxmodem":

cd "C:\Program Files (x86)\t38faxmodem" <ENTER>

Dann führen Sie das Batch-Skript aus_

>batch-install.bat<ENTER>

Wenn Sie jetzt die Dienste-Konsole öffnen, sollte dort ein Dienst namens "T38FaxModem" auftauchen. Diesen starten Sie jetzt bitte. Nach dem Starten sollte im t38faxmodem-Verzeichnis eine Datei namens "t38faxmodem.log" auftauchen. In dieser Date sollte in etwa folgendes zu sehen sein:

2016/02/02 14:48:47.599               T38Modem Version 1.1.0 by Vyacheslav Frolov on Windows Vista (v6.2.9200-i586 (Model=42 Stepping=7)) with PTLib (v2.6.1) at 2016/2/2 14:48:47.599
2016/02/02 14:48:47.599               T38Modem T38Modem Version 1.1.0 (OPAL-3.6.1/3.6.1, PTLIB-2.6.1/2.6.1) on Windows Vista (v6.2.9200-i586 (Model=42 Stepping=7))
2016/02/02 14:48:47.609               T38Modem OpalMan Registered endpoint with prefix modem
2016/02/02 14:48:47.609               T38Modem ModemEndPoint::ModemEndPoint
2016/02/02 14:48:47.610           CNCA0(b):6b4 ModemEndPoint::OnMyCallback command=addmodem extra=10
2016/02/02 14:48:47.610           CNCA0(b):6b4 ModemEndPoint::OnMyCallback request={
command=addmodem
response=confirm
modemtoken=CNCA0
}
2016/02/02 14:48:47.610           CNCA0(b):6b4 CurrentRxQueue=4096
2016/02/02 14:48:47.610           CNCA0(b):6b4 PseudoModemBody::OpenC0C opened \\.\CNCA0
2016/02/02 14:48:47.610               T38Modem OpalMan Registered endpoint with prefix sip
2016/02/02 14:48:47.610           CNCA0(o):b44 <-- Started
2016/02/02 14:48:47.610           CNCA0(e):72c <-> Started
2016/02/02 14:48:47.610          CNCA0(i):2560 --> Started
2016/02/02 14:48:47.610           CNCA0(e):72c --> AT
2016/02/02 14:48:47.611           CNCA0(e):72c <--  {
  0d 0a 4f 4b 0d 0a                                  ..OK.. }
2016/02/02 14:48:47.634           CNCA0(e):72c --> ATE0V1
2016/02/02 14:48:47.634           CNCA0(e):72c <--  {
  0d 0a 4f 4b 0d 0a                                  ..OK.. }
2016/02/02 14:48:47.650           CNCA0(e):72c --> AT
2016/02/02 14:48:47.650           CNCA0(e):72c <--  {
  0d 0a 4f 4b 0d 0a                                  ..OK.. }
2016/02/02 14:48:47.666           CNCA0(e):72c --> ATS0=0
2016/02/02 14:48:47.666           CNCA0(e):72c <--  {
  0d 0a 4f 4b 0d 0a

Wenn das so ist, dann ist das Faxmodem erfolgreich installiert und gestartet worden.

TIPP: Wenn der Dienst bereits installiert ist, kann man die Parameter für t38modem auch im Nachhinein über regedit bearbeiten. Der Pfad zu dem Parameter-String lautet:

HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\T38FaxModem\Parameters

Wie aber kann ich denn nun damit ein Fax versenden ?
Ganz einfach, Sie richten nun eine Modemschnittstelle unter Windows ein. Da ich keine Windows-Server-Installation zur Verfügung habe, gebe ich hier nur die Vorgehensweise für ein "normales" Desktop-Windows, in meinem Fall Windows 10 an.

Fax versenden

Öffnen Sie das "Windows-Fax und -Scan", zu finden im Startmenü unter Windows-Zubehör.
Drücken Sie nun links oben auf "Neues Fax".
Sofern noch nie ein Faxkonto eingerichtet wurde, werden Sie nun aufgefordert das zu tun.

  • Es erscheint ein Dialog mit der Überschrift "Faxmodem der -server auswählen". 
  • Drücken Sie auf "Verbindung zu einem Faxmodem herstellen".
  • Es erscheint die Meldung "Auf diesem Computer ist noch kein Modem installiert ...." usw.
  • Drücken Sie auf "Ja" um ein neues zu installieren.
  • Markieren Sie die Auswahl "Modem auswählen (Keine automatische Erkennung)"
  • Drücken Sie "Weiter"
  • Wählen Sie nun aus "Standardmodemtypen" den Typ "Standard 14400 bps Modem"
  • Wählen Sie als Anschluß nun "CNCB0" aus und drücken Sie "Weiter" und "Fertigstellen"
  • Geben Sie nun noch einen Namen für das Faxkonto ein, z. B. "Faxmodem" und drücken Sie "Weiter"
  • Wählen Sie "Automatische Anrufannahme ..." wenn Sie wollen das der FAxserver automatisch Faxe empfängt, ansonsten treffen Sie eine andere Wahl.
  • Das war's! Nun können Sie Ihr Fax Entwerfen und anschließend über das neue Faxmodem versenden. Als Ziel ("AN: ") geben Sie einfach die Rufnummer ein.
HINWEIS: Sollten Sie bei der COM-Port-Auswahl noch den Port "CNCA0" gesehen haben, dann müssen Sie u .U. nach der Einrichtung den Faxdienst nochmal neu starten damit das Modem korrekt initialisiert wird.

Nun bin ich am Schluss angelangt. Ich hoffe dieser Artikel war hilfreich und verabschiede mich bis zum nächsten BlogPost auf voip-guru.de.
Feedback, oder auch Fragen, hinterlassen Sie mir einfach als Kommentar oder schreiben Sie mir eine EMail.

Keine Kommentare:

Kommentar veröffentlichen