Sipdroid实现SIP(四): 传输层和应用层之间的枢纽SipProvider
目录
一. 概述
二. 主要变量
三. 主要方法
四. 在Sipdroid中的应用
一. 概述
在整套Sipdroid源码中, 类SipProvider是最靠近TCP/UDP的一层, 在Sipdroid实现的SIP协议栈中扮演底层枢纽的角色(前一篇文章中介绍的SipdroidEngine扮演的是上层枢纽), 这一角色也可以从该类是Configurable, TransportListener, TcpServerListener的继承体现出来.
向下层, SipProvider和通信传输层进行交互, 包括接收Transport的回调, 向Transport传递要发送的msg
向上层, SipProvider和UI交互, 包括根据msg触发指定Transaction回调, 从而通知Call再到UserAgent
二. 主要变量
2.1 监听标识之一: ANY
如果接收到的msg, 没有与其匹配的method_id, transaction_id或dialog_id, 就用ANY标识
public static final Identifier ANY = new Identifier("ANY");
2.2 监听标识之二: PROMISQUE
public static final Identifier PROMISQUE = new Identifier("PROMISQUE");
2.3 监听对象哈希表
在SipProviderListener中, 简单的接口定义和回调方法声明, 接口的对象listeners将会在SipProvider类中发挥重要的作用.
public void onReceivedMessage(SipProvider sip_provider, Message message);
listeners对象很关键, SipProvider提供的上下层枢纽功能都是要经过对应listener的被动触发和任务派发, Indentifier的值会在下面介绍.
Hashtable<Identifier, SipProviderListener> listeners = null;
2.4 通信协议相关
/*TCP/UDP相关*/
String[] transport_protocols = null;
boolean transport_udp = false;
boolean transport_tcp = false;
static UdpTransport udp = null;
TcpServer tcp_server = null; /*Socket相关*/
SocketAddress outbound_proxy = null;
private String outbound_addr = null;
private int outbound_port = -1;
三. 主要方法
3.1 初始化SipProvider
首先, 从宏观上了解SipProvider类, 需要明确以下三个问题:
1. SipProvider的生命周期伴随Sipdroid核心引擎的全过程
SipdroidEngine.StartEngine(): 在Sipdroid应用"引擎"初始化的时候初始化
SipdroidEngine.halt(): 在Sipdroid应用"引擎"终止的时候终止
2. 初始化SipProvider要完成哪些事情
SipProvider具有连接传输层和UA,RA的功能, 所以需要初始化和传输, 监听相关的变量, 比如传输协议, IP和端口, 服务器地址, 监听对象的哈希表
public SipProvider(String via_addr, int port, String[] protocols, String ifaddr) {
init(via_addr, port, protocols, ifaddr);
initlog();
startTrasport();
}
3. 初始化SipProvider后程序发生的变化
根据全局变量LINES的值, 确定了每个应用中初始化的sip_providers对象数组的大小.
3.2 应用启动时SipProvider监听者列表的变化过程(注册成功):
我删掉了和SipProviderListener无关的代码, 这样就能够显著看到Listener HashTable的变化情况: 在注册前逐个增加listeners, 当注册成功后, 和Register有关的listeners都被删除.
I/System.out: SipProvider: adding SipProviderListener: 412269425175@10.15.3.73-1-REGISTER-null-z9hG4bK26975
I/System.out: SipProvider: SipProviderListener: size=1, listeners=412269425175@10.15.3.73-1-REGISTER-null-z9hG4bK26975,
I/System.out: SipProvider: adding SipProviderListener: INVITE
I/System.out: SipProvider: SipProviderListener: size=2, listeners=INVITE, 412269425175@10.15.3.73-1-REGISTER-null-z9hG4bK26975,
I/System.out: SipProvider: adding SipProviderListener: OPTIONS
I/System.out: SipProvider: SipProviderListener: size=3, listeners=INVITE, OPTIONS, 412269425175@10.15.3.73-1-REGISTER-null-z9hG4bK26975,
I/System.out: SipProvider: adding SipProviderListener: 412269425175@10.15.3.73-2-REGISTER-null-z9hG4bK84870
I/System.out: SipProvider: SipProviderListener: size=4, listeners=INVITE, OPTIONS, 412269425175@10.15.3.73-1-REGISTER-null-z9hG4bK26975, 412269425175@10.15.3.73-2-REGISTER-null-z9hG4bK84870,
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
I/System.out: SipProvider: removing SipProviderListener: NOTIFY
I/System.out: SipProvider: WARNING: trying to remove a missed SipProviderListener.
I/System.out: SipProvider: SipProviderListener: size=4, listeners=INVITE, OPTIONS, 412269425175@10.15.3.73-1-REGISTER-null-z9hG4bK26975, 412269425175@10.15.3.73-2-REGISTER-null-z9hG4bK84870,
I/System.out: SipProvider: adding SipProviderListener: NOTIFY
I/System.out: SipProvider: SipProviderListener: size=5, listeners=INVITE, OPTIONS, NOTIFY, 412269425175@10.15.3.73-1-REGISTER-null-z9hG4bK26975, 412269425175@10.15.3.73-2-REGISTER-null-z9hG4bK84870,
I/System.out: SipProvider: removing SipProviderListener: 412269425175@10.15.3.73-1-REGISTER-null-z9hG4bK26975
I/System.out: SipProvider: SipProviderListener: size=4, listeners=INVITE, OPTIONS, NOTIFY, 412269425175@10.15.3.73-2-REGISTER-null-z9hG4bK84870,
I/System.out: SipProvider: removing SipProviderListener: 412269425175@10.15.3.73-2-REGISTER-null-z9hG4bK84870
I/System.out: SipProvider: SipProviderListener: size=3, listeners=INVITE, OPTIONS, NOTIFY,
3.3 呼叫请求时监听者列表的变化过程(呼叫失败)
I/System.out: SipProvider: removing SipProviderListener: INVITE
I/System.out: SipProvider: SipProviderListener: size=2, listeners=OPTIONS, NOTIFY,
I/System.out: SipProvider: adding SipProviderListener: 847642009035@10.15.3.73-z9hG4bK06452429-null
I/System.out: SipProvider: SipProviderListener: size=3, listeners=OPTIONS, NOTIFY, 847642009035@10.15.3.73-z9hG4bK06452429-null,
I/System.out: SipProvider: adding SipProviderListener: 847642009035@10.15.3.73-1-INVITE-null-z9hG4bK26053
I/System.out: SipProvider: SipProviderListener: size=4, listeners=OPTIONS, NOTIFY, 847642009035@10.15.3.73-z9hG4bK06452429-null, 847642009035@10.15.3.73-1-INVITE-null-z9hG4bK26053,
I/System.out: SipProvider: adding SipProviderListener: 847642009035@10.15.3.73-2-INVITE-null-z9hG4bK50097
I/System.out: SipProvider: SipProviderListener: size=5, listeners=OPTIONS, NOTIFY, 847642009035@10.15.3.73-z9hG4bK06452429-null, 847642009035@10.15.3.73-1-INVITE-null-z9hG4bK26053, 847642009035@10.15.3.73-2-INVITE-null-z9hG4bK50097,
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
I/System.out: SipProvider: removing SipProviderListener: 847642009035@10.15.3.73-z9hG4bK06452429-null
I/System.out: SipProvider: SipProviderListener: size=4, listeners=OPTIONS, NOTIFY, 847642009035@10.15.3.73-1-INVITE-null-z9hG4bK26053, 847642009035@10.15.3.73-2-INVITE-null-z9hG4bK50097,
I/System.out: SipProvider: adding SipProviderListener: INVITE
I/System.out: SipProvider: SipProviderListener: size=5, listeners=INVITE, OPTIONS, NOTIFY, 847642009035@10.15.3.73-1-INVITE-null-z9hG4bK26053, 847642009035@10.15.3.73-2-INVITE-null-z9hG4bK50097,
I/System.out: SipProvider: adding SipProviderListener: OPTIONS
I/System.out: SipProvider: WARNING: trying to add a SipProviderListener with a id that is already in use.
I/System.out: SipProvider: SipProviderListener: size=5, listeners=INVITE, OPTIONS, NOTIFY, 847642009035@10.15.3.73-1-INVITE-null-z9hG4bK26053, 847642009035@10.15.3.73-2-INVITE-null-z9hG4bK50097,
I/System.out: SipProvider: removing SipProviderListener: 847642009035@10.15.3.73-1-INVITE-null-z9hG4bK26053
I/System.out: SipProvider: SipProviderListener: size=4, listeners=INVITE, OPTIONS, NOTIFY, 847642009035@10.15.3.73-2-INVITE-null-z9hG4bK50097,
I/System.out: SipProvider: removing SipProviderListener: 847642009035@10.15.3.73-2-INVITE-null-z9hG4bK50097
I/System.out: SipProvider: SipProviderListener: size=3, listeners=INVITE, OPTIONS, NOTIFY,
3.4 从"哈希监听者列表"删除一个SipProvider监听
四. 在Sipdroid中的应用
就像每个产品会配一个产品经理一样, 每个UA和RA都会配一个sip_provider, 负责这个UA或RA的消息监听, 接收和处理.
Sipdroid实现SIP(四): 传输层和应用层之间的枢纽SipProvider的更多相关文章
- 网络层、传输层、应用层、端口通信协议编程接口 - http,socket,tcp/ip 网络传输与通讯知识总结
引: http://coach.iteye.com/blog/2024511 什么是TCP和UDP,以及二者区别是什么? TCP的全称为传输控制协议.这种协议可以提供面向连接的.可靠的.点到点的通信. ...
- 网络协议学习笔记(四)传输层的UDP和TCP
概述 传输层里比较重要的两个协议,一个是 TCP,一个是 UDP.对于不从事底层开发的人员来讲,或者对于开发应用的人来讲,最常用的就是这两个协议.由于面试的时候,这两个协议经常会被放在一起问,因而我在 ...
- doubango(4)--SIP协议栈传输层的启动
协议栈的默认传输结构 对于一个刚启动的协议栈来说,它需要有一个传输层,支持若干的传输结点.每一个传输结点对应于一个端口,若采用TCP连接,一个传输结点就针对于一个点到点的连接,这个连接负责sip信令的 ...
- doubango(5)--SIP协议栈传输层的启动
SIP协议的INVITE消息发起流程 当通过sip协议发起一个会话时,需要通过invite消息实现该流程.而SIP协议是一个基于事务的协议,每一个sip会话的都是通过sip部件间的一系列消息来完成的. ...
- HTTP协议属于应用层,而SOCKS协议属于传输层
HTTP协议属于应用层,而SOCKS协议属于传输层 SOCKS代理 SOCKS代理能在任何端口,任何协议下运行. SOCKS V4只支持 TCP连接,而SOCKS V5在其基础上增加了安全认证以及对U ...
- Sipdroid实现SIP(一): 注册
目录 注册: 预注册获取长号和用户注册 预注册返回长号 周期性用户注册 Receiver类概述 SipdroidEngine类概述 Sipdroid类中的用户注册: 注册代理和注册事务 注册代理类Re ...
- TCP/IP入门(3) --传输层
原文:http://blog.csdn.net/zjf280441589/article/category/1854365 传输层的主要功能 1)传输层为应用进程之间提供端到端的逻辑通信(网络层是为主 ...
- (传输层)TCP协议
目录 首部格式数据单位特定注意自动重传请求ARQ具体实现发送缓存接收缓存滑动窗口确认丢失和确认迟到超时重传时间选择报文段的发送时机运输连接发送TCP请求客户端拥塞处理相关概念避免拥塞具体实现TCP 的 ...
- 传输层TCP协议
目录 首部格式数据单位特定注意自动重传请求ARQ具体实现发送缓存接收缓存滑动窗口确认丢失和确认迟到超时重传时间选择报文段的发送时机运输连接发送TCP请求客户端拥塞处理相关概念避免拥塞具体实现TCP 的 ...
随机推荐
- nginx配置文件中的location详解
location 语法:location [=|~|~*|^~] /uri/ { … } 默认:否 上下文:server 这个指令随URL不同而接受不同的结构.你可以配置使用常规字符串和正则表达式.如 ...
- 关于如何惟一地标识一台Android设备的综合性讨论
想必大家在开发Android项目的时候,多多少少会遇到“如何惟一地标识一台Android设备”等类似的问题.不只是以前,即使是现在乃至可以预见的将来,这个问题都将一直存在. 如果大家使用搜索工具搜索的 ...
- Bootstrap 布局
bootstrap提供的布局主要有两种,固定布局和流动布局. Bootstrap 固定布局 用法 <body> <div class="container"> ...
- 我的Mac应用
笔记内容 我的Mac软件 用Mac已经2年+,主要用来看电影.听音乐.写日记,其实也是因为偶像uSi在用,选择Mac不仅仅是因为Mac编程特别好用,更是一种生活方式 办公软件 iWork超爱iWork ...
- IOS UI 第八篇:基本UI
实现图片的滚动,并且自动停止在每张图片上 - (void)viewDidLoad{ [super viewDidLoad]; UIScrollView *scrollView = [[U ...
- nhibernate+autofac+mvc的demo
想自己做一个小的demo.目的是能够提供一个系统架构,在这个基础上,可以快速开发一些小型的系统.
- [转]How WebKit Loads a Web Page
ref:https://www.webkit.org/blog/1188/how-webkit-loads-a-web-page/ Before WebKit can render a web pag ...
- CSDN CODE平台,中国版Github简要使用说明
CSDN CODE平台,中国版Github简要使用说明!(多图慎入) 楼主说 以前一直看到别人在用github发布自己的代码,各种牛逼,各种羡慕嫉妒恨.最后终于受不了了,也去注册了一个,注册到没什 ...
- journaling保证意外故障下的数据完整性
mongoDB研究笔记:journaling保证意外故障下的数据完整性 mongoDB的Journaling日志功能与常见的log日志是不一样的,mongoDB也有log日志,它只是简单记录了数据 ...
- Slide-out Sidebar Menu
IOS学习之路十(仿人人滑动菜单Slide-out Sidebar Menu) 2013-09-03 22:13 by lixingle, 270 阅读, 0 评论, 收藏, 编辑 最近滑动菜单比较流 ...