Sipdroid实现SIP(三): 消息接收处理
I. 注册回调
RegisterAgent类
在TransactionClient Fail/Success的回调中, 调用RegisterAgentListener的Register Fail/Sucess接口
public class RegisterAgent implements TransactionClientListener, SubscriberDialogListener {
RegisterAgentListener listener;
public RegisterAgent(...RegisterAgentListener listener, ...) {}
public void onTransSuccessResponse(TransactionClient ransaction, Message resp) {
listener.onUaRegistrationSuccess(this, target, contact, result);
}
public void onTransFailureResponse(TransactionClient, Message resp) {
listener.onUaRegistrationFailure(this, target, contact, result);
}
public void onTransTimeout(TransactionClient transaction) {
listener.onUaRegistrationFailure(this, target, contac, "Timeout");
listener.onUaRegistrationSuccess(this, target, contac, "Timeout");
}
}
TransactionClient类/--->SipProviderListener
1. extends Transaction
public abstract class Transaction implements SipProviderListener, TimerListener {
public void onReceivedMessage(SipProvider provider, Message msg){}
}
2. TransactionClient类
在Transaction Fail/Success(实际的SipProvider回调)的回调中, 调用TransactionClient的 Fail/Sucess接口
public class TransactionClient extends Transaction {
TransactionClientListener transaction_listener;
public TransactionClient(SipProvider sip_provider, Message req, TransactionClientListener listener) {
super(sip_provider);
request = new Message(req);
init(listener, request.getTransactionId()); //this.transaction_listener = listener;
}
//实际上的SipProvider回调
public void onReceivedMessage(SipProvider provider, Message msg) {
transaction_listener.onTransSuccessResponse(this, msg);
transaction_listener.onTransFailureResponse(this, msg);
}
pulic void onTimeout(Timer to) {
//和超时相关的transaction_listener回调
}
}
所以, SipProviderListener又是哪个对象触发的呢?
II. 来电回调
我真的太机智了, Sipdroid回调嵌套得很深, 从回调处理顺藤摸瓜找到回调触发很复杂, 找着找着就迷失在代码里. 倒不如来个crash, Boom! Runtime Exception blablabla... 然后系统就寄几把函数调用堆栈打印出来了蛤蛤蛤~
12-19 10:43:03.284 26271-26297/com.hik.visapp I/System.out: UA: onCallAccepted()
12-19 10:43:03.284 26271-26297/com.hik.visapp I/System.out: UA: ACCEPTED/CALL
12-19 10:43:03.284 26271-26297/com.hik.visapp I/System.out: SipProvider: WARNING: Error handling a new incoming message
12-19 10:43:03.285 26271-26297/com.hik.visapp W/System.err: java.lang.RuntimeException: Tried to costruct a new Parser with a null String
12-19 10:43:03.285 26271-26297/com.hik.visapp W/System.err: at org.zoolu.tools.Parser.<init>(Parser.java:64)
12-19 10:43:03.285 26271-26297/com.hik.visapp W/System.err: at org.zoolu.sdp.SdpParser.<init>(SdpParser.java:39)
12-19 10:43:03.285 26271-26297/com.hik.visapp W/System.err: at org.zoolu.sdp.SessionDescriptor.<init>(SessionDescriptor.java:205)
12-19 10:43:03.285 26271-26297/com.hik.visapp W/System.err: at org.sipdroid.sipua.UserAgent.launchMediaApplication(UserAgent.java:430)
12-19 10:43:03.285 26271-26297/com.hik.visapp W/System.err: at org.sipdroid.sipua.UserAgent.onCallAccepted(UserAgent.java:626)
12-19 10:43:03.285 26271-26297/com.hik.visapp W/System.err: at org.zoolu.sip.call.Call.onDlgInviteSuccessResponse(Call.java:312)
12-19 10:43:03.285 26271-26297/com.hik.visapp W/System.err: at org.zoolu.sip.dialog.InviteDialog.onTransSuccessResponse(InviteDialog.java:792)
12-19 10:43:03.285 26271-26297/com.hik.visapp W/System.err: at org.zoolu.sip.dialog.ExtendedInviteDialog.onTransSuccessResponse(ExtendedInviteDialog.java:322)
12-19 10:43:03.285 26271-26297/com.hik.visapp W/System.err: at org.zoolu.sip.transaction.InviteTransactionClient.onReceivedMessage(InviteTransactionClient.java:145)
12-19 10:43:03.285 26271-26297/com.hik.visapp W/System.err: at org.zoolu.sip.provider.SipProvider.processReceivedMessage(SipProvider.java:1076)
12-19 10:43:03.285 26271-26297/com.hik.visapp W/System.err: at org.zoolu.sip.provider.SipProvider.onReceivedMessage(SipProvider.java:1206)
12-19 10:43:03.285 26271-26297/com.hik.visapp W/System.err: at org.zoolu.sip.provider.UdpTransport.onReceivedPacket(UdpTransport.java:122)
12-19 10:43:03.286 26271-26297/com.hik.visapp W/System.err: at org.zoolu.net.UdpProvider.run(UdpProvider.java:189)
12-19 10:43:03.286 26271-26297/com.hik.visapp W/System.err: Error handling a new incoming message
传输层通知SipProvider偏向底层, 现在先跳过. SipProvider是怎样通知到Transaction的呢?
Version:0.9 StartHTML:-1 EndHTML:-1 StartFragment:0000000111 EndFragment:0000007686
/**
* SipProvider implements the SIP transport layer, that is the layer responsable
* for sending and receiving SIP messages. Messages are received by the callback
* function defined in the interface SipProviderListener.
* <p>
* SipProvider implements also multiplexing/demultiplexing service through the
* use of SIP interface identifiers and <i>onReceivedMessage()<i/> callback
* function of specific SipProviderListener.
* <p>
* A SipProviderListener can be added to a SipProvider through the
* addSipProviderListener(id,listener) method, where: <b> - <i>id<i/> is the
* SIP interface identifier the listener has to be bound to, <b> - <i>listener<i/>
* is the SipProviderListener that received messages are passed to. <p/> The SIP
* interface identifier specifies the type of messages the listener is going to
* receive for. Together with the specific SipProvider, it represents the
* complete SIP Service Access Point (SAP) address/identifier used for
* demultiplexing SIP messages at receiving side. <p/> The identifier can be of
* one of the three following types: transaction_id, dialog_id, or method_id.
* These types of identifiers characterize respectively: <br> - messages within
* a specific transaction, <br> - messages within a specific dialog, <br> -
* messages related to a specific SIP method. It is also possible to use the the
* identifier ANY to specify <br> - all messages that are out of any
* transactions, dialogs, or already specified method types.
* <p>
* When receiving a message, the SipProvider first tries to look for a matching
* transaction, then looks for a matching dialog, then for a matching method
* type, and finally for a default listener (i.e. that with identifier ANY). For
* the matched SipProviderListener, the method <i>onReceivedMessage()</i> is
* fired.
*/
译: SipProvider继承了SIP传输层的接口, 用来响应SIP消息的收/发. 消息的接收由SipProviderListener回调接口实现. 通过SIP接口标识和onReceivedMessage()回调函数(调用)指定的SipProvider监听器, SipProvider还继承了multiplexing/demultiplexing的复用服务功能. 一个SipProvider监听器可以通过addSipProviderListener(id,listener)方法添加到SipProvider的监听表, id是SIP接口标识, listener是收到的msg对应的监听者. SIP接口会根据msg类型区分不同的监听者. msg+指定监听者+指定SipProvider, 代表了一个接收处理方完整的SIP服务访问点(SIP SAP)地址/id. Identification有以下三类:(1)transaction_id; (2)dialog_id; (3)method_id. 这三种标识分别代表了: 包含指定transaction_id的msg; 包含指定dialog_id的msg; 包含指定method_id的msg. 当然也可以通过标识"ANY"来区分: 表示所有msg都不属于以上三类. 每当接收到一个msg时, SipProvider寻找id匹配的顺序是: transaction->dialog->method->default listener(ANY). 如果匹配, 对应的SipProviderListener的onReceivedMessage()方法将被调用.
Sipdroid实现SIP(三): 消息接收处理的更多相关文章
- 微信公众平台开发教程Java版(三) 消息接收和发送
https://www.iteye.com/blog/tuposky-2017429 前面两章已经介绍了如何接入微信公众平台,这一章说说消息的接收和发送 可以先了解公众平台的消息api接口(接收消息, ...
- Sipdroid实现SIP(六): SIP中的请求超时和重传
目录 一. Sipdroid的请求超时和重传 二. SIP中超时和重传的定义 三. RFC中超时和重传的定义 一. Sipdroid的请求超时和重传 Sipdroid实现SIP协议栈系列, 之前的文章 ...
- Sipdroid实现SIP(一): 注册
目录 注册: 预注册获取长号和用户注册 预注册返回长号 周期性用户注册 Receiver类概述 SipdroidEngine类概述 Sipdroid类中的用户注册: 注册代理和注册事务 注册代理类Re ...
- 微信开发——微信公众平台实现消息接收以及消息的处理(Java版)
本文主要讲述了如何在微信公众平台实现消息接收以及消息的处理,使用java语言开发,现在把实现思路和代码整理出来分先给兄弟们,希望给他们带来帮助. 温馨提示: 这篇文章是依赖前几篇的文章的. 第一篇:微 ...
- 微信开发之消息接收与回复--weixin-java-tools
一.前言 在上一篇文章<微信开发之如何使用开发工具--weixin-java-tools>中我给各位介绍了weixin-java-tools,并且介绍了如何使用weixin-java-to ...
- RabbitMQ:消息发送确认 与 消息接收确认(ACK)
默认情况下如果一个 Message 被消费者所正确接收则会被从 Queue 中移除 如果一个 Queue 没被任何消费者订阅,那么这个 Queue 中的消息会被 Cache(缓存),当有消费者订阅时则 ...
- Bitter.NotifyOpenPaltform : HTTP 异步消息接收调度中心—开源贡献 之 一:简介
现在互联网的系统越来越趋向于复杂,从单体系统到现在的微服务体系演变.公司与公司的分工也越来越明确. 大数据公司提供了大数据服务 人脸识别公司提供了人脸识别服务 OCR 公司提供了专业的OCR 服务 车 ...
- Bitter.NotifyOpenPaltform : HTTP 异步消息接收调度中心--开源贡献 之 一:简介
现在互联网的系统越来越趋向于复杂,从单体系统到现在的微服务体系演变.公司与公司的分工也越来越明确. 大数据公司提供了大数据服务 人脸识别公司提供了人脸识别服务 OCR 公司提供了专业的OCR 服务 车 ...
- XAMARIN.ANDROID SIGNALR 实时消息接收发送示例
SignalR 是一个开发实时 Web 应用的 .NET 类库,使用 SignalR 可以很容易的构建基于 ASP.NET 的实时 Web 应用.SignalR 支持多种服务器和客户端,可以 Host ...
随机推荐
- 读写ini文件
C# 使用文件流来读写ini文件 背景 之前采用ini文件作为程序的配置文件,觉得这种结构简单明了,配置起来也挺方便.然后操作方式是通过WindowsAPI,然后再网上找到一个基于WindowsAPI ...
- 迟到的 WPF 学习 —— 入门
之所以说"迟到的",是因为我太晚才开始学习 WPF 了,之前 WPF 刚发布的时候有过粗浅了解,那时的 WPF 还非常简陋,VS 提供的内置控件十分匮乏,让我这样的非常依赖 Win ...
- defer 与 async
defer HTML4.01定义的 只适用于外部脚本(IE4~7会支持内嵌脚本的defer属性) 告诉浏览器立即下载,延迟执行,脚本会延迟到整个页面全部解析完毕之后才运行 HTML5规范要求脚本按照他 ...
- IOS7学习之路九(ios7自定义UIAlertView)
IOS7的UIAlertView 不支持自定义,无法添加subview . 不过可以用第三方库git上的下载链接 https://github.com/wimagguc/ios-custom-a ...
- 数组和Hash表
数组和Hash表 当显示多条结果时,存储在变量中非常智能,变量类型会自动转换为一个数组. 在下面的例子中,使用GetType()可以看到$a变量已经不是我们常见的string或int类型,而是Obje ...
- RTB撕开黑盒子 Part 3: Beyond Surplus
在本文中,我将解释如果要对整个推广计划最大化利润,决定是否应该出价的应该是期望回本率(ROI),而不是期望利润,这与我们以前介绍的有所不同.在Datacratic,我们已经在2012年底切到了基于RO ...
- 解决中文乱码( jsp表单提交中文时出现乱码)
有三种方法: 1.建立一个filter中文解决乱码 2.Struts2在struts.xml中修改默认的编码设定 3.用Spring解决中文乱码 4.直接在jsp中修改解决 1.建立一个filter解 ...
- css换行和超出隐藏
一.强制换行1 word-break: break-all; 只对英文起作用,以字母作为换行依据.2 word-wrap: break-word; 只对英文起作用,以单词作为换行依据.3 white- ...
- ngx-push-stream模块源码学习(四)——订阅
一.概述 push stream模块允许三种模式的订阅者: longpolling:每收到服务端响应数据即断开连接然后迅速重连,连接耗时可以忽略 stream:与服务端保持长连接,持续不断的请求-&g ...
- JAXP进行DOM和SAX解析
1.常用XML的解析方式:DOM和SAX 1)DOM思想:将整个XML加载内存中,形成文档对象,所以对XML操作都对内存中文档对象进行. 2)SAX思想:一边解析,一边处理,一边释放内存资源---不允 ...