怎样打开VOIP与SIP

kuaidi.ping-jia.net  作者:佚名   更新日期:2024-07-02
什么是VOIP和SIP?

1、VOIP:是一种语音通话技术,经由网际协议(IP)来达成语音通话与多媒体会议,也就是经由互联网来进行通信。VoIP可用于包括VoIP电话、智能手机、个人计算机在内的诸多互联网接入设备,通过蜂窝网络、Wi-Fi进行通话及发送短信。
2、SIP:是一个应用层的信令控制协议。用于和一个或多个参与者创建、修改和终止会话。SIP的结构与HTTP(客户-服务器协议)相似。客户机发出请求,并发送给服务器,服务器处理这些请求后给客户机发送一个响应,该请求与响应形成一次事务。

扩展资料:其他协议
1、MGCP(媒体网关控制协议)
媒体网关控制协议(MGCP)定义了呼叫控制单元(呼叫代理或媒体网关)与电话网关之间的通信服务。MGCP属于控制协议,允许中心控制台监测IP电话和网关事件,并通知它们发送内容至指定地址。在MGCP结构中,智能呼叫控制置于网关外部并由呼叫控制单元(呼叫代理)来处理。同时呼叫控制单元互相保持同步,发送一致的命令给网关。
2、MEGACO(媒体网关控制协议)
媒体网关控制协议(MEGACO)是IETF和ITU-T(ITU-TH.248建议)共同努力的结果。Megaco/H.248是一种用于控制物理上分开的多媒体网关的协议单元的协议,从而可以从媒体转化中分离呼叫控制。Megaco/H.248通知媒体网关将来自于数据包或单元数据网络之外的数据流连接到数据包或单元数据流上,如实时传输协议(RTP)。
参考资料来源:百度百科-voip
参考资料来源:百度百科-SIP (会话发起协议)

1. 购买一台服务器;
2.托管到专业的IDC机房;
3. 安装网络电话平台(如果你有足够的时间,并且自己会编写程序,可以到网上下载开源的软件,稍作修改即可使用。比如目前来说,最热门的 asterisk 就是免费的开源的程序,能够满足你使用sip 协议的voip电话的功能);
4.开始使用。

打开SIP功能的方法,适用于JB2,JB3,JB5:
请在alps\mediatek\config\product_nam\ProjectConfig.mk中,将MTK_SIP_SUPPORT置为yes即可

打开SIP功能的方法,适用于JB2之前的版本:
1. 在文件alps\mediatek\config\product_name\android.software.sip.voip.xml中添加如下代码
<permissions>
<feature name="android.software.sip" />
<feature name="android.software.sip.voip" />
</permissions>
2. 在文件alps\mediatek\config\product_name\android.software.sip.xml
<permissions>
<feature name="android.software.sip" />
</permissions>

允许SIP使用GPRS,仅针对GB, GB2,GB3:
在文件alps\frameworks\base\core\res\res\values\Config.xml中将
<bool name="config_sip_wifi_only">true</bool>
修改为
<bool name="config_sip_wifi_only">false</bool>

注:JB2,JB3,JB5版本中SIP call功能与OP02互斥,不可以同时开启。
原因是由于运营商的某些原因不允许开启Sip功能。
如希望同时使用,可以修改mk去除互斥条件:
/alps/mediatek/build/addon/core/android_dep_rule.mak中去掉以下内容
############################################################
ifneq ($(filter OP02%, $(OPTR_SPEC_SEG_DEF)),)
ifeq ($(strip $(MTK_SIP_SUPPORT)),yes)
$(call dep-err-common, Please do not set OPTR_SPEC_SEG_DEF as OP02* or set MTK_SIP_SUPPORT as no)
endif
endif

1、VOIP基于SIP协议,SDK2.3包含一个SIP协议栈和框架API
2、VOIP位于android.net.sip包中,最重要的为SipManager类,可开发基于SIP的VOIP应用。使用时要包含android.permission.INTERNET和android.permission.USE_SIP权限
3、如果在market中显示仅支持VOIP API幸好的手机的话,发布时需要在androidManifest.xml中加入<uses_feature android:name = "android.software.sip" android:required = "true">和<uses_feature android:name = "android.software.sip.voip">
4、要支持SIP API
(1)仅Android2.3或更高版本平台支持
(2)不是所有设备都提供SIP支持,确保你的APP只安装在支持SIP的装置上
5、根据GOOGLE官方DEMO项目来扩展的概念

