CSipSimple结构浅析
最近做一个VOIP的项目,调研了CSipSimple。都说CSipSimple结构清晰,但是代码下下来看了一下,还是一头雾水,不知从何看起。于是想到从最简单的打电话开始,借助网上一篇博文"CSipSimple 拨通电话机制分析",看看整个流程是怎么走的。由于工程围绕sip协议这个核心,因此我们从底层往上层逐步分析。
流程梳理
1. jni
CSipSimple底层sip协议栈用的是pjsip,而pjsip是用c写的,这必然牵扯到jni的问题。jni的代码位于org.pjsip.pjsua包中。该包里面的文件非常多。目前我们先关心两个,一个是pjsuaJNI.java,另一个是pjsua.java,分别对应两个类。 ua是User Agent的简称,也就是客户端代理,用于处理打开会话,维护,收发等。pjsuaJNI里面的函数都有native关键字,这些函数是直接调用so库中用c写的函数的。从这里往上是java代码,是我们要关注的;往下是c代码,也就是pjsip的内容,暂时不管。pusua对pjsuaJNI作了一个轻度封装:基本上是直接调用。这样就对上层屏蔽了本地调用的代码。
2. sip协议接口
上面说到pjsua。该类可以理解为java层sip协议的接口。我们要用sip协议的哪个功能,最终都要调用该类的方法。与打电话相关的函数名为call_make_call,具体参数暂不作分析。另外还有call_setting_default函数等进行一些设置。
3. sip服务
sip协议接口中的函数都是基本函数,功能单一,不方便使用,因此作进一步分装。该封装位于包com.csipsimple.pjsip中。最主要的类为PjSipService。与打电话对应的函数是makeCall,它在打电话之前作了一些设置。PjSipService可以认为是高层次的API。目前来看,进行二次开发基本上调用这一层的代码就可以了。
4. android框架
以上其实都没有涉及到android的部分。为了维护一些状态等,也为了方便使用,CSipSimple把sip服务封装成了android中的标准service。所有的csipsimple的服务接口都定义在com.csipsimple.api中,与sip服务相关的定义是ISipService.aidl,其中关于打电话的函数是makeCallWithOptions。服务接口定义在aidl文件中,看来是为了方便进程间通信,不过这是后话,先不管。
当然,eclipse会把aidl编译为java文件,在gen文件中,包名仍为com.csipsimple.api,文件名为ISipService.java。打开文件,毫无疑问会有一个makeCallWithOptions函数。
接口的实现在com.csipsimple.service包中的SipService类。
// Implement public interface for the service
private final ISipService.Stub binder = new ISipService.Stub() {
/**
* {@inheritDoc}
*/
@Override
public void sipStart() throws RemoteException {
SipService.this.enforceCallingOrSelfPermission(SipManager.PERMISSION_USE_SIP, null);
Log.d(THIS_FILE, "Start required from third party app/serv");
getExecutor().execute(new StartRunnable());
}
... ...
}
上述服务肯定是要在android的服务管理器中注册的。
5. 使用服务
既然是标准的android服务,那么使用起来也是很简单的。使用服务的基本方法可以参考com.csipsimple.ui.dialpad.DialerFragment.java。先调用ServiceConnection.onServiceConnected()获得IBinder对象,再用ISipService.Stub.asInterface((IBinder)service)转为ISipService对象,这样就可以调用它的函数了。
流程简图
综合上述分析,可以得出如下简要流程图。
  
CSipSimple结构浅析的更多相关文章
- maven项目eclipse目录结构浅析
		
maven项目eclipse目录结构浅析 PS:Java Resources是为了方便我们编译,到最后都会编译到 WEB-INF/classes Maven项目的目录结构
 - 学习 opencv---(1)  opencv3.1.0 组件结构浅析
		
本系列是根据 浅墨大神 的opencv系列而写的,,应该大部分内容会一样..如有侵权还请告知........... 开发环境:win7 + VS2013 + opencv3.1.0 至于OpenCV组 ...
 - [linux-内核][转]内核日志及printk结构浅析
		
