Asterisk 13 FAX送信

Asterisk のFAX送信機能を使ってみます。

参考:http://www.asteriskdocs.org/en/3rd_Edition/asterisk-book-html-chunk/Fax_id290275.html

FAXを送受信するためにはspandspライブラリが必要になります。インストール手順はこちらの投稿を参考にしてください。

FAX送信はTIFF画像を送信します。ここでは送信したいTIFF画像があることを前提にAsteriskでFAX送信する方法をご紹介します。

FAX送信処理

FAX送信をするためには extensions.conf で以下の関数を呼ぶだけで行えます。

exten => send,1,SendFAX(/tmp/foo.tif,d)

これだけでは、送信する画像が固定なのでいろいろな画像を送信できるように処理を考えてみます。

[send-fax]
exten => send,1,NoOp(**** SENDING FAX ****)
 same => n,SendFAX(${FAXFILE},d)
 same => n,Hangup()
; Hangup.
exten => h,1,NoOp(Hangup send-fax)
 same => n,NoOp(${FAXSTATUS})
 same => n,NoOp(${FAXERROR})

送信するファイルを動的にセットするため、SendFAX関数のパラメータに FAXFILE という変数を指定しています。
では、次にこのファイル名を与えてFAX送信を実行させます。

コール ファイルでFAX送信実行

Asterisk にはコールファイルと呼ばれる構造化されたファイルを使うことで、自動でダイアル発信させる仕組みがあります。FAX送信を行うためこのコールファイルを利用します。

コールファイルの構文はこちらをご覧ください。

TIFF画像をFAX送信するためのコールファイルは以下の通りです。
/tmp/bar.tif 画像を 0311112222 へ送信する例です。

Channel: SIP/0311112222@account
Extension: send
Context: send-fax
Set: FAXFILE=/tmp/bar.tif

上記内容のコールファイルを /var/spool/asterisk/outgoing ディレクトリに配置すると、上記 extensions.conf の send-fax コンテキストの FAXFILE 変数に /tmp/bar.tif がセットされて send エクステンションの 実行されます。 つまり、/tmp/bar.tif 画像が 0311112222 へFAX送信されます。

※ 注意点は、/var/spool/asterisk/outgoing ディレクトリに直接コールファイルを作成せず、一時ディレクトリに作成した後、移動する必要があります。

複数の画像ファイルを順次FAXで送信するには、画像、送信先ごとににコールファイルを作成してスプールさせれば送信できます。電話回線のチャネル数制限がありますので、コールファイル数をうまく調整しないと送信エラーになる場合があります。

Asterisk 13 FAX受信

Asterisk のFAX受信機能を使ってみます。

参考:http://www.asteriskdocs.org/en/3rd_Edition/asterisk-book-html-chunk/Fax_id290275.html

Asterisk はFAXを受信してTIFF画像へ保存します。FAXを受信するためにはspandspライブラリが必要になります。

Spandspライブラリのインストール

spandsp をビルドするためには libtiff ライブラリが必要です。

# yum install libtiff libtiff-devel

続いて、spandsp のビルド

# wget https://www.soft-switch.org/downloads/spandsp/spandsp-0.0.6.tar.gz
# tar zxvf spandsp-0.0.6.tar.gz
# cd spandsp-0.0.6
# ./configure
# make
# make install
# cat >> /etc/ld.so.conf.d/usrlocallib.conf   ※ ここで Enter タイプして、次行に続く
/usr/local/lib
ここで CTRL+d をタイプして保存します。
# ldconfig

Asterisk を Spandspライブラリとリビルド

spandsp をインストール後、Asteriskをリビルドします。

# cd /usr/local/src/asterisk-13.13.1    ※ ダウンロードした Asterisk のビルドによります
# ./configure
# make menuselect     ※ make menuselect で res_fax_spandsp を選択
Resource Modules / [*] res_fax_spandsp 
[Save & Exit]
# make
# make install
# service asterisk restart

FAX受信処理

extensions.conf で受信したFAXを TIFF 画像で保存します。

[faxin]
exten => _03XXXXXXX,1,NoOp(Faxin-${EXTEN})
 same => n,Set(FAXOPT(ecm)=yes)
 same => n,Set(FAXOPT(maxrate)=14400)
 same => n,Set(FAXOPT(minrate)=2400)
 same => n,Set(FAXOPT(modem)=v17,v27,v29)
 same => n,Set(TIFF=${EXTEN}-${UNIQUEID}.tif)
 same => n,ReceiveFax(/tmp/${TIFF})
 same => n,Hangup()