二、类及方法描述
1、一个基本的VOIP项目至少需要三个类SIPSettings(对SIP的基本设置身份验证)、WalkieTalkieActivity(登录到SIP设备供应商,注册device去处理来电,拨打电话,在通话过程中用户界面管理)、IncomingCallReceiver(监听传入的SIP电话,然后传递这些SIP电话给WalkieTalkieActivity控制)
2、
WalkieTalkieActivity
A、SipManager.newInstance()-->此方法中首先判断context是否支持SIP API,若支持则new SipManager。SipManager构造函数中,实例化了一个ISIPService(运用的公式:
IBinder b =ServiceManager.getService(Context.SIP_SERVICE); //获取系统相应的服务
ISipService service = ISipService.Stub.asInterface(bIBinder);)
上面这两句代码其实是使用了AIDL,就以SipService为例,步骤如下
Service端
1、编写aidl文件:ISipService.aidl,并定义使用的接口(就等同于interface一样)
2、使用makefile生成与之同名的JAVA文件,SipService.java,此类继承extends ISipService.Stub并实现接口定义的方法或者在SipService extends Service,并代码中加入
ISipService.stub sipImpl = new ISipService.stub(){
//实现其接口方法,在SipService.java中是实现了一个名为start()的方法,里面有句是ServiceManager.addService("sip",newSipService(context));表示SipService已经交给ServiceManager统一管理了
}

Client端
一(以SIPService为例)
1、而在需要用到SipService时,也就是我们构造SipManager的时候,就通过ServiceManager.getService(Context.SIP_SERVICE)获得SIP的服务(类型为IBinder)
2、并调用 ISipService.Stub.asInterface(IBinder);去获取一个SipService实例(前提是该Service一定是通过ServiceManager.addService的方式添加进去管理的,这样才能找到此Service)

二(以普通Activity为例)
1、利用Intent intent = new Intent(Activity.this,SipService.class);-->bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE);来绑定SERVICE,在serviceConnection的onServiceConnected方法中,使用IService.stub.asIntentface(IBinder);来获取实例

B、SipManager创建好后,先从SharedPreference中获取username,domain及pwd,如果第一次进来没有设置这些的话则需要先创建账户,这里用EditTextPreference来保存用户信息,好处是当填写信息并返回后,EditTextPreference会自动将值放入SharedPreference中。我们假设username="woody";domain="192.168.12.30";pwd="910913"

C、这时,我们的SipManager以及用户信息已经设定好了,接下来使用了这句SipProfile.Builder builder = new
SipProfile.Builder(username, domain);我们去看看SipProfile.Builder中做了些什么:
SipURI mUri =mAddressFactory.createSipURI(username,serverDomain);
SipProfile mProfile.mDomain=serverDomain; //设置domain
(在mAddressFactory.createSipURl方法中,我选取了一些核心代码)
StringBuffer uriString=new StringBuffer("sip:");
uriString.append(user);
uriString.append("@");
//if host is an IPv6 string we should enclose it in sq brackets
if(host.indexOf(':') !=host.lastIndexOf(':')&&host.trim().charAt(0) !='[')
host='['+host+']';
uriString.append(host);
StringMsgParser smp=new StringMsgParser();

SipUrl sipUri=smp.parseSIPUrl(uriString.toString());
return sipUri;
从以上代码可以看出其实就是在Format SipURL罢了,里面多加了个if host为IPV6的判断(IPv4为为32位,十进制;IPv6为128位,16进制)。urlString最后为"sip:woody@192.168.12.30",smp.parseSIPUrl()方法中,有关于是如何parse的就不做阐述了,总之最后返回了一个SipUri

D、接下来就是SipProfile sipProfile = SipProfile.Builder.build(); //返回一个SipProfile object
在SipProfile.Builder.build()中,设置了sipProfile的pwd值,删除了之前SipUrl对象里的
password(mUri.setUserPassword(null);)、将sipProfile的address属性设置为AddressImpl类型的对象值、调用AddressFactory.createURI返回一个SipUri,并sipProfile.mProxyAddress=sipUri.getHost();

