
多くの場合、携帯電話で都市からの不在着信を見つけ、折り返し電話をかけようとすると、ある会社の音声メニューが表示され、誰があなたに電話したかが完全に不明です。 私はしばしば、私たちの会社のクライアントと同様に、毎日これに直面しています...それについて何かをすることが決定されました。 後続のすべてのアクションは、trixbox v2.8.0.4に関連しています(いくつかの調整を行うか、おそらくそれらを使用せずに、他のシステムに実装できます)
完了したコールに関するすべての情報は、CDRレポート、およびそれに応じてmysqlデータベースに保存されます。
アルゴリズムは次のとおりです。
着信コールの番号を取得し、cdrテーブルに要求を行い、この番号への最後のコールを行った内部内線番号を取得し、内線番号を発音し、サブスクライバーを接続します。
アスタリスクホストでmysqlに入ると、この種のレコードが格納された1つの「cdr」プレートを持つ「asteriskcdrdb」データベースがすぐに表示されます。

必要なすべての列のうち:
- calldate-呼び出し時間
- dst-ダイヤル番号
- チャネル-呼び出し元の内線番号
クエリを試してみると、次のものが得られます。
SELECT `channel` FROM cdr WHERE `dst`='${CALLERID(number)}' ORDER BY `calldate` DESC LIMIT 1
ダイヤルされた番号が現在の発信者と一致するcdrテーブルからチャネルフィールドを取得し、降順でソートし、最後のレコードのみを取得します。 呼び出しがあった最後の番号。
カスタムアスタリスクファイルを使用します。 extensions_custom.confファイルの最後に次のコードを追加します。 この例では、拡張子456が使用されています。
[モバイルからのカスタム] exten => 456.1、回答() exten => 456、n、MYSQL(connid localhost root pass asteriskcdrdbに接続) exten => 456、n、MYSQL(クエリresultid $ {connid} SELECT `channel` FROM cdr WHERE` dst` = '$ {CALLERID(number)}' ORDER BY` calldate` DESC LIMIT 1) exten => 456、n、MYSQL(フェッチfetchid $ {resultid} VAR) exten => 456、n、MYSQL($ {resultid}をクリア) exten => 456、n、MYSQL(切断$ {connid}) exten => 456、n、Set(CHAN = $ {SHELL(echo $ {var} | tr -d '\ n' | sed -e 's /.*\/\(.*\)\-.*/ \ 1 / g ')}) exten => 456、n、Set(i = 0) exten => 456、n、Set(COUNTER = $ {LEN($ {CHAN})}) exten => 456、n、While($ [$ {i} <$ {COUNTER}]) exten => 456、n、再生(digitsru / $ {CHAN:$ {i}:1}) exten => 456、n、Set(i = $ [$ {i} + 1]) exten => 456、n、EndWhile() exten => 456、n、Goto(from-internal、$ {CHAN}、1)
- 電話に出る
- rootユーザー、パスワード、およびasteriskcdrdbデータベースを使用してデータベースに接続します
- 私たちは要求を満たします
- 結果を取得し、varに書き込みます
- リクエストからメモリを解放します
- データベースから切断する
- チャネルフィールドには、チャネル番号だけでなく、不要なものがsedによって削除されます(例:SIP / 160-0000000。正規表現では、「/」とその前のすべて、「-」とその後のすべて)、および追加の改行tr
- サイクルのインデックス
- 発音する内線番号の長さを取得します
- インデックスが数字の長さよりも短い間
- 数字の現在の数字を言う
- インデックスを1つ増やします
- サイクルを終了
- サブスクライバーの接続
コードはすべてのように見えますが、アスタリスクWebインターフェースでこの関数を完全に使用できることが必要です。 trixbox Webインターフェースに移動します。
PBX-PBX設定-ツール-カスタム宛先およびカスタム宛先の追加をクリックします。 2つのフィールドに入力します。
カスタム宛先:custom-from-mobile、456.1#custom-from-mobileはcustom_extensions.confに追加されたコードのヘッダー、456は内線番号、1は優先度です
説明:オプションで、たとえば456。

[変更の送信]をクリックすることを忘れないでください。
IVR音声メニューを編集し、たとえば、「5」という番号にカスタム宛先項目をハングアップさせます。作成したばかりの456を使用します。

