,有時(shí)會(huì)在number數(shù)字后附加一些信息。如果向Asterisk發(fā)送了無(wú)效的命令,信息如下:510 
                  Invalid or unknown command。對(duì)應(yīng)上面的命令,如下所示:    
                  
                    - AGI Rx << SET CONTEXT media_gw1
 
                    
                    - AGI Tx >> 200 result=0
 
                  
                  
                    - 通過(guò)標(biāo)準(zhǔn)的輸入,從Asterisk接收信息
 
                  
                    當(dāng)AGI腳本執(zhí)行時(shí),Asterisk會(huì)向腳本發(fā)送各種的信息,可以在做其他事情之前通過(guò)標(biāo)準(zhǔn)輸入獲取這些信息,每項(xiàng)數(shù)據(jù)都是一行,發(fā)送完畢Asterisk會(huì)發(fā)送一個(gè)空行,表示結(jié)束,如: 
                  
                    - AGI Tx >> agi_request: dial_agi.php
 
                    
                    - AGI Tx >> agi_channel: SIP/25946-0821ea88
 
                    
                    - AGI Tx >> agi_language: en
 
                    
                    - AGI Tx >> agi_type: SIP
 
                    
                    - AGI Tx >> agi_uniqueid: 1209093478.477
 
                    
                    - AGI Tx >> agi_callerid: 0000123456
 
                    
                    - AGI Tx >> agi_calleridname: beigaolin
 
                    
                    - AGI Tx >> agi_dnid: 998866015810370728
 
                    
                    - AGI Tx >> agi_context: default
 
                    
                    - AGI Tx >> agi_extension: 998866015810370728
 
                    
                    - AGI Tx >> agi_priority: 1
 
                  
                    根據(jù)項(xiàng)目需求,如果需要這些數(shù)據(jù),就先保存起來(lái),否則不用處理它。保存步驟按如下過(guò)程。
                  
                    1.打開(kāi)PHP輸出文件描述符:
                  
                    $in = fopen("php://stdin","r");
                  
                    2.分析從Asterisk傳到AGI的頭信息,如需要在AGI程序中獲取終端用戶的ID,那么從“agi_calleridname: 
                  beigaolin”這個(gè)頭信息可以獲取,我們通過(guò)分析每一行這樣以:分隔的字符串,取到需要后續(xù)處理的字符串 
                    while (!feof($stdin)) { 
                    $temp = fgets($stdin); 
                    $temp = str_replace("\n","",$temp); 
                    $s = explode(":",$temp); 
                    $agivar[$s[0]] = trim($s[1]); 
                    if (($temp == "") || ($temp == "\n")) { 
                    break; 
                    } 
                    }
                  
                  4.使用開(kāi)源PHP AGI類函數(shù)PHPAGI
                  
                    像上一小節(jié)那樣先是獲取輸入流,分析從輸入頭字符串中獲取對(duì)應(yīng)某個(gè)輸入變量的值,或者獲取輸出流然后發(fā)送各種標(biāo)準(zhǔn)命令執(zhí)行某些Asterisk內(nèi)置應(yīng)用,如果在AGI程序中實(shí)現(xiàn)很復(fù)雜的業(yè)務(wù)邏輯,這樣的流程會(huì)顯得有點(diǎn)累贅,所以需要提取某些常用的操作,我們使用的時(shí)候不用關(guān)心這些操作,直接以調(diào)用類似Asterisk內(nèi)置應(yīng)用那樣的方式。PHPAGI就是這樣的一個(gè)開(kāi)源PHP類函數(shù)。它封裝了對(duì)應(yīng)Asterisk內(nèi)置應(yīng)用的常用函數(shù)調(diào)用接口,比如說(shuō)從PHP向Asterisk發(fā)送Dial命令的操作,可以直接調(diào)用PHP 
                  AGI類函數(shù)中的exec_dial。使用PHP AGI能夠很容易的操作Asterisk AGI常用接口。使用這個(gè)類函數(shù)也很簡(jiǎn)單: 
                  
                    - 下載準(zhǔn)備phpagi 函數(shù)文件
 
                  
                  
                    - cd /var/lib/asterisk/agi-bin/(也有可能在用戶自定義的路徑中)
 
                    
                    - wget http://nchc.dl.sourceforge.net/sourceforge/phpagi/phpagi-2.14.tgz
 
                    
                    - tar zxvf phpagi-2.14.tgz
 
                  
                  
                  
                    - include ("phpagi.php");//包含文件
 
                    
                    - include ("phpagi-asmanager.php");
 
                    
                    - $agi = new AGI;//引用PHPAGI類函數(shù)
 
                  
                  5.使用AGI實(shí)現(xiàn)主叫號(hào)碼透?jìng)鞴δ?/b>
                  
                    在這里以一個(gè)例子來(lái)說(shuō)明AGI程序在VoIP開(kāi)發(fā)中的作用以及開(kāi)發(fā)思路。 
                  
                    假設(shè)說(shuō)有個(gè)普通電話為02412345678,手機(jī)號(hào)為15810370728,而網(wǎng)絡(luò)電話虛擬號(hào)碼是0000123456,如果想讓撥打出去的電話號(hào)碼在被叫方(手機(jī)或者帶有來(lái)電顯示功能的座機(jī))的來(lái)電顯示為02412345678或者15810370728,那么他們回復(fù)電話的時(shí)候就可以直接打到這個(gè)普通電話上,方便與主叫的業(yè)務(wù)聯(lián)系。這個(gè)需求就叫主叫號(hào)碼透?jìng)鳎懿荒苓M(jìn)行主叫號(hào)碼的透?jìng)鳎Q于VoIP落地網(wǎng)關(guān)運(yùn)營(yíng)商,語(yǔ)音網(wǎng)關(guān)可以設(shè)置IP側(cè)送過(guò)來(lái)的主叫號(hào)碼是否透?jìng)鳌T诒WC號(hào)碼規(guī)范的前提下,透?jìng)魇裁礃拥闹鹘刑?hào)碼,則取決于IP-PBX系統(tǒng),即Asterisk的設(shè)計(jì)了。 
                  
                    1.增加一個(gè)針對(duì)終端用戶賬戶ID的綁定管理系統(tǒng),如圖用戶在第二項(xiàng)中輸入自己的賬戶ID,然后再輸入想要作為來(lái)顯示的主叫號(hào)碼完成綁定操作,后臺(tái)php程序向數(shù)據(jù)庫(kù)中插入一條新記錄(X-Lite 
                  ID對(duì)應(yīng)電話號(hào)碼或者手機(jī)號(hào)碼)。 
                  
                  
                    
 
                  
                   圖1AGI后臺(tái)管理系統(tǒng)頁(yè)面
                   
                      2.使用綁定了主叫號(hào)碼的X-Lite呼叫某個(gè)被叫(手機(jī)或者座機(jī)) 
                    
                      Asterisk的后臺(tái)PHP AGI程序的詳細(xì)設(shè)計(jì)主叫號(hào)碼透?jìng)髁鞒淘O(shè)計(jì)如圖2所示。 
                  
                    
 
                  
                   圖2Asterisk 主叫號(hào)碼透?jìng)鞯暮笈_(tái)PHP AGI流程圖  
                  
                  
                    以下代碼片斷展示的是PHP AGI中部分代碼,并且作了簡(jiǎn)化。
                  
                    #!/usr/local/php.5.2.5/bin/php –q
                    include_once("phpagi.php");//開(kāi)源PHP類函數(shù)
                    ......
                    //判斷當(dāng)前這個(gè)id是否做了主叫號(hào)碼來(lái)電顯示的綁定操作
                    $query_string = "select * from xliteid where xliteid = '{$caller_name}'";
                    $query_result = mysql_query($query_string, $db_connection); 
                  
                  
                    //如果當(dāng)前這個(gè)id做了綁定操作,調(diào)用PHPAGI類函數(shù),設(shè)置Asterisk主叫號(hào)碼
                  
                    if($query_result && mysql_num_rows($query_result) > 0)
                    { 
                    caller_phone_display_agi ();
                    } 
                    //沒(méi)有做綁定,設(shè)置一個(gè)隨機(jī)的號(hào)碼
                    else 
                    { 
                    caller_name = $argv[2];
                    $rand_num1 = rand(0,9);
                    $rand_num2 = rand(0,9);
                    $rand_num3 = rand(0,9);
                    $caller_phone= "024{$rand_num1}{$rand_num2}650{$rand_num3}{$rand_num4}";
                    land_media_gw1($caller_phone);
                    exit(); 
                    } 
                    /**
                    *@caller_phone_display_agi 主叫號(hào)碼特殊顯示
                    */
                    function caller_phone_display_agi()
                    {
                    global $db_connection, $callee_phone, $caller_name;
                    $query_string = "select caller_phone from caller_phone_display 
                  _xliteid where skype_id     = '{$caller_name}'";
                    $query_result = mysql_query($query_string, $db_connection); 
                  
                    {
                    $row = mysql_fetch_array($query_result);
                    $caller_phone = $row[0];
                    $callerid_cli = "\"{$caller_name}\"<{$caller_phone}>";
                    land_media_gw1($callerid_cli);
                    exit();
                    }
                    }
                    /**
                    *@ land_media_gw1 VoIP語(yǔ)音網(wǎng)關(guān)media_gw1
                    */ 
                    function land_media_gw1($callerid_num)
                    {
                    global $agi, $callee_phone_withpre;
                    $agi->set_context("media_gw1");
                    $agi->set_extension($callee_phone_withpre);
                    $agi->set_priority(1);
                    //調(diào)用phpagi封裝的set_callerid方法,向Asterisk傳遞設(shè)置主叫號(hào)碼的指令
                    $agi->set_callerid($callerid_num);
                    }
                  
                    對(duì)X-Lite賬戶gaolinb作了主叫號(hào)碼綁定,使用X-Lite軟終端呼叫普通的手機(jī),在Asterisk中設(shè)置了agi 
                  debug,從Asterisk后臺(tái)我們可以清晰地看到:
                  
                    1.AGI Tx >> *CLI>上面部分,全是從Asterisk輸入到當(dāng)前AGI的環(huán)境變量信息,它包含了當(dāng)前這個(gè)呼叫的詳細(xì)信息,如Channel的類型,是SIP還是H.323,calleridname,即終端用戶是gaolinb等重要信息。
                  
                    2.AGI Tx >> *CLI>下面部分,全是在上面調(diào)用PHPAGI類函數(shù)后將命令傳給了AGI程序執(zhí)行,對(duì)于主叫號(hào)碼來(lái)電顯示的命令是:
                  
                    SET CALLERID ‘gaolinb’<15810370728>,Asterisk將15810370728傳到能夠支持主叫號(hào)碼透?jìng)鞯腣oIP運(yùn)營(yíng)商,從而被叫用戶在接聽(tīng)電話前能夠顯示一個(gè)有意義的電話號(hào)碼。
                  
                  
                    
 
                  
                  
                    圖3 Asterisk服務(wù)器上AGI的輸入輸出信息  
                  貝高林的Blog
                  
相關(guān)鏈接: 
东方市|
华池县|
会理县|
桐庐县|
闻喜县|
庄河市|
富顺县|
象山县|
济南市|
文水县|
延边|
措勤县|
怀集县|
安泽县|
称多县|
邯郸市|
库车县|
三台县|
三亚市|
固安县|
成安县|
定日县|
阳东县|
安吉县|
舞阳县|
大关县|
湛江市|
乌苏市|
手游|
哈尔滨市|
三亚市|
贵溪市|
修武县|
奈曼旗|
卢氏县|
巴楚县|
新竹县|
特克斯县|
浪卡子县|
衡东县|
丰原市|