余晖落尽暮晚霞,黄昏迟暮远山寻
本站
当前位置:网站首页 > 编程知识 > 正文

如何在Asterisk环境下实现SIP PUSH功能

xiyangw 2023-09-27 18:09 25 浏览 0 评论

很多手机不能支持手机APP一直在后台运行,这样的话,手机耗电相当厉害。如果APP处于休眠状态的话,电话呼入以后就会出现漏接的问题。为了保证手机app 那个正常接听呼入的呼叫,需要通过推送PUSH消息提醒来唤醒手机的SIP软电话。最近一个客户问笔者这个问题,所以为了回答客户的问题,笔者网上找到了这个比较可行的,经济的办法来解决这个问题。今天,我们就和大家分享一下这个解决方法的具体实现过程。



目前市场上的很多商业软件可以支持PUSH功能。很多手机的操作系统都支持各自Push Notification Service(PNS),例如苹果的APNS和安卓Google的FCM。

这里,我们主要分享一个如何使用zoiper结合Windows phone 8 实现的大概流程,配合开源Asterisk或者FreeSWITCH的解决办法,用户可以自己测试。这里,在SIP的数据包中发送了一个 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 通过定位服务器来获取到详细其信息,然后通过 HTTP POST request 发送到手机的APP上。几个几秒钟的唤醒处理,手机APP可以接受呼叫来电。以下是Asterisk 环境下的拨号规则:

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 基本代码如下,大概处理流程是另外一个客户的示例,用户可以自己修改来做实验。这里的消息推送使用的是谷歌的FCM,用户可以选择自己国内的平台。

#!/opt/bin/php-cli -q<?php

$db2=new SQLite3('/opt/etc/asterisk/tokens.sqlite3'); // 使用数据库

$API_ACCESS_KEY='<YOUR_FIREBASE_API_SERVER_KEY>'; 获取服务器的API访问权限。。

$f=fopen("/tmp/log.txt","w"); // 打开一个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'"); // 查询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' // 这里是一个HTTP 的服务器,提供此服务,用户可以使用其他第三方的HTTP 服务来实现。

);

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的话,需要修改拨号规则执行流程:

<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"/> // 等待时间,然后进行下一步的呼叫流程。


以上测试方法仅限于zoiper的示例,用户可以参考此示例对其他的软电话进行测试。这里仅仅提供了一种PUSH的思路,用户可以修改代码来支持更灵活的第三方服务器。另外,此PUSH的解决方案基本上和SIP PUSH协议的技术架构非常类似,但是没有完全遵守这个草案:


Push Notification with the Session Initiation Protocol (SIP)

draft-ietf-sipcore-sip-push-11

软交换对PUSH的处理也是非常重要一步,这里涉及了消息回复的问题,时间的问题和安全机制的问题和服务器管理的问题。因此,如果用户需要部署大规模的消息推送解决方案,建议首先查阅这份草案。

官方链接和push脚本:https://www.zoiper.com/en/tutorials/push-notifications

SIP-PUSH协议:https://tools.ietf.org/html/draft-ietf-sipcore-sip-push-11







关注微信公众号:asterisk-cn,获得有价值的Asterisk行业分享

Asterisk freepbx 中文官方论坛:http://bbs.freepbx.cn/forum.php

Asterisk freepbx技术文档: www.freepbx.org.cn

融合通信商业解决方案,协同解决方案首选产品:www.hiastar.com

Asterisk/FreePBX中国合作伙伴,官方qq技术分享群(3000千人):589995817

相关推荐

华为交换机配置命令总结

1、配置文件相关命令[Quidway]displaycurrent-configuration显示当前生效的配置[Quidway]displaysaved-configuration显示fla...

解决账户无法登录的故障
解决账户无法登录的故障

在优化系统时错误地根据网上的提示,将唯一的Administrator账户设置为禁用,导致重启后无法进入系统。类似的故障还有使用组策略限制本地账户登录,导致重启后...

2023-10-11 17:16 xiyangw

S5720交换机登录提示初始密码存在安全风险
S5720交换机登录提示初始密码存在安全风险