; Hangup.
exten => h,1,NoOp(Hangup in-fax)
 same => n,NoOp(FAX Status: ${FAXSTATUS})
 same => n,NoOp(FAXOPT(ecm): ${FAXOPT(ecm)})
 same => n,NoOp(FAXOPT(filename): ${FAXOPT(filename)})
 same => n,NoOp(FAXOPT(headerinfo): ${FAXOPT(headerinfo)})
 same => n,NoOp(FAXOPT(localstationid): ${FAXOPT(localstationid)})
 same => n,NoOp(FAXOPT(maxrate): ${FAXOPT(maxrate)})
 same => n,NoOp(FAXOPT(minrate): ${FAXOPT(minrate)})
 same => n,NoOp(FAXOPT(pages): ${FAXOPT(pages)})
 same => n,NoOp(FAXOPT(rate): ${FAXOPT(rate)})
 same => n,NoOp(FAXOPT(remotestationid): ${FAXOPT(remotestationid)})
 same => n,NoOp(FAXOPT(resolution): ${FAXOPT(resolution)})
 same => n,NoOp(FAXOPT(status): ${FAXOPT(status)})
 same => n,NoOp(FAXOPT(statusstr): ${FAXOPT(statusstr)})
 same => n,NoOp(FAXOPT(error): ${FAXOPT(error)})

備忘録として、受信したTIFF画像をPHP AGIを使ってJPEGへ変換したりするには ImageMagick が便利です。

ImageMagick のインストール

# yum install yum install ImageMagick ImageMagick-devel
# yum install php-pecl-imagick

Asterisk キューのログを MySql へ格納

Asterisk 呼情報をODBCでMySqlへ格納する方法を以前やりました。

Asterisk CDR(呼情報)をODBCでMySqlへ格納
Asterisk CDR(呼情報)をODBCでMySqlへ格納(後記)

今回はAsterisk のキュー(待ち呼)のログをODBCでMySqlへ格納する方法を紹介します。

1. キューログ用のテーブルを作成

まずは、キューログ用に queue_log テーブルを作成します。

CREATE TABLE `queue_log` (
    `id`              bigint(255) unsigned NOT NULL AUTO_INCREMENT,
    `time`            varchar(26) NOT NULL DEFAULT '',
    `callid`          varchar(40) NOT NULL DEFAULT '',
    `queuename`       varchar(20) NOT NULL DEFAULT '',
    `agent`           varchar(20) NOT NULL DEFAULT '',
    `event`           varchar(20) NOT NULL DEFAULT '',
    `data`            varchar(100) NOT NULL DEFAULT '',
    `data1`           varchar(40) NOT NULL DEFAULT '',
    `data2`           varchar(40) NOT NULL DEFAULT '',
    `data3`           varchar(40) NOT NULL DEFAULT '',
    `data4`           varchar(40) NOT NULL DEFAULT '',
    `data5`           varchar(40) NOT NULL DEFAULT '',
    `created`         timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (`id`),
    KEY `queue` (`queuename`),
    KEY `event` (`event`)
) DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;

2. extconfig.conf

/etc/asterisk/extconfig.conf にキューのログを格納する情報を記述します。

queue_log => odbc,asterisk,queue_log

第1パラメータ: ドライバ
第2パラメータ: res_odbc.conf のデータベースの設定情報 (DSN)
第3パラメータ: テーブル名

3. AsteriskとODBC接続の構成

AsteriskとODBC接続の構成は /etc/asterisk/res_odbc.conf で行います。

[asterisk]
enabled => yes
dsn => asterisk-connector
username => asterisk
password => asterpass
pre-connect => yes

4. ODBC設定の追加

Asteriskデータベースへの接続情報を /etc/odbc.ini へ追加します。

[asterisk-connector]
Description           = MySQL connection to 'asterisk' database
Driver                = MySQL
Database              = asterisk
Server                = localhost
UserName              = asterisk
Password              = asterpass
Port                  = 3306
Socket                = /var/lib/mysql/mysql.sock

5. 動作確認

Asterisk 再起動して動作確認します。

# service asterisk restart

キュー情報がMySqlへ格納されるか動作確認してみます。
ここでは、SIP #2501 がキューに入って #2502 が受けた結果を表示しています。

# mysql -u asterisk -p
Enter password: 

mysql> use asterisk;
mysql> select * from queue_log;

+----+----------------------------+--------------+------------+----------+----------------+------+-------+--------------+-------+-------+-------+---------------------+
| id | time                       | callid       | queuename  | agent    | event          | data | data1 | data2        | data3 | data4 | data5 | created             |
+----+----------------------------+--------------+------------+----------+----------------+------+-------+--------------+-------+-------+-------+---------------------+
| 18 | 2016-09-19 12:33:53.249160 | 1474256033.2 | queue_test | NONE     | ENTERQUEUE     |      |       | 2501         | 1     |       |       | 2016-09-19 12:33:53 |
| 19 | 2016-09-19 12:33:56.479286 | 1474256033.2 | queue_test | SIP/2502 | CONNECT        |      | 3     | 1474256033.3 | 3     |       |       | 2016-09-19 12:33:56 |
| 20 | 2016-09-19 12:34:06.721414 | 1474256033.2 | queue_test | SIP/2502 | COMPLETECALLER |      | 3     | 10           | 1     |       |       | 2016-09-19 12:34:06 |
+----+----------------------------+--------------+------------+----------+----------------+------+-------+--------------+-------+-------+-------+---------------------+
3 rows in set (0.01 sec)

