Fax Versand und Fax Empfang auf FritzBox oder PC-Linux

RalfFriedl

IPPF-Urgestein
Mitglied seit
22 Apr 2007
Beiträge
12,343
Punkte für Reaktionen
1
Punkte
0
Für alle, die nach eine Möglichkeit suchen, Faxe zu senden und zu empfangen, habe ich hier ein Programm, das entweder auf einer FritzBox oder auf einem PC-Linux läuft.
Damit ist es möglich, über eine CAPI, die von sich aus das Fax Protokoll nicht unterstützt, Faxe zu senden und zu empfangen.

Das Programm eignet sich für zwei Anwendungen:
  • Auf einer FritzBox sollen Faxe versendet und empfangen werden.
  • Auf einem PC-Linux sollen Faxe versendet und empfangen werden, eine CAPI-fähige ISDN-Karte ist vorhanden, aber die CAPI selbst unterstützt kein Fax.

Voraussetzungen Software:
  • Eine CAPI Schnittstelle. Remote CAPI über Netzwerk funktioniert auch. FAX G3 Unterstützung in der CAPI ist nicht notwendig.
  • spandsp
  • libtiff
Voraussetzungen Hardware:
  • entweder FritzBox 7170 oder vergleichbare, also 7140, 7141, 7170, W701V, W900V
  • oder PC-basiertes Linux

Das Programm hat folgende Optionen:
Code:
Gemeinsame Optionen
-m	Modem-Geschwindigkeit:
-m0	2400
-m1	4800
-m2	9600
-m3	14400 (default)
-l	Eigene Fax-Kennung, default "+00 0000 0000000"
Sende-Optionen
-o	Eigene Sende-MSN, kein default
-d	Ziel-Rufnummer, wird benötigt
-t	Datei, die übertragen werden soll, TIFF G3 kodiert, wird benötigt
Empfangs-Optionen
-i	Eingehende MSNs, mehrere mit Komma getrennt möglich, kein default
-r	Verzeichnis, wo enpfangene Faxe abgelegt werden sollen, default "/tmp"
-R	Programm, das nach dem Empfang gestartet werden soll, kein default
Wenn ein Fax gesendet werden soll, müssen die Optionen -d und -t angegeben werden.
Zum Empfang muß die Option -i mit einer order mehreren MSNs angegeben werden, sonst wird kein Anruf angenommen.

Das Programm für die FritzBox ist statisch gelinkt und benötigt daher keine zusätzlichen Libraries.
Das Programm für PC-Linux benötigt libtiff, libjpeg, libz, libstdc++ und libm. Diese sollten aber normalerweise vorhanden sein.

Das größte Problem bei der Fax-Verarbeitung ist die CPU-Auslastung.
Auf der FritzBox habe ich beim Versenden von Faxen CPU-Auslastungen bis ca. 30% beobachtet. Die CPU-Leistung reicht, um auch zwei Faxe gleichzeitig zu senden.
Das Senden also nicht kritisch, nur das Empfangen. Mit 4800 bit/s, also mit der Option -m1, habe ich recht zuverlässig Faxe empfangen können. Allerdings habe ich diese mit meiner eigenen ISDN-Karte gesendet, so daß hier keine Störungen auf der Leitung waren.
Kurze Faxe gingen auch mit 14400 bit/s, also mit -m3. Wie es aussieht mit dem Empfang von analogen Absendern über evtl. gestörte Leitungen bleibt abzuwarten. Ebenso kann der Empfang bei mehreren Seiten oder bei komplexeren Seiten durcheinander kommen.

Ebenso ist von Bedeutung, was sonst noch auf einer Box läuft. Es ist möglich, zusammen mit anderen Programmen, die schon auf der Box laufen, die CPU Belastung zu hoch wird. Ebenso ist es möglich, daß durch eine hohe CPU-Auslastung der Watchdog-Timer zuschlägt und die Box komplett neu startet.

Auf einem PC-Linux ist die CPU-Auslastung nicht groß von Bedeutung, da sollte alles ab Pentium 100MHz ausreichen, sowohl zum Senden als auch zum Empfangen.

Eine Datei, die gesendet werden soll, muß als TIFF-Datei mit G3 Fax-Kodierung vorliegen. Mehrseitige TIFF-Dateien sind möglich. Diese Datei kann von verschiedenen Programmen erzeugt werden.

Beim Empfang wird eine Datei in dem angegebenen Verzeichnis erstellt. Das kann das Verzeichnis /tmp sein, es kann auch ein Verzeichnis auf einem USB oder NFS Dateisystem sein. Wenn das Fax nur im RAM der FritzBox abgelegt wird, ist es natürlich weg, falls die Box aus irgendeinem Grund neu startet.
Optional kann ein Programm angeben werden, daß aufgerufen wird, nachdem ein Fax empfangen wurde. Dieses Programm wird mit folgenden Parametern aufgerufen:
  • Name der Fax-Datei, im TIFF Format, eine oder mehrere Seiten.
  • Telefonnummer der Gegenstelle
  • Status der Übertragung, 0=OK, alles andere ist Fehler. Auch bei Fehler könnten schon einige Seiten empfangen worden sein.

