目前市場(chǎng)上的很多商業(yè)軟件可以支持PUSH功能。很多手機(jī)的操作系統(tǒng)都支持各自Push Notification Service(PNS),例如蘋果的APNS和安卓Google的FCM。
這里,我們主要分享一個(gè)如何使用zoiper結(jié)合Windows phone 8 實(shí)現(xiàn)的大概流程,配合開源Asterisk或者FreeSWITCH的解決辦法,用戶可以自己測(cè)試。這里,在SIP的數(shù)據(jù)包中發(fā)送了一個(gè) X-PUSH-URI 拓展頭,包括了一個(gè)PUSH URL。具體的SIP消息如下:
REGISTER sip:10.2.1.9:6060;transport=UDP SIP/2.0
Via: SIP/2.0/UDP 10.8.3.36:52685;branch=z9hG4bK-d8754z-a48cbc16a2db2714-1---d8754z-;rport
Max-Forwards: 70
Contact: <sip:909@10.8.3.36:52685;rinstance=0667df2a9c36ce63;transport=UDP;X-PUSH-URI=http://db3.notify.live.net/throttledthirdparty/01.00/AQEVPwmdC_zuSZiednVGrPo6AgAAAAADOwAAAAQUZm52OkE0QUNBREI0MTdBQzBCNjQFBlVTTkMwMQ>To: <sip:909@10.2.1.9:6060;transport=UDP>
From: <sip:909@10.2.1.9:6060;transport=UDP>;tag=7b68d666
Call-ID: YTE4ZWZhMmEyYjk2ZDdjM2VkZTM5YzBlYmNmNGE4ZjQ.
CSeq: 1 REGISTER
Expires: 60
Allow: INVITE, ACK, CANCEL, BYE, NOTIFY, REFER, MESSAGE, OPTIONS, INFO, SUBSCRIBE
Supported: replaces, norefersub, extended-refer, timer, X-cisco-serviceuri
User-Agent: Zoiper r21941
Allow-Events: presence, kpml
Content-Length: 0
此URL 通過定位服務(wù)器來獲取到詳細(xì)其信息,然后通過 HTTP POST request 發(fā)送到手機(jī)的APP上。幾個(gè)幾秒鐘的喚醒處理,手機(jī)APP可以接受呼叫來電。以下是Asterisk 環(huán)境下的撥號(hào)規(guī)則:
exten => 1001,1,Answer;
exten => 1001,n,Set(location=${DB(SIP/Registry/1001)})
exten => 1001,n,Verbose(0, getting push info ${location} );
exten => 1001,n,Set(regx="X-PUSH-URI=([0-9a-zA-Z\.\:\/\_]+)")
exten => 1001,n,Set(push=$["${location}" =~ ${regx}])
exten => 1001,n,System(/usr/bin/push.sh ${push}); // 處理AGI 腳本
exten => 1001,n,Wait(3);
exten => 1001,n,Dial(SIP/1001); // 然后撥打1001 分機(jī)。
在此路徑下保存腳本,執(zhí)行執(zhí)行權(quán)限設(shè)置 執(zhí)行chmod。
/usr/bin/push.sh
push.sh 基本代碼如下,大概處理流程是另外一個(gè)客戶的示例,用戶可以自己修改來做實(shí)驗(yàn)。這里的消息推送使用的是谷歌的FCM,用戶可以選擇自己國(guó)內(nèi)的平臺(tái)。
#!/opt/bin/php-cli -q<php
$db2=new SQLite3('/opt/etc/asterisk/tokens.sqlite3'); // 使用數(shù)據(jù)庫(kù)
$API_ACCESS_KEY='<YOUR_FIREBASE_API_SERVER_KEY>'; 獲取服務(wù)器的API訪問權(quán)限……
$f=fopen("/tmp/log.txt","w"); // 打開一個(gè)log文件。
$key="";
$k=$argv[1];
if (isset($argv[2])) { // 從撥號(hào)規(guī)則獲得AGI參數(shù)
$v=$argv[2];
if (preg_match('/pn-tok=([^;]+)/i', $v,$token)) {
$v=$token[1];
$db2->query("delete from keys where key='$k'");
$db2->query("insert into keys values( '$k','$v')");
fwrite($f,"got token $v\r\n");
}
fwrite($f,"k=$k, v=$v\r\n");
}
//we read here in case we didnt get a new token so use the stored value
$results=$db2->query("SELECT value FROM keys where key = '$k'"); // 查詢sql lite 數(shù)據(jù)庫(kù)
if ($row=$results->fetchArray())
$key=$row["value"];
if ($key != "") {
fwrite($f,"key=$key\r\n");
$registrationIds = array($key) ;
$msg = array
。
'title' => 'Notification',
'body' =>'Wake Up'
。;
$fields = array
(
'registration_ids' => $registrationIds,
'data' => $msg,
'priority' =>10
。;
$headers = array
(
'Authorization: key=' . $API_ACCESS_KEY,
'Content-Type: application/json'
。;
$ch = curl_init();
curl_setopt( $ch,CURLOPT_URL, 'https://fcm.googleapis.com/fcm/send' // 這里是一個(gè)HTTP 的服務(wù)器,提供此服務(wù),用戶可以使用其他第三方的HTTP 服務(wù)來實(shí)現(xiàn)。
。;
curl_setopt( $ch,CURLOPT_POST, true );
curl_setopt( $ch,CURLOPT_HTTPHEADER, $headers );
curl_setopt( $ch,CURLOPT_RETURNTRANSFER, true );
curl_setopt( $ch,CURLOPT_SSL_VERIFYPEER, false );
curl_setopt( $ch,CURLOPT_POSTFIELDS, json_encode( $fields ) );
$result = curl_exec($ch );
curl_close( $ch );
fwrite($f,"$result\r\n");
} // if key
fclose($f);
?>
如果用戶使用FreeSIWTCH的話,需要修改撥號(hào)規(guī)則執(zhí)行流程:
<action application="set" data="result=${sofia_contact(1001)}"/>
<action application="set" data="push=${regex(${result}|^(?:.*)X-PUSH-URI=(.*)|%1)}"/>" // 設(shè)置參數(shù)
<action application="set" data="result=${system /usr/bin/push.sh ${push}}"/> // 執(zhí)行push 腳本
<action application="sleep" data="2000"/> // 等待時(shí)間,然后進(jìn)行下一步的呼叫流程。
以上測(cè)試方法僅限于zoiper的示例,用戶可以參考此示例對(duì)其他的軟電話進(jìn)行測(cè)試。這里僅僅提供了一種PUSH的思路,用戶可以修改代碼來支持更靈活的第三方服務(wù)器。另外,此PUSH的解決方案基本上和SIP PUSH協(xié)議的技術(shù)架構(gòu)非常類似,但是沒有完全遵守這個(gè)草案:
Push Notification with the Session Initiation Protocol (SIP)
draft-ietf-sipcore-sip-push-11
軟交換對(duì)PUSH的處理也是非常重要一步,這里涉及了消息回復(fù)的問題,時(shí)間的問題和安全機(jī)制的問題和服務(wù)器管理的問題。因此,如果用戶需要部署大規(guī)模的消息推送解決方案,建議首先查閱這份草案。
官方鏈接和push腳本:https://www.zoiper.com/en/tutorials/push-notifications
SIP-PUSH協(xié)議:https://tools.ietf.org/html/draft-ietf-sipcore-sip-push-11
關(guān)注微信公眾號(hào):asterisk-cn,獲得有價(jià)值的Asterisk行業(yè)分享
Asterisk freepbx 中文官方論壇:http://bbs.freepbx.cn/forum.php
Asterisk freepbx技術(shù)文檔: www.freepbx.org.cn
融合通信商業(yè)解決方案,協(xié)同解決方案首選產(chǎn)品:www.hiastar.com
Asterisk/FreePBX中國(guó)合作伙伴,官方qq技術(shù)分享群(3000千人):589995817