应用办公生活信息教育商业
投稿投诉
商业财经
汽车智能
教育国际
房产环球
信息数码
热点科技
生活手机
晨报新闻
办公软件
科学动态
应用生物
体育时事

基于PJSIP协议栈和Android的VoIP系统设计方案介

  本文提出一种基于PJSIP协议栈的解决方案,通过Android本地开发工具(NDK),实现一个高效、稳定且功能强大的VoIP系统,具有较高的参考和实用价值。
  1VoIP设计方案
  1。1设计目标
  本方案所设计的系统包含以下功能:首先,完成用户终端(如手机)中语音数据的采集与编码,并通过RTP(实时传输协议)RTCP(RTP传输控制协议)进行传输和控制;其次,完成会话的控制,包括会话的注册、发起、维护与结束、注销等;再次,作为一个应用程序,必须实现一个良好的界面,与用户交互;最后,作为一个开放系统,需具有良好的可扩展性。
  1。2总体设计
  本方案基本上符合Android的NDK框架的开发规范,将系统分为4层,如图1所示。最上层为应用层,该层将在AndroidSDK的框架内,采用Java语言来实现;第二层为JNI层,SIP协议栈有很多种实现,其中,采用C语言的SIP协议栈在效率、速度、系统占用方面有着超越其他库(如Java协议栈)的优势,因此,该方案将在第三层采用纯C语言实现的PJSIP协议栈。为了让Java应用层能调用协议栈层,在两层之间需要一个衔接的桥梁,这就是JNI层。最后一层是驱动层,这部分一般是由手机厂商来实现的,本文将不做重点介绍。
  2VoIP的具体实现
  这里将实现一个完整的VoIP系统,包括协议栈的实现、JNI的编写以及上层UI的设计实现等。
  2。1SIP协议栈及UA
  SIP协议栈直接关系到整个系统的质量与效率,本文将采用纯C语言开发的PJSIP库。该库采用C语言开发,且源码开放,在兼容性与效率上有明显优势,不仅体积小(完整的SIP封装也不过150KB),同时还实现了一个内存池,使得安全系数与运行效率大为提高,该系统所采用的就是优化后的PJSIP库。
  2。1。1PJSIP协议栈
  PJSIP协议栈遵循标准的SIP协议,采用分层架构:SIPSDP消息编码解析层、传输管理层、SIP终端、事务层、会话层以及应用层等。由于SIP协议采用文本消息发送请求和响应,所以首先需要将SIP消息按照巴斯克范式(ABNF)编码和解析,这就是SIPSDP消息编码解析层所完成的功能。传输管理层用来管理用户代理与服务器之间的请求和相应;SIP终端是PJSIP中转机制的实现,它主要负责管理各个SIP组建,例如像SIP终端实例注册组件,分发消息到事务层、会话层及应用层,回传处理结果,管理定时器、IO队列等;事务层通过状态机机制管理SIP信令,每一次状态机状态的改变都将触发回调函数;会话层负责会话的发起与响应,一般与应用层结合在一起,用于用户交互,不同的平台有不同的实现,本文使用Andriod的GUI来实现。
  PJSIP是一个高度封装的库,实际上它是通过PJSUA子库来实现应用的。一个完整的PJSUA生命周期,首先需要初始化,通过函数init()来实现。在这个函数中,将创建代理、初始化变量和堆栈,以及创建一个UDP传输并在最后启动代理;第二步将为UA添加用户,如果需要的话,还要向服务器注册用户;当用户添加成功后,此时可以建立一个呼叫连接,发起会话;当会话连接成功后,就可以使用SRTP协议实时传输加密后的数据,进行通话。最后的过程是挂起或销毁呼叫。
  2。1。2UA原理
  UA(UserAgency)是协议栈的具体实现,PJSIP通过封装了的PJSUA来实现,在这一点上,大部分的SIP库都大同小异,在此将介绍UA的工作原理。
  一个典型的UA包含UAC(UserAgencyClient)和UAS(UserAgencyServer)两部分。会话由UAC发起。当呼叫发起时,UAC将首先发送ldquo;INVITErdquo;消息给SIP代理服务器,服务器收到ldquo;INVITErdquo;消息后将返回一个应答ldquo;200OKrdquo;,并回答ldquo;ACKrdquo;进行确认,同时通知主叫用户(即会话发起用户)上线通话。如果主叫端(用户端)主动结束会话,UAC将返回ldquo;BYErdquo;消息,同时通知服务器;如果用户端收到服务器传来的ldquo;BYErdquo;消息,回答ldquo;200rdquo;,并结束会话。
  服务器端,UAS收到UAC(用户端)发来的ldquo;INVITErdquo;消息,首先从消息中提取出主、被叫对象,然后检查当前是否有空闲信道,若没有则返回ldquo;486BUSYHERErdquo;(即系统忙)消息;接着将检查被叫用户是否在服务区,如果被叫对象不在服务范围,则返回ldquo;404NOTFOUNDrdquo;(即用户不在服务区);若被叫用户成功上线,则返回ldquo;200OKrdquo;,同时准备开始会话。
  SIP协议栈一般使用SIP统一资源定位符(URL)来标识,它根据URL来寻址,如集群用户ldquo;200rdquo;,ldquo;300rdquo;分别对应SIP用户为ldquo;200192。168。1。100rdquo;,ldquo;300192。168。1。100rdquo;。本文中也使用这种方式来测试通信。
  2。2JNI的实现
  PJSIP库和Java类连接是通过JNI来实现的,这也是AndroidNDK的实现机制,JNI是SUN公司推出的用于Java调用其他语言的接口。
  首先需要一个中间类,这个类中主要建立一些方法用于调用CC本地函数。它们的类型均为ldquo;publicstaticnativeintrdquo;,以便其他的Java类能够调用。
  2。2。1新建PJSIP类
  为各个待实现的类新建一个包,可以命名为ldquo;com。android。voip。pjsiprdquo;,在该包中添加该系统相关的一些类,这些类分别为上节中原理各个步骤的实现。这部分仅仅是为C库的调用提供一个接口,因此具体的实现将放在本地CC程序中。
  2。2。2头文件的生成
  C库与Java间还需通过一个后缀为ldquo;。hrdquo;的头文件来衔接,这个头文件可以手动编写,也可以通过ldquo;Javahrdquo;来生成,该工具包含在JDK中,是由SUN公司提供的。
  Javah生产的头文件包含一定的规则,例如,本例中,它将生成的函数声明为ldquo;JavacomandroidIMSandroidpjsiprdquo;的形式,以便在调用C库时能正确识别。
  由于Java中的数据类型与CC不尽相同,因此还必须注意参数传递时参数类型的转换。本文所涉及到的Java数据类型有String和int型,Javah生成的头文件中会先定义好需要传递的参数类型以及函数返回类型,例如方法ldquo;addaccount(Stringsipuser,Stringsipdomain,Stringsippasswd)rdquo;,在头文件中将定义函数的形式为ldquo;JNIEXPORTjintJNICALLJavacomandroidIMSandroidpjsipaddlaccount(JNIEnv,jclass,jstring,jstring,jstring)rdquo;,其中JNIEXPORT为JNI外部函数声明,jint是ldquo;jni。hrdquo;中定义C语言中整形的对应类型,JNCALL是JNI关键字。比较特殊的是JNIEnv,它是一个指向类型为JNIEnv的一个特殊JNI数据结构的指针,它的每个元素都指向一个JNI函数的指针,jclass会根据引用Java类的不同而不同,本文中ldquo;pjsip。classrdquo;是静态类,因此这里的jclass指的是类本身,如果是非静态类则指的是对象。后面几个就是pjsip类需要传递的参数,根据ldquo;jni。hrdquo;的定义,String类型对应jstring,int对应jint。然而这只是函数申明与类中方法的形式对应,参数的具体传递还需要相应的转化,具体实现将在下一节详细介绍。
  2。2。3JNI接口函数的实现
  创建了pjsip库类和头文件之后,必须应用一个库接口函数,这部分是pjsip接口的实现,限于篇幅,本文只讲解几个重要函数的实现。
  (1)init函数
  首先是init函数,对应的接口函数为JNICALLJavacomandroidIMSandroidpjsipinit。该函数在系统初始化时调用,其作用是配置相关参数,并发起一个pjsua应用。它先通过函数ldquo;pjsuacreate()rdquo;创建一个ldquo;pjsuardquo;应用,然后通过三个函数ldquo;pjsuaconfigdefault
  (amp;cfg)rdquo;,ldquo;pjsualoggingconfigdefault(amp;logcfgrdquo;),ldquo;pjsuamediaconfigdefault(amp;mediacfg)rdquo;配置其相关参数,其中cfg是pjsua的相关参数,主要是状态改变时的回调函数;logcfg用来配置log级别;mediacfg中包含时钟频率、声道数目等相关参数。
  完成配置之后就可以使用pjsuainit(amp;cfg,amp;logcfg,amp;mediacfg)将先前配置的参数初始化。在初始化之后,还需为pjsua添加一个udp传输,这一步是通过pjsuatransportcreate(PJSIPTRANSPORTUDP,amp;cfg,NULL)来实现的,cfg中包含指定的通讯端口,3GPP建议使用5060。
  需要注意的是,配置完以上参数之后,还需指定SPEEX编码优先级,一般将其设为最大,可以通过函数pisuacodecsetpriority(amp;speexcodecid,255)来实现。所有配置完成之后,就可以发起pjsua,即最后调用pjsuastart()。成功的话,本函数的返回类型为PJSUCCESS。
  (2)makecall函数
  另一个很重要的函数是makecall,其在本接口文件中对应的函数为JavacomandroidIMSandroidpjsipmakelcall,这个函数一般在发起会话时调用,它与上一个函数在结构上最大的不同在于本函数需要传递一个字符串参数,前面提到,Java与CC在参数结构上并不完全相同,因此这里需要将Java传递过来的String类型的参数转化,可以通过ldquo;urlptr(char)envgt;GetStringUTFChars(url,amp;iscopy)rdquo;来实现。envgt;GetStringUTFChars在ldquo;jni。hrdquo;中定义,其功能是将jsting类型(Java)的url复制到char类型(C)的urlptr中,以此来完成参数类型的转换。
  为了保证传递地址的有效性,还需要使用pjsuaverifysipurl(urlptr)验证,这个函数主要验证urlptr是符合SIP的规则,即是否是一个合法的SIP地址。然而char型的地址pjsua中还是不能直接使用的,这是因为pjsua重新封装了参数类型,所以最后还需要将其转化成pjstrt类型,pjlib提供pjstr()函数可以完成转化。在完成了参数的转化后,调用ldquo;pjsuacallmakecall()rdquo;,将发起会话。
  (3)hangup函数和pjsuadestroy函数
  这两个函数用来销毁和挂断会话,一般在需结束的时候调用,它们在接口函数中对应Javacomandroid
  IMSandroidpjsiphangup和JavacomandroidIMSandroidpjsipdestroy,由于没有参数传递,也没有其他的调用,因此这两个函数非常简单,基本上直接调用pjsua提供的pjsuacallhangupall()和pjsuadestroy()就能实现。pisua中这两个函数将完成内存释放、账户注销等工作。
  (4)addaccount函数
  该函数在基本的pjsua中并不是必须的,但如果要使用SIP服务器的话,就必须实现该函数,它在接口函数中对应ldquo;JavacomandroidIMSandroidpjsipadd1accountrdquo;,同ldquo;makecallrdquo;一样,也需要传递参数,不同的是,它传递三个参数,只是原理大体一样。
  首先它将参数转化后保持到cfg,通过ldquo;pjsuaaccadd(amp;cfg,PJTRUE,amp;aceid)rdquo;将参数添加到pjsua。pjsua将以其中的sip服务器为目的地址,注册会话发起申请,经过一系列的操作之后,与目的地址发起会话。
  2。2。4主程序与用户界面
  系统的主程序是一个标准的Android应用程序,它使用Java语言开发,符合SDK规范。与一般的SDK程序不同的是,该类中必须使用System。loadLibrary加载PJSIP库文件。形式如下:
  System。loadLibrary(ldquo;pjsipjnirdquo;);
  其中,pjsipjni就是上节中PJSIP协议栈生成的库。
  主程序中的基本方式均按照上节中的过程,创建并初始化PJSUA;当call按键被触发时发起会话,调用makecall()方法;当用户接受通话时,点击hang或cancel按键,触发hang()或采用destry()方法等。
  用户接口是通过AndroidSDK来实现的,这部分几乎全都是Java语言,由于UI不是本文的重点,因此只介绍一个简单的界面,实际应用中用户交互是非常重要的。为了实现所需的功能,至少需要一个文本框来提供SIP地址,以及两个按键来控制会话发起和结束。另外,在呼叫与通话过程中,还需要一个页面来显示,这里可以通过对话框来显示
  3封装与调试
  为了能在Android平台上方便地使用该系统,在实现了PJSIP协议栈、JNI接口以及UI之后,还需将上面所有的模块进行封装。AndroidSDK提供了一些很有用的工具,如aapt等,由于本文重点不在AndriodSDK,所以可以采用集成开发工具(如集成在Eclipse中的ADT)来封装。在工程libs(如果不存在则新建)目录下新建一个名为armeabi的目录,将上节生成的。so库文件放到该目录下。ADT在封装资源时会自动将该库文件封装到apk文件中,apk是Android操作系统中应用程序的封装形式,在所有android平台中均能使用。
  封装后安装到Android手机、MID或虚拟机中,并发起会话。与开源SIP软件Linphone通信的结果如图2所示。
  4结语
  通过测试表明,该系统能够对发起并很好地控制SIP信令,该系统由于采用SIP协议,因此与所有采用这一协议的软件均能通信,如Linphone,Kphone等,功能测试中表现良好,实现了VoIP的基本需求。同时如果要增加功能,可以在Java类中添加相应的方法并在应用层调用即可,具有一定的可扩展性。