Dieses Programm kann beliebige Aktionen durchführen: Ausgabe auf einem Drucker, Benachrichtigung per Email, usw.

Zum Testen des Programms habe ich unter anderem das Programm c2faxsend in Verbindung mit der Fax-fähigen CAPI einer Fritz-Karte unter Linux verwendet. Dabei ist mir aufgefallen, daß c2faxsend und/oder die FritzCard CAPI munter behaupten, die Übertragung wäre erfolgreich, selbst wenn die Gegenstelle davon nichts mitbekommt oder der Verbindung längst getrennt ist. Ich habe einmal bei einem 10-seitigen Fax den Empfänger noch vor Übermittlung der ersten Seite abgebrochen. c2faxsend hat trotzdem angezeigt, daß es 10 Seiten übertragen hätte und die Übermittlung erfolgreich war. Man sollte sich also nicht auf diese Rückmeldung verlassen, sondern besser selbst die empfangene Datei kontrollieren.

Probleme:
Ein Fax das in der ersten Zeile die Bits immer abwechselnd hat, also 010101...010101 wird von spandsp bei T.6 Kodierung falsch empfangen, und dies hat nichts mit Frame-Slips oder CPU-Auslastung zu tun. Es könnte auch generell passieren, wenn ein solches Muster vorkommt und auch wenn es nicht über die ganze Zeile geht.

Die CAPI der 7170 liefert zum Teil nicht korrekte Daten. Details dazu in etlichen Beiträgen weiter unten. Das bedeutet leider, daß die Fax-Übertragung nicht zuverlässig läuft, und es sieht nicht danach aus, als könnte jemand außerhalb von AVM etwas dagegen tun.

FAQ
noch keine.

Updates
noch keine.
 

Anhänge

  • CapiSpFax-mipsel.tar.bz2
    214 KB · Aufrufe: 387
  • CapiSpFax-i386.tar.bz2
    253.8 KB · Aufrufe: 440
  • CapiSpFax-src.tar.bz2
    6.7 KB · Aufrufe: 386
Zuletzt bearbeitet:
Hallo Ralf,

das mit dem Empfangen auf der Box habe ich leider nicht hingekriegt. Bei Text- und Grafik-Faxe bricht das Fax ab (so ab 65kb). Testweise mal 4800-14400 Baud probiert, größtenteils aber mit 9600.

Unter Linux könnte es besser funktionieren, das habe ich noch nicht probiert.

Welche spandsp Version verwendest du?
 
Die spandsp Version ist die neueste, die ich finden konnte, 0.0.4pre4.
Mit längeren Faxen habe ich auf teilweise Probleme. Hat es mit 4800 funktioniert oder auch damit nicht?
Ansonsten läuft bei mir zum Testen auf der Box sonst gar nichts, auch kein DSL.

Auf einem PC dagegen ist die Auslastung unproblematisch. Das i386-Binary enthält auch schon die Unterstützung für Remote-CAPI, aber ich habe bei mir auf der Box keine rcapid laufen.

Was hast Du zum Senden verwendet?
Ich habe zum Senden nur einen ISDN-Karte, damit bekomme ich natürlich immer ein unverfälschtes Signal.
 
Zum testen hatte ich Fritz!Fax verwendet. Empfang mit 4800 hatte ich probiert, aber da blieb das Fax auch so bei ca. 60kb hängen. Einen Abbruch konnte ich da nicht feststellen (wobei ich das nur 3 mal mit 4800 getesten hatte). Mit einem richtigen Fax müsste ich das noch testen.

Ich kann mich erinnern, das damals im Fax-Thread noch die Floating-Point Routinen im spandsp umgeschrieben wurden, damit die CPU Auslastung nicht ganz so hoch ausfällt.

Mal schauen, wie das mit dem neuen spandsp aussieht.

EDIT:
siehe da. Es gibt sogar ein Compiler-Flag --enable-fixed-point :)
 
Zuletzt bearbeitet:
Schicke Sache :)

Lass uns ein ds-mod Package daraus bauen....
 
Zuletzt bearbeitet:
@knox: die Sources sind doch auch angehängt. ;)
 
In der dritten Datei ist (nicht nur) das Makefile drin.
Das Makefile kann man sicher noch hübscher machen, aber erstmal wollte ich hören, wie es bei anderen läuft.

Funktioniert es bei Dir?

Inzwischen habe ich bei mir auf der Box rcapid installiert, damit funktioniert es von einem Linux PC aus.
 
Bisher ist ja noch nicht einmal klar, ob die CPU-Leistung in dieser Form für einen zuverlässigen Empfang ausreicht. Bevor man es in Asterisk einbaut, sollte erstmal die Grundfunktion stehen.

