AsteriskでODBCを利用してDB連携しよう

こんにちは。
Asteriskを触りはじめてから2年くらいのエンジニアです。
ダイアルプランからCDR(call detail records)以外にも、カスタム情報をDBに保存したい時があると思います。
 
やり方としてはAGIを使えばいろいろな言語で実装できますが、今回はAsteriskに実装されているODBCファンクションを利用したいと思います。
注意点として、AsteriskのMYSQLファンクションは最新バージョンではサポートされていないので使わないほうが良いです。

前提条件

以下の構成で作業を行います。
 

  • Asterisk 13.12.1
  • mmysql Ver 14.14 Distrib 5.1.73
  •  
    Asteriskはメジャーバージョンの違いがなければ問題ないと思います。
    mysqlはバージョンの差異による影響はほとんどなさそうです。
    Asterisk, mysql,に加えて、ODBCのパッケージ諸々が必要です。
    以下のコマンドを実行して追加します。
     

    ODBCドライバを設定する

    新しいバージョンのUnixODBCをインストールしていれば、以下の内容に近い、/etc/odbcinst.iniが自動で作成されています。
     

     
    このファイルは特に変更する必要はありません。

    Mysql ODBCコネクタの設定をする

    ODBCがmysqlに接続をする具体的な設定を行います。
    以下にならって設定をします。
     

     
    ここで重要なポイントは、driverにodbcinst.iniで設定したドライバ名を指定することです。
    それ以外は環境に合わせて入力してください。

    AsteriskのODBC接続設定

    上記で作成したODBCコネクタをAsterisk上で利用する設定をします。
    設定ファイルは、/etc/asterisk/res_odbc.confです。
    freepbxの場合、/etc/asterisk/res_odbc_custom.confです。
     

     
    ここで重要なポイントは、dsnに上記で設定したODBCコネクタ名を指定することです。
    enabledはyesに設定して、その他は環境に合わせて設定してください。

    ODBCファンクションの設定

    ダイアルプランから呼び出し、DBの読み書きを行う関数を定義します。
    設定ファイルは、/etc/asterisk/func_odbc.confです。
     

     
    上記で書き込み、読み込みの各関数を定義しました。
    func_odbc.confで設定するdsn名は、AsteriskのODBC接続設定で設定したものを利用します。

    ダイアルプランからODBCファンクションを呼び出す

    下記のダイアルプランでODBCファンクションを呼び出します。
     

     
    呼び出すときは、
    ODBC_関数名
    で呼び出すことができます。

    トラブルシューティング

    作成したODBCファンクションが呼び出されない時

    具体的には、以下のエラーが出たときです。
     

     
    この場合、作成したファンクションがodbcモジュールで認識されていないので、
    以下のコマンドでモジュールをリロードする必要があります。
     

     

    AsteriskのODBC接続設定を確認したい時

    以下コマンドで読み込まれているODBC接続設定を確認することができます。
     

     
    また、
    odbc read
    もしくは
    odbc write
    コマンドで読み込まれている定義された関数を確認することができます。
     

    おまけ:一度に複数のカラムを更新する

    ODBCファンクションの構文は、以下のようになっています。
     

     
    わかりづらいのは、関数の引数として与えたargNも、右オペランドで与えたval1も関数内で利用できる変数だということです。
     

     
    以下のようにARGとVALをミックスして使用することもできます。
     

    おわりに

    これまではAGIからPHPのPDOを通してDB連携を行うことが多かったですが、
    ODBCを利用することでよりダイアルプランを読んだだけでDB処理がわかるようになりました。
     
    数少ない(?)Asteriskエンジニアの一人としてAsteriskの情報は今後も発信していきたいと思います。

    この記事が気に入ったら
    いいね ! しよう

    Twitter で

    【採用情報】一緒に働く仲間を募集しています

    採用情報
    ページトップへ