E、创建PendingIntent对象:(Intent与PendingIntent区别在于Intent是及时启动,而PendingIntent是不立刻反应,在特定的情况或通知下才启动,适用于AlertClock等)
Intent i = new Intent();
i.setAction("android.SipDemo.INCOMING_CALL");
PendingIntent pi = PendingIntent.getBroadcast(this, 0, i, Intent.FILL_IN_DATA);

F、
SipManager.open(sipProfile,PendingIntent,null); //(实际是SIPService在做操作)设置localSIPProfile的callingID-->建立SIP连接(算是注册至SIP Server)-->打开receiveCall
其中建立SIP连接,最后能追溯到是在SipSessionGroup.java的reset()方法中通过是注册服务器实现的,
注册服务器的步骤为:
(1)设置服务器的属性,例如服务器的地址(IP_ADDRESS_PROP)、栈名(javax.sip.STACK_NAME)、发出去的路径(localProfile中的javax.sip.OUTBOUND_PROXY)、线程池的大小(gov.nist.javax.sip.THREAD_POOL_SIZE)等,并且将这些属性加载到服务器中.
(2)通过SipFactory的静态方法取得一个实例,然后通过SipFactory实例sipfactory
(3)创建一个SipStack实例sipstack(这一步获得IP_ADDRESS_PROP,String address = Properties.getProperty("javax.sip.IP_ADDRESS");)
(4)用sipstack创建一个SipProvider实例sipProvider
(5)注册SipListener

G、A~F步骤都是在做准备工作,大致的步骤如下:new SIPService-->new SIPManager-->设定用户信息-->new SIPURI-->new SIPProfile-->new PendingIntent-->set sipProfile callingID-->(if profile.getAutoRegistation)open toReceiveCalls-->register SipService
现在是call someone~呼叫的工作是SipAudioCall类来完成(可用sipManager.makeAudioCall或takeAudioCall来实例化,SipAudioCall.startAudio时需要 RECORD_AUDIO, ACCESS_WIFI_STATE, and WAKE_LOCK permissions,
化,SipAudioCall.startAudio时需要 RECORD_AUDIO, ACCESS_WIFI_STATE, and WAKE_LOCK permissions,setSpeakerMode() 时需要MODIFY_AUDIO_SETTINGS permission)
【1】当需要呼叫时,使用sipManager.makeAudioCall(String localProfileURI, String peerProfileURI, SipAudioCall.listener,int timeout);来创建一个SipAudioCall,其中timeout以seconds为单位,过了timeout表示打电话超时。需要打给别人时使用makeAudioCall创建,接听电话用takeAudioCall来创建sipAudioCall
【2】SipAudioCall中有一个嵌套的class:SipAudioCall.Listener(此类主要用于监听SIP CALL,when[呼叫电话 or 接听电话])

SipAudioCall.Listener listener = new SipAudioCall.Listener() {
@Override
public void onCallEstablished(SipAudioCall call) { //呼叫建立
call.startAudio(); //启动音频
call.setSpeakerMode(true); //调整为可讲话模式
call.toggleMute(); //触发无声
updateStatus(call);
}

};
SipAudioCall call = manager.makeAudioCall(me.getUriString(), sipAddress, listener, 30);
(以上例子为makeAudioCall)
【3】我们看看makeAudioCall()方法(makeAudioCall requires 2 sipProfile):
SipAudioCall call =new SipAudioCall(mContext, localProfile);
call.setListener(listener); //这两句很简单就是创建一个local的sipAudioCall