Hast Du es schon ausprobiert? Wenn ja, funktioniert es bei Dir?
 
also

asterisk auf fritz geht super bei mir aber das iaxmodem und halyfax müsste ds-danisahne
komplieren da bin ich kein freak
aber es war ja nur ein Idee und ein Gedankenblitz von mir
 
Ich hab mal ein bisschen getestet. Leider klappt es maximal, 2 Seiten ordnungsgemäß zu empfangen, egal welche Geschwindigkeit.

Aber bitte nicht aufgeben, es ist einfach eine geniale Idee.
 
IAX-Modem ist meines Wissens ebenfalls Spandsp-basiert. Asterisk und IAX-Modem haben sicher noch einen größeren Overhaed als ein kleines, "schnuckeliges" Standalone-Fax-Programm.
 
also ich bin kein linux guru aber da ich diese idee so gut finde und ich selber 50 faxe protag bekomme finde ich dieses projekt so gut
habe mich noch ein wenig umgeschaut
gruss euer ichego

http://oss.gonicus.de/
 
Ich habe mal "CapiSpFax --help" eingegeben und bekomme einen SegFault. Kann das jemand reproduzieren?
 
Warum manche immer sagen: "kann man Dies und Das nicht in XYZ implementieren", ohne das Programm vorher mal ausprobiert zu haben, ist mir völlig schleierhaft.

@meimi039:
Segfault bekomme ich nicht. Aber --? --help, etc. bringen auch keine Ausgabe. Eventuell liegt es an der Labor?
 
Wenn ich versuche, CapiSpFax selbst zu kompilieren bekomme ich sowas:

Code:
./CapiSpFax -m2 -i xxxxxxxx -r /var/media/ftp/usb -vvvv
put_cmsg '' -> 0
get_cmsg ''
get_cmsg ''
Call from 'yyyyyyyyyy' to 'xxxxxxxx', PLCI 0xe01
accept call
put_cmsg '' -> 0
get_cmsg ''
put_cmsg '' -> 0
get_cmsg ''
CAPI_CONNECT_B3_IND
put_cmsg '' -> 0
FAX INIT 0, '/var/media/ftp/usb/rxfax-46c1f2d8-10e01.tif', '+00 0000 0000000', 2
Segmentation fault

Mit deiner Binary funktioiert es.

Verwende tiff-3.8.2 und libspandsp-0.0.4pre4. rpl_malloc hab ich aus der config.h von spandsp auskommentiert und lrintf in tone_generate.c ergänzt. Habe auch schon --enable-fixed-point als ./configure Parameter probiert, mit selben Ergebnis. Statisch kompiliert mit mipsel-linux-g++.

Habe ich etwas übersehen?
 
Zuletzt bearbeitet:
bodega schrieb:
Habe ich etwas übersehen?
Nichts was mir direkt auffallen würde. Da GDB auf der Box nicht richtig funktioniert, bleibt nur ltrace oder die gute alte printf Methode, um die Stelle näher einzugrenzen.

Allerdings hatte ich auch zuerst lrintf undefiniert. Ich hatte es dann in der Datei Fax.cpp defniert, genau wie __strdup. Irgendwann ging es dann aber auch ohne bzw. hat sich an der Definition gestört, da bin ich nicht mehr ganz sicher, jedenfalls habe ich die dann wieder entfernt. Vielleicht liegt es auch am statischen Linken. Ich habe das Programm statisch gelinkt, schon damit ich nur eine Datei immer übertragen muß.

Zwischendurch habe ich mal aus anderen Gründen die Toolchain neu erstellt, mit dem neuen GCC 4.2.1, mit LFS und mit IPV6. Ich vermute da zwar keinen Zusammenhang, aber man kann nie wissen.

Im Moment bin ich dabei, das Ganze soweit fertig zu machen, daß es sich mit dem ds-mod komplett bauen läßt, inkl. libtiff und spandsp.

Anscheinend kommt es bei längeren Faxen doch noch leicht aus dem Gleichgewicht. Ich habe festgestellt, daß meine 10-Seiten Testdatei nur in niedriger Auflösung ist und daher ein kleineres Datenvolumen hat.

Seltsamerweise ist es auch so, daß die gleiche Datei über ISDN übertragen mal funktioniert und mal nicht, obwohl die empfangenen Daten und auch der Zeitbedarf identisch sein sollten. Andere Programme habe ich schon extra nicht darauf laufen, damit diese den Empfang nicht störten.
 
Ok.. ich schau dann nochmal per ltrace, ob sich was erkennen lässt.

Was beim Empfang auch Probleme machen könnte: die kürzeste Wartezeit bei der FritzBox beträgt 10ms (ein usleep(1) = ~10 ms). Wenn ich wüsste, wie und ob man die Systemticks ändern kann, bzw. ein anderes Timingdevice verwenden könnte, wären es wahrscheinlich weniger Frame-Slips.
 
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.