问题描述客户每次登录输密码时,提示初始密码不安全,现在客户嫌麻烦想要去掉:Username:huaweiPassword:Warning:Theinitia...

2023-10-11 17:15 xiyangw

Springboot,Mybatis修改登录用户的密码
Springboot,Mybatis修改登录用户的密码

一、Mybatis.xml<updateid="changePassword"parameterType="string...

2023-10-11 17:15 xiyangw

PHP理论知识之沐浴更衣重看PHP基础(二)
PHP理论知识之沐浴更衣重看PHP基础(二)

接上篇,咱们继续讲解PHP基础八、标准PHP组件和框架的数量很多,随之产生的问题就是:单独开发的框架没有考虑到与其他框架的通信。这样对开发者和框架本身都是不利的...

2023-10-11 17:15 xiyangw

新鲜出炉UCloud云主机“数据方舟”评测报告(5)— — 关其城
新鲜出炉UCloud云主机“数据方舟”评测报告(5)— — 关其城

2015年10月29日,UCloud云主机黑科技——“数据方舟”功能正式上线,首轮内测随即开放。截止至2015年12月6日,我们共收到了534位用户的评测申...

2023-10-11 17:14 xiyangw

业余无线电Q简语及英文缩语
业余无线电Q简语及英文缩语

Q简语:语音通信及CW通信通用(加粗为常用)QRA电台何台QRB电台间之距离QRG告之正确频率QRH频率是否变动QRI发送音调QRJ能否收到QRK信号之可...

2023-10-11 17:14 xiyangw

非常详细!如何理解表格存储的多版本、生命周期和有效版本偏差
非常详细!如何理解表格存储的多版本、生命周期和有效版本偏差

表格存储在8月份推出了容量型实例,直接支持了表级别最大版本号和生命周期,高性能实例也将会在9月中旬支持这两个特性。那么,最大版本号和生命周期以及特有的...

2023-10-11 17:14 xiyangw

H3C交换机恢复出厂和各种基本配置,这20个要点你知道吗?
H3C交换机恢复出厂和各种基本配置,这20个要点你知道吗?

私信“干货”二字,即可领取138G伺服与机器人专属及电控资料!H3C交换机不知道密码如何恢复出厂设置1、开机启动,Ctrl+B进入bootrom菜单,选择恢复出...

2023-10-11 17:13 xiyangw

在使用移动支付系统的时候如何保护信息安全?

移动支付的方式近年来不断被更新,使得Venmo(据嘉丰瑞德理财师了解,此为美国的“支付宝”)之类的支付方式已经可以某种意义上代替随身携带现金了。但是你必须防范那些第三方应用程序轻松地获取你的银行卡以及...

界面控件DevExpress WinForms MVVM入门指南——登录表单(下)

从本文档中,您将了解如何向应用程序添加登录表单。在本节教程中着重讨论了如何实现此任务,这基本上是附加应用程序功能的一部分。DevExpressUniversalSubscription官方最新版免...

linux基础命令(一)
linux基础命令(一)

为啥要学linux?您可能熟悉WindowsXP、Windows7、Windows10和MacOSX等操作系统。Linux就是这样一种强大的操...

2023-10-11 17:13 xiyangw

MySQL数据库密码忘记了,怎么办?

#头条创作挑战赛#MySQL数据库密码忘记了且没有其他可以修改账号密码的账户时怎么办呢?登录MySQL,密码输入错误/*密码错误,报如下错误*/[root@TESTDB~]#mysql-u...

MobaXterm忘记Session密码,如何查看已保存的密码
MobaXterm忘记Session密码,如何查看已保存的密码

MobaXterm工具登录过SSH终端后,如果存储了Session(存储后再连接ssh的时候只需要输入账号不需要输入密码就可以直接连接上ssh),则可以...

2023-10-11 17:12 xiyangw

华为交换机密码丢失修改方法
华为交换机密码丢失修改方法

华为S2300交换机找回密码设置一、目的交换机的console和telnet密码丢失,无法登录设备。交换机已进行过数据配置,要把密码恢复而数据配置不能丢失。二、...

2023-10-11 17:12 xiyangw

取消回复欢迎 发表评论: