23 February 2011

(Ubuntu 10.04) USBモデム(REX-USB54)でfax送信

Ubuntu Linuxで、USBモデムを使ってfax送信するためのセットアップメモ

■ 検証環境
・Ubuntu 10.04
・USBモデム REX-USB56
・TA NEC Aterm IT65EX ← 内線モードで送信確認するため
・fax

20110223-modem-fax.png

■ USBモデムの認識状況

USBモデムをコンピュータに差し込む前の状態

# ls -la /dev/tty* 〜 省略 〜 crw--w---- 1 root tty 4, 8 2011-02-23 19:49 /dev/tty8 crw--w---- 1 root tty 4, 9 2011-02-23 19:49 /dev/tty9 crw-rw---- 1 root dialout 4, 64 2011-02-23 19:49 /dev/ttyS0 crw-rw---- 1 root dialout 4, 65 2011-02-23 19:49 /dev/ttyS1 crw-rw---- 1 root dialout 4, 66 2011-02-23 19:49 /dev/ttyS2 crw-rw---- 1 root dialout 4, 67 2011-02-23 19:49 /dev/ttyS3

USBモデムをコンピュータに差し込んだ状態

# ls -la /dev/tty* 〜 省略 〜 crw--w---- 1 root tty 4, 8 2011-02-23 19:49 /dev/tty8 crw--w---- 1 root tty 4, 9 2011-02-23 19:49 /dev/tty9 crw-rw---- 1 root dialout 166, 0 2011-02-23 22:36/dev/ttyACM0 crw-rw---- 1 root dialout 4, 64 2011-02-23 19:49 /dev/ttyS0 crw-rw---- 1 root dialout 4, 65 2011-02-23 19:49 /dev/ttyS1 crw-rw---- 1 root dialout 4, 66 2011-02-23 19:49 /dev/ttyS2 crw-rw---- 1 root dialout 4, 67 2011-02-23 19:49 /dev/ttyS3

USBモデムは /dev/ttyACM0 として認識された模様

モデムの情報を読みだしてみる

# cu -l /dev/ttyACM0 Connected. ATI0 56000 ATI1 OK ATI2 OK ATI3 CX93001-EIS_V0.2002-V92 ~. ← cuの切断コマンド Disconnected. #

■ efax の設定

efaxをapt-getなどでインストールして設定を行う

/etc/efax.rc
#DEV=ttyS1 DEV=ttyACM0 FROM="+1 800 555 5555" ← 適当に書き換える NAME="Put Your Name Here" ← 適当に書き換える #PAGE=`paperconf` PAGE=a4 #INIT="-iZ -i&FE&D2S7=120 -i&C0" INIT="-iZ -i&FE&D2S7=120 -i&C0 -iX3"

内線電話でダイヤルトーンを検出しないようにするため ATX3 コマンドを付け加えている。ATXコマンドについては、モデム製造メーカーのホームページに詳細に書かれている
AT COMMAND 解説 (REX-USB56)

■ PS → TIFF 変換時のGhostscriptパラメータ修正

この修正をしなくてもOKの場合があるため、まず、修正を行わずFAX送信してみる。FAX送信時に

efax: 46:56 Error: can't read multi-strip TIFF files
efax: 46:56 Error: missing offset to TIFF data

のようなエラーが出た場合は、この修正を試してみるとよい

/usr/bin/fax
# $GS -q -sDEVICE=tiffg3 -r$RES -dNOPAUSE -dSAFER \ $GS -q -sDEVICE=tiffg3 -r$RES -dNOPAUSE -dSAFER -dMaxStripSize=0 \ -sOutputFile=$BASENAME.%03d \ -sPAPERSIZE=$PAGE \

※参考資料
[kubuntu] Efax error since 10.04 upgrade
FAX モデムドライバーのインストール方法と使用方法
Details of Ghostscript output devices (MaxStripSize のリファレンス)

■ FAXの送信

適当なPDFファイルを用意する (test.pdf)

pdftops コマンドで pdf を ps に変換し、さらに fax make コマンドで ps を tiff に変換する。 最終的に tiff ファイルを fax send コマンドでFAX送信する。