変更を送信します。 設定変更を適用し、リロードを続行します。 変更の適用を待っています。
現在、当社の番号をダイヤルすると、クライアントは常に、音声メニューで5を押して、最後に呼び出した番号に接続する機会を得ることができます。
UPD1 ODBC。 ファイルへの迅速な調査では、データベースへの既存の接続を使用するために、cdrがodbcを介してmysqlに正確に接続する場所がわかりませんでした。 時間があるので、アップデートも探します。 現時点では、データベースに新しい接続を追加し、次のように使用しています。
必要なパッケージをインストールする
yum install mysql-connector-odbc
繰り返しますが、誰かがこのパッケージなしでcdrがどのように機能するかを説明できますか(odbcを使用しますか?)、システムにはありません。
次に、ファイル/etc/odbcinst.iniを編集して、ファイルの最後に追加します
[MySQL] 説明= ODBC for MySQL ドライバー= /usr/lib/libmyodbc3.so セットアップ= /usr/lib/libodbcmyS.so FileUsage = 1
*パスとファイル名には注意してください。システムにインストールされているodbcのバージョンによってすべて異なる場合があります。
同様に、/ etc / odbc.iniを編集します
[アスタリスクコネクタ] 説明=「アスタリスク」データベースへのMySQL接続 ドライバー= MySQL サーバー= localhost データベース= asteriskcdrdb UID =ルート PWD =パス ポート= 3306 SOCKET = / var / lib / mysql / mysql.sock
*ここでは、設定に従って入力します。 最初の行では、いわゆるdsnを任意に入力して覚えておいてください。
設定を確認してください。 ターミナルで、次のコマンドを実行します。
isql -vアスタリスクコネクタ
応答ですべてが正しく構成されている場合は、次のようになります。
+ --------------------------------------- + | 接続済み! | | | | SQLステートメント| | ヘルプ[テーブル名] | | 終了| | | + --------------------------------------- +
quitコマンドで終了します
ファイル/etc/asterisk/res_odbc.confの最後に追加します
[アスタリスク2mysql] 有効=>はい dsn =>アスタリスクコネクタ; /etc/odbc.iniから取得 事前接続=>はい
ファイル/etc/asterisk/func_odbc.confの最後に追加します
[FROMMOBILE] dsn = asterisk2mysql; /etc/asterisk/res_odbc.confから取得 readsql = cdrからチャネルを選択WHERE dst = $ {ARG1} ORDER BY calldate DESC LIMIT 1; パラメータARG1は、ダイヤルプランから呼び出すときに渡されます
さて、更新されたダイヤルプラン
[モバイルからのカスタム] exten => 456.1、回答() exten => 456、n、Set(CHAN = $ {SHELL(echo $ {ODBC_FROMMOBILE($ {CALLERID(number)})} | tr -d "\ n" | sed -e 's /.* \ / \( 。* \)\-。* / \ 1 / g ')}) exten => 456、n、Set(i = 0) exten => 456、n、Set(COUNTER = $ {LEN($ {CHAN})}) exten => 456、n、While($ [$ {i} <$ {COUNTER}]) exten => 456、n、再生(digitsru / $ {CHAN:$ {i}:1}) exten => 456、n、Set(i = $ [$ {i} + 1]) exten => 456、n、EndWhile() exten => 456、n、Goto(from-internal、$ {CHAN}、1) exten => 456、n、ハングアップ()
$ {ODBC_FROMMOBILE($ {CALLERID(number)})}-クエリ文字列
FROMMOBILEファイル/etc/asterisk/func_odbc.confから取得します
括弧内に、要求に必要なパラメーターをコンマで渡すことができます。/etc/asterisk/func_odbc.confファイルの要求では、変数ARG1、ARG2などでそれらを取得します。 この例では、1つのパラメーターのみが渡されます。
長所:ダイヤルプランコードが減少し、作業速度の向上が顕著になりました。
UPD2。 コメントの考え方は次のとおりです。 1人が会社の複数の人と話していると想像してください。 そして、逃した人がいて、その瞬間に別の人が彼に電話をかけ、会話をうまく行っている状況が起こります。 会話を終了し、現在の機能を使用すると、サブスクライバーは、既に通話した最後の発信者に到達し、以前に誰に電話をかけたかはわかりません。 このような状況を除外するには、追加のチェックを追加してリクエストを少し変更します。
ダイヤルプランからMySQLを使用する場合、コードは次のようになります。
[モバイルからのカスタム] exten => 456.1、回答() exten => 456、n、MYSQL(connid localhost root pass asteriskcdrdbに接続) exten => 456、n、MYSQL(クエリresultid $ {connid} SELECT `channel` FROM` cdr` WHERE` dst` = '$ {CALLERID(number)}' AND` disposition` = "NO ANSWER" OR `dst` = '$ {CALLERID(number)}' AND `disposition` =" ANSWERED "AND` billsec` <" 4 "ORDER BY` calldate` DESC LIMIT 1) exten => 456、n、MYSQL(フェッチfetchid $ {resultid} VAR) exten => 456、n、MYSQL($ {resultid}をクリア) exten => 456、n、MYSQL(切断$ {connid}) exten => 456、n、Set(CHAN = $ {SHELL(echo $ {var} | tr -d '\ n' | sed -e 's /.*\/\(.*\)\-.*/ \ 1 / g ')}) exten => 456、n、Set(i = 0) exten => 456、n、Set(COUNTER = $ {LEN($ {CHAN})}) exten => 456、n、While($ [$ {i} <$ {COUNTER}]) exten => 456、n、再生(digitsru / $ {CHAN:$ {i}:1}) exten => 456、n、Set(i = $ [$ {i} + 1]) exten => 456、n、EndWhile() exten => 456、n、Goto(from-internal、$ {CHAN}、1)
ODBCを使用する場合は、/ etc / asterisk / func_odbc.confでリクエストを編集します
[FROMMOBILE] dsn = asterisk2mysql; /etc/asterisk/res_odbc.confから取得 readsql = cdrからチャネルを選択WHERE dst = $ {ARG1} and disposition = NO ANSWERまたはdst = $ {ARG1} and disposition = ANSWERED AND billsec <4 ORDER BY calldate DESC LIMIT 1;
ダイヤルプランはUPD1と同じままです。
UPD3個人観察非常に良い状況が生じました。 1つのアスティスケには、いくつかのSIPトランクがあり、それに応じていくつかの会社があります。 各会社には独自のcalleridがあります。 1つの会社の電話番号が3つの会社から呼び出されたという状況を想像すると、どの都市番号にコールバックするかに関係なく、最後の発信者に電話するだけで、その会社の事実ではありません。 解決策は次のとおりです。 データベースからの選択に追加の検証パラメーターを追加します-このサブスクライバーが呼び出し元の呼び出し元。
両方のメソッドのリクエストで、 `src` = '$ {FROM_DID}'を追加します:
cdr WHERE` dst` = '$ {CALLERID(number)}'および `src` = '$ {FROM_DID}' ORDER BY` calldate` DESC LIMIT 1を選択します。