这段时间复习了一下内核调试系统,注意看了一下printk的实现以及内核日志的相关知识,这里做一下总结. 1.问题的引出: 做DPDK项目时,调试rte_kni.ko时,发现printk并不会向我们想想 ...
 - android的四层体系结构,基于mvc三层结构浅析
		
从多方面理解Android体系结构 1.以分层的方式来看Android 安卓体系结构分为四层. 首先看一下官方关于Android体系结构的图: 1).Linux Kernel:负责硬件的驱动程序.网络 ...
 - Android Studio目录结构浅析
		
让我们来简单了解下Android Studio中不同目录(文件)的位置和用途.首先看下一个App的最简单的目录结构 OK,我们这么看,第一,把这么多文件先分成这么三块1. 编译系统(Gradle)2. ...
 - javaWeb应用部署结构浅析
		
要成功部署一个Web应用,则必须遵循以下标准(参考)目录结构. 2.目录说明 1)WEB-INF目录:必须直接放在Web应用上下文之下(即一级目录). 2)class目录:必须直接放在WEB-INF目 ...
 - 内核日志及printk结构浅析
		
作者:tekkamanninja 鸣谢:感谢ChinaUnix技术社区的tekkamanninja提供稿件 ,如需转载,请注明出处. 这段时间复习了一下内核调试系统,注意看了一下printk的实现 ...
 - rowid结构浅析
		
select rowid from dual AAAAB0AABAAAAOhAAA rowid结构如下: 对象号 文件号 块号 行号 XXXXXX XXX XXXXXX X ...
 - discuz X论坛技术架构 MVC结构浅析
		
摘自:http://yeyuan.iteye.com/blog/930727 PS:本人刚接触discuz论坛,php水平有限,当中的理解,如有不正确之处,欢迎指出 ----------------- ...
 
随机推荐
- JQuery基础一
			
1.在浏览器点击F12,调出源码设置端点F11进行调试 2.要操作DOM对象,首先要把DOM对象封装成juery对象: jQuery(document).ready(function () { ale ...
 - 五、Standard Controllers
			
1.standardController:标准的controller 是同页面的standard Object的界面button的功能和逻辑是一样的<apex:page standardCont ...
 - linux Nginx VirtualHost虚拟主机多站点设置
			
linux系统CentOS7 Nginx1.9.9 一台nginx服务器同一IP被注册多个不同域名,访问不同域名到该服务器后请求不同项目 本台nginx服务器的IP地址为 192.168.155.12 ...
 - 利用ksoap调用webservice
			
博文参考: http://www.cnblogs.com/shenliang123/archive/2012/07/05/2578586.html http://blog.csdn.net/jimbo ...
 - Shell基本功能&配置&Oh-My-Zsh
			
http://blog.csdn.net/yangcs2009/article/details/45720193
 - RedHat3.4安装GIT
			
1.首先到官网上下载git包,地址为http://git-scm.com/download 注意:选择下载Older releases 2.输入命令tar zxvf git-1.7.9.4.tat.g ...
 - Vim入门教程
			
尽管网上有成打的Vim在线教程,但是要么艰深晦涩,要么太过肤浅.本教程的目标让每个阶段都有斩获,从理解它的哲学(将和你终身相伴)到超越现在编辑技巧,成为其中的牛人. 简单来说,本教程的学习方式将使你终 ...
 - POM.xml 标签详解
			
pom作为项目对象模型.通过xml表示maven项目,使用pom.xml来实现.主要描述了项目:包括配置文件:开发者需要遵循的规则,缺陷管理系统,组织和licenses,项目的url,项目的依赖性,以 ...
 - Android studio环境搭建
			
首先要下载jdk,下载好以后配置环境变量,这里略过,不会的可以百度搜索,这里附上jdk下载地址:http://pan.baidu.com/s/1Xrmqy 下载Android studio 软件,下载 ...
 - C++ do{...}while(0)的好处
			
在开源软件里面经常可以看到这样的写法. #define X(a) do { f1(a); f2(a); } while(0) 1. 主要作用是放在宏定义里面,避免宏带来的语法问题. 比如 #defin ...