参考:
http://stackoverflow.com/questions/30161384/asterisk-11-queue-log-to-mysql
http://work.mikeboylan.com/posts/2012/03/asterisk-queuelog-to-mysql.html
http://lists.digium.com/pipermail/asterisk-users/2009-September/237448.html

以上です。

Asterisk TLSとSRTPでより安全なコール (パート2: SRTP編)

前回はTLS設定で呼制御の暗号化を試みました。今回は通話の暗号化を試みます。

1. sip.conf の変更
/etc/asterisk/sip.conf のSIPクライアント(例 2001 )の定義に “encryption=yes” を追加します。

[2001]
type=peer
secret=password    ; this is NOT a secure password
host=dynamic
...(省略)...
transport=tls
encryption=yes

2. クライアントの設定
Zoiper で 暗号化 を有効にして確認します。

Preferences -> Accounts -> Advanced -> Use rport media をチェック
Preferences -> Accounts -> Advanced -> Use TLS with SDES SRTP を選択

以上です。

通話を開始すると Zoiper 上にカギのアイコンが表示されます。

また、今回の設定は Zoiper 以外にも AGEphone Business の評価版での試用をしました。
サポートの方に教えて頂きました AGEphone Business の設定方法は下記のとおりです。

Windows - AGEphone Biz3
TLS
- アカウント設定 > 接続種別 = TLS
- アカウント設定 > 全般の設定 > トランスポートにTLSを使う = ON
SRTP
- アカウント設定 > 全般の設定 > メディア暗号化(SRTP) = ON

Asterisk TLSとSRTPでより安全なコール (パート1: TLS編)

Asterisk には TLS(Transport Layer Security)SRTP(Secure Real-time Transport Protocol) により通信を安全に行う方法があります。

TLS は Asterisk と SIPクライアントの SIP によるやりとりを暗号化し、SRTP は電話の音声ストリームを暗号化します。
ここでは CentOS6.x 上で Asterisk 13 をソースをビルドしてインストール方法は省略します。ただし、Asterisk 13 のビルドは下記の必要なパッケージをインストールしてから行ってください。

1. 必要なパッケージのインストール
まず、暗号化にに必要な OpenSSL と LibSRTP をインストールします。

# yum install openssl openssl-devel
# yum install libsrtp libsrtp-devel

2. 自己署名証明書の作成
Asterisk で利用する自己署名証明書を生成するために Asterisk のソースディレクトリ下の contrib/scripts/に ast_tls_cert という便利なツールが付属しています。これで サーバー証明書とクライアント証明書を生成します。

# mkdir /etc/asterisk/keys
# ./ast_tls_cert -C foo.com -O "Foo Company" -d /etc/asterisk/keys
# ./ast_tls_cert -m client -c /etc/asterisk/keys/ca.crt -k /etc/asterisk/keys/ca.key -C foo.com -O "Foo Company" -d /etc/asterisk/keys -o sipclient

※ foo.com や "Foo Company" は実際のサーバーのFQDN またはIPアドレス、社名に置き換えてください。また、コマンドの途中でパスフレーズを数回入力するように促されますので適切なものを入力します。

コマンドを実行すると以下のファイルが /etc/asterisk/keys ディレクトリに生成されます。

# ll /etc/asterisk/keys 

asterisk.crt
asterisk.csr
asterisk.key
asterisk.pem
sipclient.crt
sipclient.csr
sipclient.key
sipclient.pem
ca.cfg
ca.crt
ca.key
tmp.cfg

3. sip.conf の変更
/etc/asterisk/sip.conf に以下を追加します。

tlsenable=yes
tlsbindaddr=0.0.0.0:5061
tlscertfile=/etc/asterisk/keys/asterisk.pem
tlscafile=/etc/asterisk/keys/ca.crt
tlscipher=ALL
tlsclientmethod=tlsv1

続けて、SIPクライアント(例 2001 )の定義に “transport=tls” を追加します。

[2001]
type=peer
secret=password    ; this is NOT a secure password
host=dynamic
...(省略)...
transport=tls

4. クライアントの設定
Zoiper で TLS を有効にして確認します。

Preferences -> Accounts -> Advanced -> Use rport をチェック
Preferences -> Accounts -> Advanced -> Use TLS transport を選択
Preferences -> Advanced -> Security -> Extra CA certificate に sipclient.pem ファイルを選択
Preferences -> Advanced -> Security -> Protocol suite: から TLS v1 を選択
Preferences -> Advanced -> Security -> Disable certificate verification をチェック ※1

※1 このチェックボックスは DANGEROUS DO NOT USE! と表記されていますが、これをチェックしないと
Certificatge: Issuer untrusted/not found/not valid/wrong purpose というエラーになります。
自己署名の証明書のためと思われます。また、再起動するとチェックが解除されていますので、起動のたびにチェックをする必要があります。
これが、フリー版の制限なのか、自己署名証明書のせいなのかはわかりません。;)