诺基亚800C如何呼叫联系人诺基亚800C呼叫联系人方法:在ldquo;开始rdquo;屏幕上,选择gt;,然后依次选择联系人和电话号码。搜索联系人:在ldquo;开始rdquo;屏幕上……Win7系统下Excel文档乱码怎么办win7电脑excel文档乱码怎么才能修复呢?方法有很多种,我们可以手动修复,还可以借助软件来修复,一起来看看具体操作吧。Win7环境下Excel文档损坏修复策略如下:……科龙空调如何清洗科龙空调室外机清洁清洗步骤详解空调让我们在炎热的夏季感到阵阵清凉,让我们在炎热的三伏天依旧感到舒适自在,可见空调对我们的生活起着至关重要的作用。不过空调也需要定期清洗,否则就会出现工作异常现象,进而影响我们……天语W806支持1080p播放吗天语W806支持有声视频播放,但不支持1080P视频播放。天语W806搭载了一块4。3英寸的标准全触控屏幕,采用了LG生产的IPS材质屏幕,WVGA级别的分辨率48080……奔腾电饭锅维修点有哪些奔腾电饭锅常见故障维修明细当提问到家家户户都应该有的小家电会有哪些时,想必第一时间都会想起电饭煲。如今,几乎每家每户都已经使用电饭煲并且作为家中的长期ldquo;饭票rdquo;,而且自最初拥有电饭煲时……吸尘器什么样的好吸尘器选择方法详解现如今吸尘器的使用已经越来越普及了,这项产品给我们的生活带来了极大的便利,已然成为了众多家庭主妇做家务的好帮手。但市面上吸尘器的种类繁多,如何选择吸尘器自然成为了我们要解决的问……CAD如何输入尺寸标注沉孔深度锥度斜度符号我们在绘制机械图样标注尺寸时经常会遇到沉孔、深度、锥度、斜度等符号的输入。如图中的深度符号。要不要单独绘制出来,定义成块,再插入呢?其实根本不需要这样。Autocad,提……OPPOFindX3是全面屏吗屏幕尺寸多大今天小编为大家带来了OPPOFindX3渲染图,PPOFindX3Pro是曲面屏吗,一起来看看吧一、是全面屏吗OPPOFindX3Pro采用左上角挖孔曲面屏设计,拥……佳能l100传真机怎么样?佳能l100传真机(详细评测)传真机是一种通信设备,它在工作、生活中都占据着举足轻重的地位。但是很多朋友们在购买的时候会犹豫不决,因为不知道该如何抉择。众所周知,佳能是一个信誉良好的传真机品牌,所以下面小编……商用中央空调排行榜(最新)随着科技的不断发展,现在商用中央空调已然成为了被使用最为广泛的一个设备。它主要是应用于商用、工业和民用这几个领域。它主要是用来制冷和制热的设备。它的品牌也是比较的多的,下面介绍……三洋空调好不好三洋空调优点介绍图文详解随着人们生活水平的日益提高,空调已经成为普罗大众生活中不可缺少的家用电器。然而在如今市场上空调品种繁多的情况下,人们不禁眼花缭乱了,是不是会有不知道该选择哪款空调的烦恼呢?是不……笔记本打字母出数字怎么办笔记本打字母出数字解决方法在市面上的电子用品是越来越多了,比如说手机,不管国产的,还是其他国家产的,品牌就有好几十种了,更不用说笔记本电脑了,品牌也是一样的多。虽然这些是高科技的产物,但是有的时候还是会……
自动晾衣架品牌有哪些自动晾衣架品牌推荐详解我们生活里面少不了晾衣架,因为我们每天都要晾晒衣服,随着社会不断的发展,现在晾衣架也变得越来越先进了,自动晾衣架就是一款新型的产品,下面小编就来给大家介绍一下自动晾衣架有哪些品……恒维智能马桶怎么样恒维智能马桶介绍详解马桶是每个家庭都需要的产品。随着社会经济和科技的发展,如今的马桶已经发展到了智能化地步,很多人选择智能马桶。现在市场上出现的智能马桶品牌繁多,大家的选购就是一个问题了。关于这个……三星s308主要参数及报价介绍图文导语:三星是一个具有悠久的历史的电子企业,它的产品是非常多的,三星s308就是其中比较知名的一款。那么这款三星s308到底怎么样呢?它的市场价格怎么样呢?今天小编就来给大家简单……集成吊顶暖风机怎么样集成吊顶暖风机分析介绍详解暖风机,是我们一种适合在室内使用的散发热风来调节我们的室内温度,用来取暖的一种设备,给我们的生活带来了很大的帮助,而其中集成吊顶暖风机是我们的家庭中使用比较广泛的暖风机类型,今……如何取消手机屏幕上的热点资讯图片您可以点击屏幕左上角的【热点资讯】四个字的位置,随后会弹出一个设置界面,选择【完全关闭】;也可以在手机桌面空白处长按,打开桌面设置,找到【智能助手】并点击关闭。具体步骤如下:……word文档上标怎么弄在写论文的时候,有时候需要再在自己的文字末尾加一个上标,表示这段话不是自己叙述的,为自己提供证据,那么这个word文档上标怎么弄呢?一起来看一看吧!word文档上标怎么弄……如何避免让公共免费WiFi偷走信息避免让公共免费WiFi偷走如何避免让公共免费WiFi偷走信息?把wifi设为手动连接不少手机WiFi连接功能是自动扫描连接免费WiFi的。这里就给有毒wifi提供了便捷的途径,把免费wifi……rmp格式怎么打开rmp格式怎么打开rmp是报表格式,可以用delphi6或改后缀为。doc打开。Delphi是Borland公司研发的可视化开发工具,可在Windows3。x、Wi……笔记本电脑麦克风没声音怎么办笔记本电脑麦克风没声音怎么办笔记本麦克风没声音首先应该确认下对方耳麦是否正常,可以问问朋友是否可以听歌什么的,一般只要可以听歌就说明对方麦克风或者音箱是没有问题的,对方听……Excel怎么调节亮度?excel设置护眼色方法无论是在学校还是在工作中Excel表格是最为流行的办公软件,Excel表格不仅以提高使用者的工作效率还可以提升决策能力的效率;平时制作表格时,我们都会用到Excel表格,因为长……dnf传说装备怎么获得如今的DNF中传说装备虽然已经不是什么遥不可及的装备,但是还是有不少的小伙伴没有机会获取传说装备,那么dnf传说装备怎么获得呢?下面给大家带来的就是传说装备获取攻略,来看看吧!……乐视电视s50怎么样乐视电视s50性能参数评测图文随着社会的不断进步,几乎所有的电子产品都在不断的更新,不断的科技化,满足人们的需求,如手机,如电脑,如电视。仿佛都有一个共性,前三者的外在都在变薄,但是却完全不影响它们的智能化……
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网