SipSession s = createSipSession(localProfile, null); -->mSipService.createSession(localProfile, null);// sipService来创建session,并保存在SipSessionGroupExt中
call.makeCall(peerProfile,s,null); //这句就是呼叫,最后追溯到实际是SipSession.makecall
总结:在发起通话中
首先是创建SipAudioCall.listener,以便监听对话建立和对话结束,然后做相应的操作
然后是SipManager.makeAudioCall(localAdd,llistener,XXXX),在makeAudioCall方法中
A、创建一个sipAudioCall(localProfile)
B、创建SipSession以建立起会话
C、SipSession.makeCall(peerProfile,XXXX); //SipSession呼叫远程profile
【4】关于接电话道理都差不多,takeAudioCall
通过之前设置的callingID来查找mSipService.getPendingSession(callId);来获得SipSession。并创建SipAudioCall,然后attachCall就算接受电话了

  • 怎样打开VOIP与SIP
    答:1、一个基本的VOIP项目至少需要三个类SIPSettings(对SIP的基本设置身份验证)、WalkieTalkieActivity(登录到SIP设备供应商,注册device去处理来电,拨打电话,在通话过程中用户界面管理)、IncomingCallReceiver(监听传入的SIP电话,然后传递这些SIP电话给WalkieTalkieActivity控制)2、WalkieTalkieActivityA、SipManager.newInstance()-...
  • 如何搭建支持SIP的VOIP网络电话平台?
    答:1.购买一台服务器;2.托管到专业的IDC机房;3.安装网络电话平台(如果你有足够的时间,并且自己会编写程序,可以到网上下载开源的软件,稍作修改即可使用。比如目前来说,最热门的asterisk就是免费的开源的程序,能够满足你使用sip协议的voip电话的功能);4.开始使用。
  • 怎么在手机上用SIP打网络电话
    答:打开“sip设置”选择“新建sip模式”-“使用默认情景模式”:情景模式名称改为"voipdoup",服务情景模式为:IETF(wifi接入模式选择这个,3G连接选择诺基亚3gpp)默认接入点:[color=red]选择你的wifi搜索到可以使用的无线路由名称[/color](我的为[url= http://www.voipdoup.org/]www.voipdoup.org[/url...
  • 网络电话,VOIP电话,IP话机,sip话机怎么用
    答:VOIP网络电话就是去下载对应的版本,然后注册登陆就可以拨打电话了,mimicall的好像,新手会送免费的时间
  • 使用microSIP软件实现与内网IP电话通话并软件视频通话教程(附内网SIP...
    答:首先,让我们了解一下VoIP电话的两大类型:硬件VoIP,如Yealink T23G,具备传统电话的实用功能,而软件VoIP如microSIP,则是通过电脑(需麦克风和摄像头)实现的便捷选择。microSIP是一款开源免费软件,特别适合Windows设备,移动设备上推荐csipsimple和siphon。为了畅享通话,你需要准备一台SIP电话机,一台...
  • 什么是VOIP和SIP?
    答:会话发起协议(SIP)是IETF创建VoIP通话连接的协议标准。SIP是一种应用层控制协议,用于和一个或多个参与者创建、修改和终止会话。VoIP指的是通过因特网发送语音呼叫的任何方法。这意味着从SparkleComm到企业电话服务的所有内容都属于同一个保护伞。SIP只是当前使用的众多协议之一。因此,您也可以使用其他协议...
  • sip电话怎么用
    答:现有两种SIP电话。第一种是硬件SIP电话,它的外形与普通电话十分相近,但能在不使用传统PSTN系统的情况下,通过因特网接收和拨打电话。还有一种SIP电话是软件电话,可以通过耳麦和/或声卡拨打电话,将计算机作为电话机使用。但要求配置包裹宽带上网以及与VOIP服务商或一个SIP服务器连接。适用于Windows的3CX V...
  • 关于voip电话的几个问题 asterisk 软件 openwrt路由器 sip协议
    答:1. 任意一个地点,部署一个最低配置的电脑,比如奔四3.0之类的,安装 asterisk即可。这个地方的路由器做端口映射,把asterisk映射到公网,使用花生壳进行动态域名方式进行管理。这就是主服务器,对3个地方的通话进行管理的。同时这个地方,还需要购买一个sip网关,注册到asterisk上面即可。单口的比较便宜,...
  • Voip Sip网络电话具体拨打程序怎样,怎么收费?T300阿尔卡特座机购买时...
    答:有的路由器配有voip功能,这种带语音网关的路由器可以直接使用voip.设置的话:以voipdoup例,到官方网站注册得到账号,密码,服务器地址。然后打开路由器设置界面,设置好这些参数,一般就可以使用了。收般一般是8分到一角。效果好否与你的网络有很大关系。
  • 什么是VOIP和SIP?
    答:3、IP电信业能够提供多样化的通信服务,如:电话到电话、电脑到电话、传真到传真、传真到传真信箱、传真信箱到传真机、传真信箱到网页、PC文件(Excel、Word、E-mail)或图像到传真机、多点视频会议系统、网页电话等等。SIP正是一种IP电信业务,所以它的应用方式非常灵活,功能十分丰富。4、VoIP的通话质量...