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水平有限,当中的理解,如有不正确之处,欢迎指出 ----------------- ...
随机推荐
- 关于华擎X99+5820K
受到之前Intel I7-5775C的困扰,于是直接整套平台换掉. 把Z97+I7-5775C+DDR3换成了X99+5820K+DDR4. 但是依然不理想,又是另外一个坑. 组装好后安装系统的过程 ...
- python核心编程学习记录之模块
- win7下JDK环境变量设置方法
来源于:http://jingyan.baidu.com/article/e9fb46e1b2b3347521f766c1.html
- 微信OAuth2.0网页受权php
www.MyException.Cn 网友分享于:2014-01-19 浏览:2504次 微信OAuth2.0网页授权php示例 1.配置授权回调页面域名,如 www.aaa.com 2.模拟公众号的 ...
- Linux+I2C总线分析(主要是probe的方式)
Linux I2C 总线浅析 ㈠ Overview Linux的I2C体系结构分为3个组成部分: ·I2C核心: I2C核心提供了I2C总线驱动和设备驱动的注册.注销方法,I2C通信方法(即“algo ...
- cf 700 B Connecting Universities
题意:现在给以一棵$n$个结点的树,并给你$2k$个结点,现在要求你把这些节点互相配对,使得互相配对的节点之间的距离(路径上经过边的数目)之和最大.数据范围$1 \leq n \leq 200000, ...
- Uva 10537 过路费
题目链接:http://vjudge.net/contest/143062#problem/C 题意: 给定一个无向图,大写字母是城市,小写字母是村庄,经过城市交过路费为当前货物的%5,路过村庄固定交 ...
- hasOwnProperty
var Person = function(){ this.name = "nike"; this.age = "20" } var person = new ...
- mysql5.6中 order by 多个字段排序问题
今天用order by排序 后面跟了多个字段,如sql语句: SELECT a.id,a.loginname,a.address,u.id,u.`name`,u.address FROM admin_ ...
- 解决lScrollView嵌套ListView只显示一行的问题,listvie显示全部的item
ScrollView嵌套ListView只显示一行的问题 1.思路:给listview重新添加一个高度. listview的高度==listview.item的高度之和. 2.注意:关键是添加list ...