HylaFaxというFAXサーバとそのクライアントソフトウェアを使えば、ネットワークを通じてWindowsマシンなどから手軽にFAXを送信することができるようになる。
さらに、HylaFaxで使用するモデムとしてiaxmodemを使えば、Asteriskと連携することができるようになる。
(前提)ASTERISKのインストールが完了していて、外線への発信ができていること。
今回、CentOS 5.7(64bit)にインストールしたバージョン
・iaxmodem-1.2.0
・hylafax-6.0.5
(注意)
この条件でインストールした場合、コマンドラインからsendfaxコマンドを使ってFAXを送出しようとしても、フォント周りのエラーが表示されできなかった。
しかし、そのような状態でも、代わりにhylafaxのクライアントソフト(たとえば、Hylafax WinPrint)を用いれば、正常にFAXを送出することができた。
クライアントソフトを使った場合、sendfaxコマンドで必要だったプロセスがクライアントソフト上で解決されたために、FAXを送出できたのだろう。
FAXサーバーとしての本質的な機能は正常にインストールされているようだ。クライアントソフトウェアを使ってFAXを送出するなら、この条件でも問題はないと思う。(後述)
○クライアントソフトであるHylafax WinPrintのインストール手順については次のページに記載。
http://akira-arets.blogspot.com/2011/09/ms-windows7-winprint-hylafaxfax.html
■インストール共通手順■
◇システムを最新にアップデートする。
[root@localhost ~]# yum update
[root@localhost ~]# uname -a
Linux localhost.localdomain 2.6.18-238.19.1.el5 #1 SMP Fri Jul 15 07:31:24 EDT 2011 x86_64 x86_64 x86_64 GNU/Linux
◇コンパイルに必要なモノをインストールする。
[root@localhost ~]# yum install gcc gcc-c++
Installed:
gcc.x86_64 0:4.1.2-51.el5 gcc-c++.x86_64 0:4.1.2-51.el5
Dependency Installed:
cpp.x86_64 0:4.1.2-51.el5 glibc-devel.x86_64 0:2.5-65 glibc-headers.x86_64 0:2.5-65 kernel-headers.x86_64 0:2.6.18-274.3.1.el5 libstdc++-devel.x86_64 0:4.1.2-51.el5
Complete!
■iaxmodemのインストールと設定■
◇必要なライブラリをインストールする
[root@localhost ~]# yum install libjpeg libjpeg-devel libtiff libtiff-devel
Installed:[root@localhost ~]# yum install ghostscript ghostscript-devel ghostscript-fonts sox
libjpeg-devel.i386 0:6b-37 libjpeg-devel.x86_64 0:6b-37 libtiff-devel.i386 0:3.8.2-7.el5_6.7 libtiff-devel.x86_64 0:3.8.2-7.el5_6.7
Complete!
Installed:
ghostscript.i386 0:8.70-6.el5_7.3 ghostscript.x86_64 0:8.70-6.el5_7.3 ghostscript-devel.i386 0:8.70-6.el5_7.3 ghostscript-devel.x86_64 0:8.70-6.el5_7.3
sox.x86_64 0:12.18.1-1.el5_5.1
Dependency Installed:
alsa-lib.x86_64 0:1.0.17-1.el5 ghostscript-fonts.noarch 0:5.50-13.1.1 libICE.i386 0:1.0.1-2.1 libSM.i386 0:1.0.1-3.1 libXt.i386 0:1.0.2-3.2.el5
libXt.x86_64 0:1.0.2-3.2.el5 libogg.x86_64 2:1.1.3-3.el5 libvorbis.x86_64 1:1.1.2-3.el5_4.4 urw-fonts.noarch 0:2.3-6.1.1
Complete!
◇iaxmodemをダウンロードしインストールを行う
[root@localhost iaxmodem]# wget http://sourceforge.net/projects/iaxmodem/files/iaxmodem/iaxmodem-1.2.0/iaxmodem-1.2.0.tar.gz/download
`iaxmodem-1.2.0.tar.gz' へ保存完了 [3075769/3075769][root@localhost iaxmodem]# tar zxvf iaxmodem-1.2.0.tar.gz
[root@localhost iaxmodem]# cd iaxmodem-1.2.0
[root@localhost iaxmodem-1.2.0]#
一つ目のライブラリをインストールする。
[root@localhost iaxmodem-1.2.0]# cd lib/libiax2/
[root@localhost libiax2]# ./configure
[root@localhost libiax2]# make
[root@localhost libiax2]# make install
[root@localhost libiax2]# cd ../..
[root@localhost iaxmodem-1.2.0]#
二つ目のライブラリをインストールする。
[root@localhost iaxmodem-1.2.0]# cd lib/spandsp/
[root@localhost spandsp]# ./configure
[root@localhost spandsp]# make
[root@localhost spandsp]# make install
[root@localhost spandsp]# cd ../..
[root@localhost iaxmodem-1.2.0]#
これらのライブラリをシステムに登録する。すでに/usr/local/libが登録されていればこの作業は不要。
[root@localhost iaxmodem-1.2.0]# touch /etc/ld.so.conf.d/iaxmodem-i386.conf
[root@localhost iaxmodem-1.2.0]# echo '/usr/local/lib' >> /etc/ld.so.conf.d/iaxmodem-i386.conf
[root@localhost iaxmodem-1.2.0]# cat /etc/ld.so.conf.d/iaxmodem-i386.conf
/usr/local/lib[root@localhost iaxmodem-1.2.0]# ldconfig
ビルドしてバイナリを生成し、パスの通ったディレクトリにコピーする。
[root@localhost iaxmodem-1.2.0]# ./build
[root@localhost iaxmodem-1.2.0]# ls ./iaxmodem
./iaxmodem[root@localhost iaxmodem-1.2.0]# cp -p iaxmodem /usr/local/sbin/
◇設定ファイルを編集する
ディレクトリを作成し、iaxmodemの設定ファイルをコピーする。
[root@localhost iaxmodem-1.2.0]# mkdir /etc/iaxmodem
[root@localhost iaxmodem-1.2.0]# cp -p iaxmodem-cfg.ttyIAX /etc/iaxmodem/ttyIAX
[root@localhost iaxmodem-1.2.0]# vim /etc/iaxmodem/ttyIAX
device /dev/ttyIAX
owner uucp:uucp
mode 660
port 4570
refresh 300
server 127.0.0.1 ←ASTERISKの動作しているコンピューター
peername iaxmodem ←ASTERISKのiax.confで設定するもの
secret password
cidname John Doe
cidnumber 8005551212
codec slinear
ASTERISKのiax.confサンプルファイルの一番下に、このiaxmodemに対応した設定を追加する
[root@asterisk asterisk]# vim /etc/asterisk/iax.conf
(略)念のため挙げると、[general]項目は次のようにした。
[iaxmodem]
type=friend
username=iaxmodem
secret=password
host=dynamic
disallow=all
allow=ulaw ←実際の運用時にはulawが用いられた。allow=slinear
requirecalltoken=no
context=fax_outgoing
(略)
[general]
autokill=yes
maxregexpire = 300
iaxcompat=yes
language=jp
bandwidth=high
disallow=all
allow=slinear
allow=ulaw
allow=alaw
jitterbuffer=no ←yesにするとFAX伝送に時間がかかった。noのままにする。
forcejitterbuffer=no
ASTERISKのextensions.confに、fax送信用のコンテクストとエクステンションを追加する
[root@asterisk asterisk]# vim /etc/asterisk/extensions.conf
[fax_outgoing]
exten => _0.,1,Dial(SIP/${EXTEN}@外線発信用デバイス名)
ASTERISKを再起動させる
[root@asterisk asterisk]# service asterisk restart
◇iaxmodemを自動起動させるための設定
[root@localhost iaxmodem-1.2.0]# cp -p iaxmodem.init.fedora /etc/init.d/iaxmodem
[root@localhost iaxmodem-1.2.0]# chmod +x /etc/init.d/iaxmodem
[root@localhost iaxmodem-1.2.0]# chkconfig --add iaxmodem
[root@localhost iaxmodem-1.2.0]# chkconfig iaxmodem on
[root@localhost iaxmodem-1.2.0]# chkconfig --list | grep iaxmodem
iaxmodem 0:off 1:off 2:on 3:on 4:on 5:on 6:off
◇iaxmodemのログ用ファイルを置く
[root@localhost iaxmodem-1.2.0]# mkdir /var/log/iaxmodem
[root@localhost iaxmodem-1.2.0]# touch /var/log/iaxmodem/iaxmodem
◇IAXmodemを起動する
[root@localhost iaxmodem-1.2.0]# service iaxmodem start
IAXmodem を起動中: [ OK ][root@localhost iaxmodem-1.2.0]# ls /dev/ | grep ttyIAX
ttyIAX ・・・デバイスが作成されている
◇念のため、Asterisk側で、iaxmodemが正常にレジストされているか確認する
Asterisk CLIを起動し、iax2のレジスト状況を確認する
[root@asterisk asterisk]# asterisk -r
asterisk-01*CLI> iax2 show peers
Name/Username Host Mask Port Status設定したiaxmodemモデムが、192.168.xxx.yyyからレジストしていることが分かる。
iaxmodem/iaxmod 192.168.xxx.yyy (D) 255.255.255.255 58553 Unmonitored
以上で、iaxmodemのセッティングは完了。
(略)
# Run gettys in standard runlevels
(略)
# Run iaxmodem in standard runlevels
im1:2345:respawn:/usr/local/sbin/iaxmodem ttyIAX
(略)
引数のttyIAXは、後で/etc/iaxmodemディレクトリに置かれる設定ファイルである。
3043 pts/0 00:00:00 iaxmodem
/dev/ttyIAX
■hylafaxのインストールと設定■
以下はソースからインストール手順である。
しかし、代わりにyumを用いてパッケージからインストールすることもできる。
(下記リンクの手順で、Hylafax+ 5.5.9 のインストールができた。)
http://akira-arets.blogspot.jp/2017/07/linux-centos69-hylafaxplus-installing.html
◇必要なモノをインストールする
[root@localhost ~]# yum install mgetty-voice zlib-devel
Installed:
mgetty-voice.x86_64 0:1.1.33-9.fc6 zlib-devel.i386 0:1.2.3-4.el5 zlib-devel.x86_64 0:1.2.3-4.el5
Complete!
◇hylafaxをダウンロードしインストールを行う
[root@localhost hylafax]# wget ftp://ftp.hylafax.org/source/hylafax-6.0.5.tar.gz
`hylafax-6.0.5.tar.gz' へ保存終了 [1295267][root@localhost hylafax]# tar xvfz hylafax-6.0.5.tar.gz
[root@localhost hylafax]# cd hylafax-6.0.5
[root@localhost hylafax-6.0.5]#
[root@localhost hylafax-6.0.5]# ./configure
(省略)番号を指定し値を入力し、パラメーターを変更する。
Press Return to Continue
次のように質問されるので、パラメーター番号を指定する。
HylaFAX configuration parameters (part 1 of 2) are:
[ 1] Directory for applications: /usr/local/bin
[ 2] Directory for lib data files: /usr/local/lib/fax
[ 3] Directory for lib executables: /usr/local/sbin
[ 4] Directory for system apps: /usr/local/sbin
[ 5] Directory for manual pages: /usr/local/man
[ 7] Directory for spooling: /var/spool/hylafax
[ 8] Directory for uucp lock files: /var/lock
[ 9] Uucp lock file scheme: ascii
[10] PostScript imager package: gs
[11] PostScript imager program: /usr/bin/gs
[12] Manual page installation scheme: bsd-source-cat
[13] Default page size: North American Letter
[14] Default vertical res (lpi): 98
Are these ok [yes]? 13設定値がわからなければ、?を入力して、説明を表示させる。
Default page size [North American Letter]? ?設定できる値がわかったので、A4を指定する。
"?" is not a known page size; the following are known page sizes:
Name Abbrev Width Height Width Height Top Left
ISO A3 A3 14030 19840 13200 18480 472 345
ISO A4 A4 9920 14030 9240 13200 472 345
ISO A5 A5 7133 9921 6455 9236 472 345
ISO A6 A6 5055 6991 4575 6508 472 345
ISO B4 B4 12048 17196 11325 16010 472 345
North American Letter NA-LET 10200 13200 9240 12400 472 345
American Legal US-LEG 10200 16800 9240 15775 472 345
American Ledger US-LED 13200 20400 11946 19162 472 345
American Executive US-EXE 8700 12600 7874 11835 472 345
Japanese Letter JP-LET 8598 12141 7600 10200 900 400
Japanese Legal JP-LEG 12141 17196 11200 15300 900 400
Default page size [North American Letter]? A4さらに、14番のパラメーターの値も変更する。
Are these ok [yes]? 14同様に、設定可能な値リストを表示させる。
Default vertical res (lpi) [98]? ?ファインモードを設定するので、196を入力する。
"?" is not a valid vertical resolution; choose either "98" lines/inch入力された値に変更されたパラメーターリストが表示される。
(low resolution) or "196" lines/inch (often called fine resolution).
Default vertical res (lpi) [98]? 196
HylaFAX configuration parameters (part 1 of 2) are:確認してから、yesを入力する。
[ 1] Directory for applications: /usr/local/bin
[ 2] Directory for lib data files: /usr/local/lib/fax
[ 3] Directory for lib executables: /usr/local/sbin
[ 4] Directory for system apps: /usr/local/sbin
[ 5] Directory for manual pages: /usr/local/man
[ 7] Directory for spooling: /var/spool/hylafax
[ 8] Directory for uucp lock files: /var/lock
[ 9] Uucp lock file scheme: ascii
[10] PostScript imager package: gs
[11] PostScript imager program: /usr/bin/gs
[12] Manual page installation scheme: bsd-source-cat
[13] Default page size: ISO A4
[14] Default vertical res (lpi): 196
Are these ok [yes]?yesさらに、パラメーターリストが現れるが、これは変更せずにyesを入力する。
HylaFAX configuration parameters (part 2 of 2) are:
[15] Location of getty program: /sbin/agetty
[16] Location of voice getty program: /sbin/vgetty
[17] Location of sendmail program: /usr/sbin/sendmail
[18] Location of TIFF tools: /usr/bin
[19] Location of SysV init scripts: /etc/rc.d/init.d
[20] Location of SysV start scripts: ../rc2.d ../rc3.d ../rc4.d ../rc5.d
[21] Location of SysV stop scripts: ../rc0.d ../rc1.d ../rc6.d
[22] Name of SysV start script: S97hylafax
[23] Name of SysV stop script: K05hylafax
[24] Init script starts faxq: yes
[25] Init script starts hfaxd yes
[26] Start paging protocol: no
Are these ok [yes]? yes
(省略)
[root@localhost hylafax-6.0.5]# make
[root@localhost hylafax-6.0.5]# make install
◇初期設定を行う
[root@localhost hylafax-6.0.5]# /usr/local/sbin/faxsetup
(略)
Country code [1]? 81 ←日本
Area code []? xx ←日本国内の市外局番から0を除いたもの
Long distance dialing prefix [1]? 0 ←日本での場合は0
International dialing prefix [011]? 010 ←環境に適当なものを入力
(略)この内容は、/var/spool/hylafax/etc/config というファイルに保存されていた。
Do you want to run faxaddmodem to configure a modem [yes]? no
Done verifying system setup.
ソースからコンパイル作業を行ったiaxmodem-1.2.0 ディレクトリから、IAXmodem用のconfigの原型を持ってくる。
これがなければ、たとえば送出したファックスにタグ(ヘッダー)を付けられなかった。
[root@localhost iaxmodem-1.2.0]# cp -p ./config.ttyIAX /var/spool/hylafax/etc/config.ttyIAX
ファックスのFromタグに表示させる名称を、必要に応じて編集しておく。(ただし英数字のみ可)
[root@localhost ~]# vim /var/spool/hylafax/etc/config.ttyIAX
CountryCode: 81ファックスヘッダーフォーマットで使われている記号の意味
AreaCode: xx
FAXNumber: +81.xxx.xxx.xxx
LongDistancePrefix: 0
InternationalPrefix: xxx
DialStringRules: etc/dialrules
ServerTracing: 0xFFF
SessionTracing: 0xFFF
RecvFileMode: 0600
LogFileMode: 0600
DeviceMode: 0600
RingsBeforeAnswer: 1
SpeakerVolume: off
GettyArgs: "-h %l dx_%s"
LocalIdentifier: "example Co.Ltd." ←ファックス送信元情報
TagLineFont: etc/lutRS18.pcf
TagLineFormat: "From %%l %%n |%c Page %%P of %%T" ←ファックスヘッダーのフォーマット(意味は下に記載)
MaxRecvPages: 200
#
(以下省略)
%%l ・・・LocalIdentifier項目の値
%%n ・・・FAXNumber項目の値
%c ・・・現在の日時
| ・・・ファックス文書のヘッダー領域を左右に均等に区分するもの(上の例では、二分される)
ロケールを英語に切り替える(ファックス文書に印字される日本語の日付が文字化けするため)
[root@localhost ~]# date
2011年 9月 26日 月曜日 19:14:05 JST ←初めはこのように日本語で表記されていた[root@localhost ~]# cat /etc/sysconfig/i18n
LANG="ja_JP.UTF-8" ←変数の値は、書き換え前このようになっていた[root@localhost ~]# vim /etc/sysconfig/i18n
LANG="en_US.UTF-8"[root@localhost ~]# date
Mon Sep 26 19:18:18 JST 2011 ←再起動後に英語表記に切り替わった(再起動はあとで)
◇システム起動時に、必要なプロセスが始動するように設定を行う
Hylafaxのfaxgettyというプログラムに、iaxmodemモデムに繋がる/dev/ttyIAXを渡す。
/etc/rc.local に、/usr/local/sbin/faxgetty /dev/ttyIAX を記述する方法と、
inittabを使う方法がある。いずれかの方法で設定すればよい。
[root@localhost hylafax-6.0.5]# vim /etc/rc.local
最後の行に追加する。
/usr/local/sbin/faxgetty /dev/ttyIAX
あるいは、次のようにする。
[root@localhost hylafax-6.0.5]# vim /etc/inittab
# Run gettys in standard runlevels
(略)
# Run iaxmodem in standard runlevels
im1:2345:respawn:/usr/local/sbin/iaxmodem ttyIAX
# Run faxgetty in standard runlevels
imh1:2345:respawn:/usr/local/sbin/faxgetty /dev/ttyIAX
(略)
[注意]
このfaxgettyの行は、iaxmodemの行の後に追加すること。引数/dev/ttyIAXが、iaxmodemにより設定ファイルに基づいて生成されるからである。
◇システム起動時にhylafaxが自動起動されるように設定する
[root@localhost hylafax-6.0.5]# chkconfig hylafax on
◇iaxmodemなど必要なプロセスと共にhylafaxを起動させる
システム再起動後、全てが連動する。
[root@localhost hylafax-6.0.5]# reboot
以上でインストール作業の完了
■動作チェック■
【FAXの送信】
sendfaxコマンドを使ってfaxを送信しようとすると次のようなエラーが出て失敗した。
[root@localhost ~]# sendfax -n -d 電話番号 テキストファイル
/usr/local/sbin/textfmt: No font metric information found for "Courier-Bold".(略)
しかし、クライアントソフトウェアのWinPrint HylaFaxを使ってHylaFaxサーバーへアクセスすると、正常にfaxを送ることができた。
WinPrint Hylafaxは、Windowsのプリンタデバイスのように振舞うクライアントソフトウェアである。
文書を扱う適当なWindowsのアプリで「印刷」実行するだけで、Hylafaxサーバーに文書の送出を指示し、任意の宛先へFAXを送ることができる。
この場合、次のように送出される。
Windowsアプリ⇒ WinPrint Hylafax⇒ Hylafax⇒ IAXmodem⇒ ASTERISK⇒ 電話回線
WinPrint Hylafaxは、Windowsのプリンタデバイスのように振舞うクライアントソフトウェアである。
文書を扱う適当なWindowsのアプリで「印刷」実行するだけで、Hylafaxサーバーに文書の送出を指示し、任意の宛先へFAXを送ることができる。
この場合、次のように送出される。
Windowsアプリ⇒ WinPrint Hylafax⇒ Hylafax⇒ IAXmodem⇒ ASTERISK⇒ 電話回線
WinPrint Hylafaxの設定については、こちらのリンクを参考
http://akira-arets.blogspot.com/2011/09/ms-windows7-winprint-hylafaxfax.html
◇送信中には、ASTERISKのCLIには、次のようなメッセージが表示された
asterisk-01*CLI>たとえばiaxmodem側とasterisk側で共にulawが使われている場合、コーデックの変換はなく、そして次に説明するPLCは用いられない。(ulawとalawの組み合わせでも問題ない)
-- Accepting AUTHENTICATED call from 192.168.yyy.zzz:
> requested format = slin,
> requested prefs = (),
> actual format = ulaw, ←双方で使うコーデックとしてulawが選択されている
> host prefs = (ulaw|slin),
> priority = mine
-- Executing・・・(省略)・・・
音声FAX通信ではPLCが生じていないことは大切である。
PLCとは、パケットがロスしたときにそれがわからないよう無音を挿入するための機能である。
音声を使うFAX通信では、パケットロス時にPLCによって無音が挿入されるとうまく通信ができなくなってしまう。
通信中に20msの無音に遭遇するとFAXモデムは"carrier loss"を検出するからだ。
"carrier loss"は、FAXプロトコルでは次の手順に移るという意味を持っているため通信は失敗してしまう。
FAX送信でエラーが頻発する場合、asteriskを含めた相手先のアナログ電話への経路途中で、PLCが発生していないことを確かめる必要があるだろう。
(参考)
・Asterisk IAXmodem < http://www.voip-info.org/wiki/view/Asterisk+IAXmodem > 2011/10/30
・Member "asterisk-1.6.2.20/doc/tex/plc.tex" of archive asterisk-1.6.2.20.tar.gz:
< http://fossies.org/unix/misc/asterisk-1.6.2.20.tar.gz:a/asterisk-1.6.2.20/doc/tex/plc.tex > 2011/10/30
【FAXの受信】
◇ASTERISKのextensions.confに、fax着信用のコンテクストとエクステンションを追加する
[root@asterisk asterisk]# vim /etc/asterisk/extensions.conf
[fax_incoming]当然、この例では、
exten => incoming-fax,1,Dial(IAX2/iaxmodem)
外線から着信するデバイスの設定で、着信先コンテクストにはfax_incomingを指定し、
さらに、registerステートメントで、着信先エクステンションとしてincoming-faxを指定する必要がある。
◇外線からhylafaxへFAXを送信する
外線からFAX機などを使って文書を送信し、コンテクストfax-incomingのエクステンションincoming-faxに着信させると、
iaxmodemにダイヤルされ、hylafax側でiaxmodemが応答しfaxが受信される。
hylafaxの受信用ディレクトリを確認する
[root@localhost ~]# ls /var/spool/hylafax/recvq/
fax000000006.tifこのように、インデックスがつけられてtif形式で画像ファイルとしてFAXは保存される。