誰が電話した? または、アスタリスクへのセルコールバック



多くの場合、携帯電話で都市からの不在着信を見つけ、折り返し電話をかけようとすると、ある会社の音声メニューが表示され、誰があなたに電話したかが完全に不明です。 私はしばしば、私たちの会社のクライアントと同様に、毎日これに直面しています...それについて何かをすることが決定されました。 後続のすべてのアクションは、trixbox v2.8.0.4に関連しています(いくつかの調整を行うか、おそらくそれらを使用せずに、他のシステムに実装できます)



完了したコールに関するすべての情報は、CDRレポート、およびそれに応じてmysqlデータベースに保存されます。

アルゴリズムは次のとおりです。

着信コールの番号を取得し、cdrテーブルに要求を行い、この番号への最後のコールを行った内部内線番号を取得し、内線番号を発音し、サブスクライバーを接続します。



アスタリスクホストでmysqlに入ると、この種のレコードが格納された1つの「cdr」プレートを持つ「asteriskcdrdb」データベースがすぐに表示されます。

画像



必要なすべての列のうち:





クエリを試してみると、次のものが得られます。

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) 




  1. 電話に出る
  2. rootユーザー、パスワード、およびasteriskcdrdbデータベースを使用してデータベースに接続します
  3. 私たちは要求を満たします
  4. 結果を取得し、varに書き込みます
  5. リクエストからメモリを解放します
  6. データベースから切断する
  7. チャネルフィールドには、チャネル番号だけでなく、不要なものがsedによって削除されます(例:SIP / 160-0000000。正規表現では、「/」とその前のすべて、「-」とその後のすべて)、および追加の改行tr
  8. サイクルのインデックス
  9. 発音する内線番号の長さを取得します
  10. インデックスが数字の長さよりも短い間
  11. 数字の現在の数字を言う
  12. インデックスを1つ増やします
  13. サイクルを終了
  14. サブスクライバーの接続




コードはすべてのように見えますが、アスタリスク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を選択します。 



All Articles