0

处理需要监控电话上的呼叫活动/状态的 SIP 应用程序。我的应用程序 (UA) 已向代理服务器注册,被监控的电话也是如此。我正在使用 SUBSCRIBE/NOTIFY 消息来告诉手机我想了解它的“对话”事件,并且一旦订阅,它就可以正常工作。我遇到了两个问题:

  1. 我要求订阅时长为 900 秒,并且始终从手机返回一些荒谬的 4000 多秒。

  2. 订阅激活时手机可能会被拔掉(不要问,但是,是的,这是可能的)。发生这种情况时,我没有收到任何关于手机不再可用的通知。因此,我必须等待我的订阅超时,尝试更新它,处理失败,然后创建一个新订阅。

我意识到我可以在订阅到期之前更新我的订阅,但有没有更好的方法呢?例如,我是否能够获取“存在”事件并使用它们来了解电话何时存在?这些事件是否总是保证在手机启动时发生,即便如此,由于中间有一个代理,我什至会收到通知,还是我仍然不知道手机重新启动并且不再识别我的订阅( s)?这些“存在”更新是我可以从代理请求的吗?

任何见解都会很棒;目前,我将尝试以更短的时间间隔刷新我的订阅,但我很想知道是否有更好的方法来解决它。提前致谢。

4

2 回答 2

5

除了可能以某种方式 ping 电话之外,我不知道与 SIP 无关的方式,但肯定有一种 SIP 方式来进行状态,并且使用与对话相同的订阅/通知模型,但在这种情况下用于状态。相关标准是RFC 3856 A Presence Event Package for the Session Initiation Protocol (SIP)

通常情况下,状态通知将由 SIP 注册器生成,并且由于您说您的电话正在向您的代理注册,因此它还必须具有内置的注册器。当其他电话的注册状态发生变化时(例如第一次发生时),注册器会通知您的 UA上线或重新注册失败。至于电话“消失”和注册服务器检测到它之间的延迟,没有规定的方法可以做到这一点。您可以等待注册期到期并将手机在注册失败时标记为离线,或者服务器可以主动向手机发送数据包甚至 SIP 请求(例如 OPTIONS 请求)并将其标记为离线得到一个失败响应,Asterisk 使用后一种方法。

于 2012-05-31T23:02:55.180 回答
0

当 SIP UAC 客户端向 SIP UAS 注册器注册时,SIP 客户端会提供一个 Expiry Header,它指示 SIP 客户端需要重新注册自己的最长时间。如果 SIP 客户端在这段时间内没有重新注册自己,那么 Sip UAS 代理/注册服务器会将客户端标记为断开连接。

像 FreePBX 和 Asterisk 这样的专有 SIP 包会主动向客户端发送 SIP OPTIONS,连续地,每隔一段时间,客户端会以 OK 响应。这是验证 SIP 客户端是否在线的一种更主动的方式;但是,这种技术是专有的,不是实际 SIP 规范的一部分。

于 2017-05-17T16:27:47.490 回答