お問い合わせ

ブログ

これまでに経験してきたプロジェクトで気になる技術の情報を紹介していきます。

AsteriskでCDR(通信履歴)をODBC接続でMySQLへ保存する

YH YH 4 years
AsteriskでCDR(通信履歴)をODBC接続でMySQLへ保存する

通常のインストール(追加のアドオンなし)で可能です。

ODBCを介さずにMySQLへ保存できるか

make menuselectの Add-ons -> cdr_mysql を入れることで CDRもおそらくODBCを介さずに保存可能となります。 が、MySQL5系かMariaDBでやってください。 未確認なので それでもできないかもしれません。

理由としては

MySQL8ではmake で my_boolが使えないというエラーとなります。 これはAsterisk13の時点で既に報告されていて、 これ以降18でも改善されておらず同じことが起こります。 MySQL8以降ではmy_boolが廃止されていて使えないそうです。 公式リファレンスのRealtime Dtatabaseページで ODBCを介する手順のみが示されているのは、このエラーも一因となっているそうです。

mariaDBでは継続してmy_boolが使えるらしいので、mariaDBなら通る可能性があります。 ということは未確認ですがmariaDBなら全てODBCなしで接続できるかもしれません。

環境は

・CentOS 7.8.2003

・Asterisk 16.13.0

・MySQL 8.0.22

・unixODBC 2.31

cdr_odbc.confを編集します

;を消して有効化します。

[global]
dsn=asterisk
loguniqueid=yes
dispositionstring=yes
;table=cdr      ;"cdr" is default table name
usegmtime=no             ; set to "yes" to log in GMT
;hrtime=yes     ;Enables microsecond accuracy with the billsec and duration fields
newcdrcolumns=yes ; Enable logging of post-1.8 CDR columns (peeraccount, linkedid, sequence)

cdr_adaptive_odbc.confを編集します

;を消して有効化します。

[first]
connection=asterisk
table=cdr

テーブル作成

Asteriskの解凍ディレクトリのcontrib/realtime/mysql/mysql_cdr.sqlにcreate文があります。

これを実行してcdrテーブルを作ります。

CREATE TABLE cdr (
    accountcode VARCHAR(80), 
    src VARCHAR(80), 
    dst VARCHAR(80), 
    dcontext VARCHAR(80), 
    clid VARCHAR(80), 
    channel VARCHAR(80), 
    dstchannel VARCHAR(80), 
    lastapp VARCHAR(80), 
    lastdata VARCHAR(80), 
    start DATETIME, 
    answer DATETIME, 
    end DATETIME, 
    duration INTEGER, 
    billsec INTEGER, 
    disposition VARCHAR(45), 
    amaflags VARCHAR(45), 
    userfield VARCHAR(256), 
    uniqueid VARCHAR(150), 
    linkedid VARCHAR(150), 
    peeraccount VARCHAR(80), 
    sequence INTEGER
);

再起動して反映します。

# systemctl restart asterisk

これで完了です。

余談として

正常に記録できてもWARNINGは出るんですが気にする必要はないようです

AsteriskのCLIではcdrにレコード追加するタイミングで常に calldateカラムがないというWARNINGが出力されます。

WARNINGを解決しようとしてcalldateカラムを追加してしまうと、 calldateに 呼び出し開始時刻が入ります。そのかわり start,answer,endが全てnullとなってしまいます。

calldateをカラム削除すると、WARNINGは出力されるものの

・start 呼び出し開始時刻

・answer 電話に出た時刻

・end 通話終了時刻

がそれぞれのタイミングで記録されます。

前のバージョンでの仕様を残しているようです。

参考は以下

Asterisk CDR(呼情報)をODBCでMySqlへ格納|HARD DAY'S NIGHT ブログ

AsteriskでCDR(通信履歴)をODBC接続でMySQLへ保存する 2021-08-17 17:51:16

コメントはありません。

4094

お気軽に
お問い合わせください。

お問い合わせ
gomibako@aska-ltd.jp