处理需要在电话上监控呼叫活动/状态的 SIP 应用程序。我的应用程序 (UA) 已在代理服务器上注册,被监控的手机也是如此。我正在使用 SUBSCRIBE/NOTIFY 消息告诉手机我想知道它的“对话”事件,一旦订阅,这工作正常。我遇到了两个问题:
我要求订阅时长为 900 秒,并且始终从手机返回 4000+ 秒的荒谬数量。
当订阅处于活动状态时,电话可能会被拔掉(不要问,但是,是的,这是一种可能性)。发生这种情况时,我不会收到有关电话不再可用的任何类型的通知。因此,我必须等待我的订阅超时,尝试更新它,处理失败并创建一个新订阅。
我意识到我可以在订阅到期之前更新我的订阅,但有没有更好的方法来解决这个问题?例如,我能否获得“存在”事件并使用它们来知道电话何时在那里?这些事件是否总是保证在手机启动时发生,即使如此,由于中间有一个代理,我是否会收到通知,或者我仍然不知道手机重新启动并且不再识别我的订阅( s)?这些“存在”更新是我可以从代理请求的吗?
任何见解都会很棒;目前,我将简单地尝试以更短的时间间隔刷新我的订阅,但我很想知道是否有更好的方法来解决它。提前致谢。
I don't know about a SIP agnostic way other than perhaps somehow pinging the phone but there is definitely a SIP way to do presence and that's using the same subscribe/notify model you are using for dialogs but in this case for presence. The relevant standard is RFC 3856 A Presence Event Package for the Session Initiation Protocol (SIP).
通常情况下,状态通知将由 SIP 注册器生成,并且由于您说您的手机正在向您的代理注册,因此它也必须内置一个注册器。当其他电话的注册状态发生变化时,例如它第一次更改时,注册器会通知您的 UA在线或重新注册失败时。至于电话“消失”和注册服务器检测到它之间的延迟,没有规定的方法来做到这一点。您可以等待注册期到期并在注册失败时将电话标记为离线,或者服务器可以主动向电话发送数据包甚至 SIP 请求(例如 OPTIONS 请求)并将其标记为离线得到失败响应,Asterisk 使用后一种方法。