最近做一个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结构浅析的更多相关文章

  1. maven项目eclipse目录结构浅析

    maven项目eclipse目录结构浅析 PS:Java Resources是为了方便我们编译,到最后都会编译到   WEB-INF/classes Maven项目的目录结构

  2. 学习 opencv---(1) opencv3.1.0 组件结构浅析

    本系列是根据 浅墨大神 的opencv系列而写的,,应该大部分内容会一样..如有侵权还请告知........... 开发环境:win7 + VS2013 + opencv3.1.0 至于OpenCV组 ...

  3. [linux-内核][转]内核日志及printk结构浅析

    这段时间复习了一下内核调试系统,注意看了一下printk的实现以及内核日志的相关知识,这里做一下总结. 1.问题的引出: 做DPDK项目时,调试rte_kni.ko时,发现printk并不会向我们想想 ...

  4. android的四层体系结构,基于mvc三层结构浅析

    从多方面理解Android体系结构 1.以分层的方式来看Android 安卓体系结构分为四层. 首先看一下官方关于Android体系结构的图: 1).Linux Kernel:负责硬件的驱动程序.网络 ...

  5. Android Studio目录结构浅析

    让我们来简单了解下Android Studio中不同目录(文件)的位置和用途.首先看下一个App的最简单的目录结构 OK,我们这么看,第一,把这么多文件先分成这么三块1. 编译系统(Gradle)2. ...

  6. javaWeb应用部署结构浅析

    要成功部署一个Web应用,则必须遵循以下标准(参考)目录结构. 2.目录说明 1)WEB-INF目录:必须直接放在Web应用上下文之下(即一级目录). 2)class目录:必须直接放在WEB-INF目 ...

  7. 内核日志及printk结构浅析

      作者:tekkamanninja 鸣谢:感谢ChinaUnix技术社区的tekkamanninja提供稿件 ,如需转载,请注明出处. 这段时间复习了一下内核调试系统,注意看了一下printk的实现 ...

  8. rowid结构浅析

    select rowid from dual AAAAB0AABAAAAOhAAA rowid结构如下: 对象号    文件号   块号   行号 XXXXXX    XXX     XXXXXX X ...

  9. discuz X论坛技术架构 MVC结构浅析

    摘自:http://yeyuan.iteye.com/blog/930727 PS:本人刚接触discuz论坛,php水平有限,当中的理解,如有不正确之处,欢迎指出 ----------------- ...

随机推荐

  1. Qt之qt4.7 和qt 4.8.4 交叉实践

    开发机环境搭建: 测试环境:CentOs7.1  Ubuntu 12.0.4 操作流程: 一.编译Qt4.7.0 1)CentOS上实践 1.tar xzvf qt-everywhere-openso ...

  2. PythonPP+lambda:示例

    直接上代码. python PP 下载, 可以到官网下载 Python PP 下载 lambda 能做的, 基本上普通函数都可以做到. lambda 的主要作用是简化表达式, 并且似乎尤其适合于表达科 ...

  3. Dynamics AX 2012 R2 安装 AIF IIS上的Web服务

    1.为什么使用IIS上的WEB服务 组件? 如果你要在Dynamics AX Service中使用HTTP Adapter,那么你就要安装IIS上的WEB服务 组件.HTTP Adapter会在IIS ...

  4. IOS调试lldb命令常用,po,

    lldb命令常用(备忘) 假如你准备在模拟器里面运行这个,你可以在"(lldb)"提示的后面输入下面的: (lldb) po $eax LLDB在xcode4.3或者之后的版本里面 ...

  5. Linux phpwind论坛的安装

    1:新建文件夹phpwind

  6. maven+Jenkins学习小记

    jenkins配置方法1,tomcat下载,解压,切换到bin目录,配置环境变量,地址为catalina.bat文件夹下,也就是bin目录,再配置path变量2,启动tomcat,dos命令,cata ...

  7. R语言基础:数组&列表&向量&矩阵&因子&数据框

    R语言基础:数组和列表 数组(array) 一维数据是向量,二维数据是矩阵,数组是向量和矩阵的直接推广,是由三维或三维以上的数据构成的. 数组函数是array(),语法是:array(dadta, d ...

  8. [问题2014S09] 复旦高等代数II(13级)每周一题(第九教学周)

    [问题2014S09]  证明: \(n\) 阶方阵 \(A\) 与所有的 \(A^m\,(m\geq 1)\) 都相似的充分必要条件是 \(A\) 的 Jordan 标准型为 \[\mathrm{d ...

  9. faster alter table add column

    Create a new table (using the structure of the current table) with the new column(s) included. execu ...

  10. javascript实现图片滚动

    闲来无事捣鼓了一个原来的js图片滚动 首先看看 静态页的结构: <body> <a href="javascript: le()">向左</a> ...