2

AMI (Asteriskserver との API 接続により、PHP Socket 接続を使用できます) を使用して、PHP を使用して受信データをキャッチしようとしています。私が働いている会社。しかし、期待した結果が得られません...完全なコードは PasteBin http://pastebin.com/AwRNBW2Gにあります。

私はこの方法で発信呼び出しをキャッチし、それは機能します:

  if($givenkey = array_search("Context: from-internal", $content)){
            $calleridKey = $givenkey + 1;
            $idSIP = $givenkey - 1;
            $dialNumber = str_replace("Extension: 0","31",$content[$calleridKey]);
            $dialNumber = str_replace("Extension: ", "", $dialNumber);
            $fromSIP = str_replace("Channel: SIP/", "", $content[$idSIP]);
            $fromSIP = substr($fromSIP, 0, 2);
            $dialTime = date('r');

            $uitgaand = array(
                            "Phonenumber"   => $dialNumber,
                            "Type"          => "Uitgaand",
                            "datetime"      => $dialTime,
                            "SIP"           => $fromSIP
                            );

着信コールはこの方法でキャッチされていますが、正しく機能していません:

   if($givenkey = array_search("AppData: Using CallerID ", $content)){
            if(array_search("Channel: SIP/31000000000", $content)+5 == $InCallKey = array_search("AppData: Using CallerID", $content)){
                    $calleridNum = explode('"',str_replace('AppData: Using CallerID "',"",$content[$InCallKey]));
                    $pickupSource = array_search("Source: SIP/31000000000", $content);
                    if($pickupSource+1 == $pickupKey = array_search("Destination: SIP/", $content)){
                            $pickupBy =  str_replace("Destination: SIP/","",$content[$pickupkey]);
                            $pickupBy = substr($pickupBy, 0, 2);
                            $dialTime = date('r');         
                            $inkomend = array(
                                            "Phonenumber" => $calleridNum[0],
                                            "Type"          => "Binnenkomend",
                                            "datetime"      => $dialTime,
                                            "SIP"           => $pickupBy
                                            );

現在利用できないアレイがありますが、必要に応じて、アレイを保存し、個人データをフィルタリングしてここに投稿できます。

私が今使っているコードがきちんとしていないことはわかっていますが、目標を持って書いたのです: 迅速な結果です。動作するコードがある場合は、それを最適化してクリーンアップします。これに関するヒントも大歓迎です。これに関する適切なドキュメントが見つからないのは残念です。そのため、最初から開始する必要があり、現在使用している作業クラスしか見つけることができませんでしたが、完全ではありません。この部分は、VOIP や AMI、Asterisk について何も知らずに書かなければなりませんでした。

簡単に言うと、私の質問は次のとおりです。 - AMI を使用して、着信通話と発信通話を記録して最終的にデータベースに保存するにはどうすればよいですか? - サーバーとの接続を維持するにはどうすればよいですか? 私が現在使用している方法は、接続が 48 時間以内に少なくとも 1 回失敗するため、最適ではありません。- コードを最適化し、よりきれいなコードを書くためのヒントや提案はありますか? そして、私が使用している関数の代わりに使用できる関数を知っているでしょうか?

よろしく、 デンプシー

最近、適切に解決できないこのエラーが発生しました。このエラーは、約 15 分の実行後に発生します。少なくとも 24 時間前に実行されます。

PHP Notice:  fwrite(): send of 16 bytes failed with errno=32 Broken pipe in /var/www/html/phpami/AMILoader.php on line 147
Net_AsteriskManagerException: Authorisation failed in /var/www/html/phpami/AMILoader.php on line 173
#0 /var/www/html/phpami/AMILoader.php(173): Net_AsteriskManager-login('GEBRUIKERSNAAM','WACHTWOORD')
#1 /var/www/html/phpami/AMILoader.php(306): Net_AsteriskManager-_sendCommand('Action: Ping???...')
#2 /var/www/html/phpami/AMILoader.php(543): Net_AsteriskManager->ping()
#3 {main}

誰でもこれで私を助けることができますか?認証データは正しいです (スクリプト全体で同じデータを使用しており、接続を取得します)。また、スクリプトによってコマンドとして送信されているという応答「Action: Ping???...」が得られませんが、3 つの疑問符とピリオドはどこから来るのですか?

4

2 に答える 2

1

このフレームワークは便利なはずです: https://github.com/marcelog/PAMI

それ以外の場合は、vTiger ソースと ami 統合の処理方法を確認できます: http://www.vtiger.com/index.php?Itemid=57&id=30&option=com_content&task=view

于 2011-05-12T14:53:56.283 に答える
1

PHP を使用している場合、AMI に接続する最も簡単な方法の 1 つは php-astmanager クラスを使用することです。必要なデータをキャッチできるように、特定の「イベント」でのコールバックをサポートしています。維持されている最良の (唯一の?) コピーはFreePBXの一部であり、最新バージョン (この記事の執筆時点では 2.9) からすぐに引き出すことができます。

于 2011-05-15T11:32:24.883 に答える