$ pdftops test.pdf $ fax make test.ps test.ps is postscript... $ fax send '#*1' test.ps.001 efax: Wed Feb 23 21:16:04 2011 efax v 0.9a-001114 Copyright 1999 Ed Casas efax: 16:04 opened /dev/ttyACM0 efax: 16:05 using CX93001-EIS_V0.2002-V92 in class 1 efax: 16:05 dialing T#*1 efax: 16:25 connected efax: 16:28 received UNKNOWN efax: 16:28 Warning: bit-reversed HDLC frame, reversing bit order efax: 16:28 received CSI - answering ID efax: 16:28 remote ID -> 81 312345678 efax: 16:28 received DIS - answering capabilities efax: 16:28 local 196lpi 14.4kbps 8.5"/215mm any 1D - - 0ms efax: 16:28 remote 196lpi 9600bps 8.5"/215mm any 1D - - 20/10ms efax: 16:28 session 196lpi 9600bps 8.5"/215mm any 1D - - 10ms efax: 16:28 sent TSI - caller ID efax: 16:29 sent DCS - session format efax: 16:32 sent TCF - channel check of 1800 bytes efax: 16:34 received CFR - channel OK efax: 16:35 header:[2011/02/23 21:16 +1 800 555 5555 Put Your Name Here p. 1/1] efax: 16:59 Warning: EOF before RTC efax: 17:00 sent 20+1961 lines, 14130+15647 bytes, 25 s 9528 bps efax: 17:00 sent EOP - done efax: 17:02 received MCF - page OK efax: 17:02 sent -> test.ps.001 efax: 17:02 sent DCN - disconnect efax: 17:04 done, returning 0 (success) $


■ 白黒2値化のディザリングが粗いのを解決する

ディザリングが粗いことについては 『 (Linux) GhostscriptとImageMagickを用いてFAX用ディザ2値画像を作る 』 に書いたが、その処理を自動化するシェルスクリプトを書いておいた

pdfファイルとガンマ値を指定すれば、-modという文字列を足したファイル名で新たなpdfファイルを作成される。このpdfを通常通りの手順でfax送信すれば、少しはマシなディザで送信できるかもしれない

pdf-dither.sh
#!/bin/bash var_pdf_fname=$1 if [ "$1" == "" ] then echo "usage : pdf-dither <pdf file> [gamma]" exit elif [ ! -f $var_pdf_fname ] then echo "pdf file " $var_pdf_fname "not exist" exit fi echo "Input pdf = " $var_pdf_fname var_base_fname=`basename $var_pdf_fname .pdf` if [ "$2" == "" ] then echo "set gamma : 0.4 (default)" var_gamma="-gamma 0.4" elif [ "$2" == "1" -o "$2" == "off" ] then echo "set gamma : off" var_gamma="" else echo "set gamma :"$2 var_gamma="-gamma "$2 fi read -p "enable force anti alias (with transparency off) ? [y/n] [N]: " var_user_input if [ "$var_user_input" == "Y" -o "$var_user_input" == "y" ] then echo "force antialias : on" var_trans="-dNOTRANSPARENCY" elif [ "$var_user_input" == "N" -o "$var_user_input" == "n" -o "$var_user_input" == "" ] then echo "force antialias : off" var_trans="" else echo "input error" exit fi rm -f /tmp/$var_base_fname*.jpg gs -sDEVICE=jpeg -r204x196 $var_trans -dNOPAUSE -dBATCH -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -sOutputFile=/tmp/$var_base_fname-%03d.jpg $var_pdf_fname rm -f /tmp/$var_base_fname*.tif for i in /tmp/$var_base_fname*.jpg ; do [ -f $i ] && echo converting ... /tmp/`basename $i .jpg`.tif; convert $i $var_gamma -monochrome -despeckle -density 204x196 -type Bilevel -format fax /tmp/`basename $i .jpg`.tif; done echo "Output pdf = "$var_base_fname-mod.pdf convert /tmp/$var_base_fname*.tif $var_base_fname-mod.pdf rm -f /tmp/$var_base_fname*.jpg rm -f /tmp/$var_base_fname*.tif