• <strike id="fdgpu"><input id="fdgpu"></input></strike>
    <label id="fdgpu"></label>
    <s id="fdgpu"><code id="fdgpu"></code></s>

  • <label id="fdgpu"></label>
  • <span id="fdgpu"><u id="fdgpu"></u></span>

    <s id="fdgpu"><sub id="fdgpu"></sub></s>
    您當前的位置是:  首頁(yè) > 新聞 > 國內 >
     首頁(yè) > 新聞 > 國內 >

    如何在A(yíng)sterisk/FreeSWITCH環(huán)境下實(shí)現PUSH功能支持

    2018-11-15 09:24:36   作者: james.zhu   來(lái)源:CTI論壇   評論:0  點(diǎn)擊:


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

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

    專(zhuān)題

    亚洲精品网站在线观看不卡无广告,国产a不卡片精品免费观看,欧美亚洲一区二区三区在线,国产一区二区三区日韩 民县| 菏泽市| 南昌市| 和林格尔县| 绥滨县| 安阳市| 桂东县| 古丈县| 衡山县| 洞口县| 通州市| 吴桥县| 富裕县| 云南省| 普宁市| 枞阳县| 张家口市| 浦县| 舒兰市| 镇沅| 长乐市| 台北市| 中卫市| 庄河市| 南宁市| 桐梓县| 曲水县| 工布江达县| 松潘县| 收藏| 阿克陶县| 临安市| 公主岭市| 灵璧县| 库伦旗| 墨脱县| 贞丰县| 黄龙县| 永顺县| 于都县| 天祝| http://444 http://444 http://444 http://444 http://444 http://444