中文字幕无码久久精品,13—14同岁无码A片,99热门精品一区二区三区无码,菠萝菠萝蜜在线观看视频高清1

您當前的位置是:  首頁 > 新聞 > 國內(nèi) >
 首頁 > 新聞 > 國內(nèi) >

如何在Asterisk/FreeSWITCH環(huán)境下實現(xiàn)PUSH功能支持

2018-11-15 09:24:36   作者: james.zhu   來源:CTI論壇   評論:0  點擊:


  很多手機不能支持手機APP一直在后臺運行,這樣的話,手機耗電相當厲害。如果APP處于休眠狀態(tài)的話,電話呼入以后就會出現(xiàn)漏接的問題。為了保證手機app 那個正常接聽呼入的呼叫,需要通過推送PUSH消息提醒來喚醒手機的SIP軟電話。最近一個客戶問筆者這個問題,所以為了回答客戶的問題,筆者網(wǎng)上找到了這個比較可行的,經(jīng)濟的辦法來解決這個問題。今天,我們就和大家分享一下這個解決方法的具體實現(xiàn)過程。
  目前市場上的很多商業(yè)軟件可以支持PUSH功能。很多手機的操作系統(tǒng)都支持各自Push Notification Service(PNS),例如蘋果的APNS和安卓Google的FCM。
  這里,我們主要分享一個如何使用zoiper結(jié)合Windows phone 8 實現(xiàn)的大概流程,配合開源Asterisk或者FreeSWITCH的解決辦法,用戶可以自己測試。這里,在SIP的數(shù)據(jù)包中發(fā)送了一個 X-PUSH-URI 拓展頭,包括了一個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ù)器來獲取到詳細其信息,然后通過 HTTP POST request 發(fā)送到手機的APP上。幾個幾秒鐘的喚醒處理,手機APP可以接受呼叫來電。以下是Asterisk 環(huán)境下的撥號規(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 分機。
  在此路徑下保存腳本,執(zhí)行執(zhí)行權(quán)限設(shè)置 執(zhí)行chmod。
  /usr/bin/push.sh
  push.sh 基本代碼如下,大概處理流程是另外一個客戶的示例,用戶可以自己修改來做實驗。這里的消息推送使用的是谷歌的FCM,用戶可以選擇自己國內(nèi)的平臺。
  #!/opt/bin/php-cli -q<php
  $db2=new SQLite3('/opt/etc/asterisk/tokens.sqlite3'); // 使用數(shù)據(jù)庫
  $API_ACCESS_KEY='<YOUR_FIREBASE_API_SERVER_KEY>'; 獲取服務(wù)器的API訪問權(quán)限……
  $f=fopen("/tmp/log.txt","w"); // 打開一個log文件。
  $key="";
  $k=$argv[1];
  if (isset($argv[2])) {  // 從撥號規(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ù)庫
  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' // 這里是一個HTTP 的服務(wù)器,提供此服務(wù),用戶可以使用其他第三方的HTTP 服務(wù)來實現(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的話,需要修改撥號規(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"/> // 等待時間,然后進行下一步的呼叫流程。
  以上測試方法僅限于zoiper的示例,用戶可以參考此示例對其他的軟電話進行測試。這里僅僅提供了一種PUSH的思路,用戶可以修改代碼來支持更靈活的第三方服務(wù)器。另外,此PUSH的解決方案基本上和SIP PUSH協(xié)議的技術(shù)架構(gòu)非常類似,但是沒有完全遵守這個草案:
  Push Notification with the Session Initiation Protocol (SIP)
  draft-ietf-sipcore-sip-push-11
  軟交換對PUSH的處理也是非常重要一步,這里涉及了消息回復(fù)的問題,時間的問題和安全機制的問題和服務(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)注微信公眾號:asterisk-cn,獲得有價值的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中國合作伙伴,官方qq技術(shù)分享群(3000千人):589995817

【免責(zé)聲明】本文僅代表作者本人觀點,與CTI論壇無關(guān)。CTI論壇對文中陳述、觀點判斷保持中立,不對所包含內(nèi)容的準確性、可靠性或完整性提供任何明示或暗示的保證。請讀者僅作參考,并請自行承擔(dān)全部責(zé)任。

專題