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 的 ...
随机推荐
- 使用JQUERY操作Radio
发展中经常使用Radio为了实现用户的选择的影响.我在该项目中使用的一些JQUERY操作Radio该方法.这里分享,对于有需要的朋友参考的. 1.变化radio选择.引发一些结果 $("in ...
- Web层后端权限模块
从零开始编写自己的C#框架(19)——Web层后端权限模块 不知不觉本系统写了快三个月了,最近写页面的具体功能时感觉到有点吃力,很多地方如果张嘴来讲的话可以说得很细,很全面,可写成文字的话,就不太 ...
- SignalR + KnockoutJS + ASP.NET MVC 实现井字游戏
SignalR + KnockoutJS + ASP.NET MVC 实现井字游戏 1.1.1 摘要 今天,我们将使用SignalR + KnockoutJS + ASP.NET MVC实现一个实 ...
- 常用排序算法的python实现和性能分析
常用排序算法的python实现和性能分析 一年一度的换工作高峰又到了,HR大概每天都塞几份简历过来,基本上一天安排两个面试的话,当天就只能加班干活了.趁着面试别人的机会,自己也把一些基础算法和一些面试 ...
- IP地址爬取
ip_spider.py= = = #!/usr/bin/python # coding: utf-8 import os import sys import requests import re i ...
- Linq无聊练习系列7----Insert,delete,update,attach操作练习
/*********************Insert,delete,update,attach操作练习**********************************/ ...
- WPF开发的FTP文件上传工具
前言 最近楼主在改版的项目里有使用到FTP上传文件,所以看到之前的项目里FTP上传的功能,然后抽个时间学习一番,做着做着就作出了这个工具了(虽然有些验证的功能没加上),但是基本的上传功能还是很好用的, ...
- POJ 1002 UVA 755 487--3279 电话排序 简单但不容易的水题
题意:给你许多串字符串,从中提取电话号码,输出出现复数次的电话号码及次数. 以下是我艰难的AC历程:(这题估计是我刷的题目题解次数排前的了...) 题目不是很难理解,刚开始想到用map,但stl的ma ...
- [转]Native Java Bytecode Debugging without Source Code
link from:http://www.crowdstrike.com/blog/native-java-bytecode-debugging-without-source-code/index.h ...
- Java:终结器
目录 背景Java版:终结器防卫者C#版:“终结器防卫者”备注 背景返回目录 多数情况我们不需要重写 finalize 方法,只有当我们需要持有未托管资源的时候才需要,而此时重写 finalize 方 ...