处理需要监控电话上的呼叫活动/状态的SIP应用程序。我的应用程序(UA)已在代理服务器上注册,正在监视的手机也是如此。我正在使用SUBSCRIBE / NOTIFY消息告诉手机我想知道它的“对话”事件,并且一旦订阅,这个工作正常。我遇到了两个问题:
我要求的订阅长度为900秒,并且从手机返回的持续数量为4000+秒。
订阅有效时可能会拔掉手机(请勿询问,但是,是的,这是可能的)。发生这种情况时,我没有得到任何类型的通知,因为手机不再可用。因此,我必须等待订阅超时,尝试续订,处理失败并创建新订阅。
我意识到我可以比到期时间更快地续订我的订阅,但还有更好的方法吗?例如,我是否能够获得“在场”事件并使用它们来了解手机何时在场?这些事件是否始终保证会在手机启动时发生,即便如此,因为中间有代理,我甚至会收到通知,或者我仍然不知道手机重新启动而不再识别我的订阅( S)?这些“存在”更新是否可以从代理请求?
任何见解都会很棒;目前,我只是尝试以更小的间隔刷新我的订阅,但我很想知道是否有更好的方法来解决它。提前谢谢。
答案 0 :(得分:4)
我不知道SIP不可知的方式,除了可能以某种方式ping手机,但肯定有一种SIP方式进行存在,并且使用与用于对话的相同订阅/通知模型,但在这种情况下用于存在。相关标准为RFC 3856 A Presence Event Package for the Session Initiation Protocol (SIP)。
通常情况下,状态通知会由SIP注册商生成,并且由于您说您的手机正在向您的代理注册,因此它还必须内置注册商。注册商会在其他手机的注册状态发生变化时通知您的UA,例如当它第一次上线或无法重新注册时。就手机“消失”与注册服务器检测到它之间的延迟而言,没有规定的方法可以做到这一点。您可以等待注册期限到期并在注册失败时将手机标记为离线,或者服务器可以主动向手机发送数据包甚至SIP请求(例如OPTIONS请求)并将其标记为离线(如果有)得到了失败的回应,Asterisk使用后一种方法。
答案 1 :(得分:0)
当SIP UAC客户端向SIP UAS注册器注册时,SIP客户端提供到期标头,表示SIP客户端需要重新注册自身的最长时间。如果SIP客户端在此时间段内未重新注册,则Sip UAS代理/注册服务器会将客户端标记为已断开连接。
像FreePBX和Asterisk这样的专有SIP软件包,主动地,在某个时间间隔内连续地向客户端发送SIP OPTIONS,其中客户端以OK方式响应。这是一种更主动的方式来验证SIP客户端是否在线;但是,这种技术是专有的,不属于实际的SIP规范。