您好,欢迎来电子发烧友网! ,新用户?[免费注册]

您的位置:电子发烧友网>电子百科>通信技术>数据通信>

基于Android的VoIP系统设计

2011年04月29日 11:39 现代电子技术 作者:贺丹丹,施 展 用户评论(0

  本文提出一种基于PJSIP协议栈的解决方案,通过Android本地开发工具(NDK),实现一个高效、稳定且功能强大的VoIP系统,具有较高的参考和实用价值。

  1 VoIP设计方案

  1.1 设计目标

  本方案所设计的系统包含以下功能:首先,完成用户终端(如手机)中语音数据的采集与编码,并通过RTP(实时传输协议)/RTCP(RTP传输控制协议)进行传输和控制;其次,完成会话的控制,包括会话的注册、发起、维护与结束、注销等;再次,作为一个应用程序,必须实现一个良好的界面,与用户交互;最后,作为一个开放系统,需具有良好的可扩展性。

  1.2 总体设计

  本方案基本上符合Android的NDK框架的开发规范,将系统分为4层,如图1所示。最上层为应用层,该层将在Android SDK的框架内,采用Java语言来实现;第二层为JNI层,SIP协议栈有很多种实现,其中,采用C语言的SIP协议栈在效率、速度、系统占用方面有着超越其他库(如Java协议栈)的优势,因此,该方案将在第三层采用纯C语言实现的PJSIP协议栈。为了让Java应用层能调用协议栈层,在两层之间需要一个衔接的桥梁,这就是JNI层。最后一层是驱动层,这部分一般是由手机厂商来实现的,本文将不做重点介绍。

  

 

  2 VoIP的具体实现

  这里将实现一个完整的VoIP系统,包括协议栈的实现、JNI的编写以及上层UI的设计实现等。

  2.1 SIP协议栈及UA

  SIP协议栈直接关系到整个系统的质量与效率,本文将采用纯C语言开发的PJSIP库。该库采用C语言开发,且源码开放,在兼容性与效率上有明显优势,不仅体积小(完整的SIP封装也不过150 KB),同时还实现了一个内存池,使得安全系数与运行效率大为提高,该系统所采用的就是优化后的PJSIP库。

  2.1.1 PJSIP协议栈

  PJSIP协议栈遵循标准的SIP协议,采用分层架构:SIP/SDP消息编码解析层、传输管理层、SIP终端、事务层、会话层以及应用层等。由于SIP协议采用文本消息发送请求和响应,所以首先需要将SIP消息按照巴斯克范式(ABNF)编码和解析,这就是SIP/SDP消息编码解析层所完成的功能。传输管理层用来管理用户代理与服务器之间的请求和相应;SIP终端是PJSIP中转机制的实现,它主要负责管理各个SIP组建,例如像SIP终端实例注册组件,分发消息到事务层、会话层及应用层,回传处理结果,管理定时器、I/O队列等;事务层通过状态机机制管理SIP信令,每一次状态机状态的改变都将触发回调函数;会话层负责会话的发起与响应,一般与应用层结合在一起,用于用户交互,不同的平台有不同的实现,本文使用Andriod的GUI来实现。

  PJSIP是一个高度封装的库,实际上它是通过PJSUA子库来实现应用的。一个完整的PJSUA生命周期,首先需要初始化,通过函数init()来实现。在这个函数中,将创建代理、初始化变量和堆栈,以及创建一个UDP传输并在最后启动代理;第二步将为UA添加用户,如果需要的话,还要向服务器注册用户;当用户添加成功后,此时可以建立一个呼叫连接,发起会话;当会话连接成功后,就可以使用SRTP协议实时传输加密后的数据,进行通话。最后的过程是挂起或销毁呼叫。

  2.1.2 UA原理

  UA(User Agency)是协议栈的具体实现,PJSIP通过封装了的PJSUA来实现,在这一点上,大部分的SIP库都大同小异,在此将介绍UA的工作原理

  一个典型的UA包含UAC(User Agency Client)和UAS(User Agency Server)两部分。会话由UAC发起。当呼叫发起时,UAC将首先发送“IN-VITE”消息给SIP代理服务器,服务器收到“INVITE”消息后将返回一个应答“200 OK”,并回答“ACK”进行确认,同时通知主叫用户(即会话发起用户)上线通话。如果主叫端(用户端)主动结束会话,UAC将返回“BYE”消息,同时通知服务器;如果用户端收到服务器传来的“BY-E”消息,回答“200”,并结束会话。

  服务器端,UAS收到UAC(用户端)发来的“INVITE”消息,首先从消息中提取出主、被叫对象,然后检查当前是否有空闲信道,若没有则返回“486 BUSY HERE”(即系统忙)消息;接着将检查被叫用户是否在服务区,如果被叫对象不在服务范围,则返回“404 NOT FOUND”(即用户不在服务区);若被叫用户成功上线,则返回“200 OK”,同时准备开始会话。

  SIP协议栈一般使用SIP统一资源定位符(URL)来标识,它根据URL来寻址,如集群用户“200”,“300”分别对应SIP用户为“200@192.168. 1.100”,“300@192.168.1.100”。本文中也使用这种方式来测试通信

  2.2 JNI的实现

  PJSIP库和Java类连接是通过JNI来实现的,这也是Android NDK的实现机制,JNI是SUN公司推出的用于Java调用其他语言的接口

  首先需要一个中间类,这个类中主要建立一些方法用于调用C/C++本地函数。它们的类型均为“publicstatic native int”,以便其他的Java类能够调用。

  

非常好我支持^.^

(1) 100%

不好我反对

(0) 0%

( 发表人:Spring )

      发表评论

      用户评论
      评价:好评中评差评

      发表评论,获取积分! 请遵守相关规定!