Sip之imsdroid

imsdroid是一个基于doubango框架的全功能SIP/IMS Android客户端,支持音频/视频通话、消息、会议等功能。项目包括IMS客户端、视频会议服务器等多个组件,并涵盖SIP协议、多媒体编码等多种技术。本文介绍了imsdroid的主要功能和注册SIP/IMS服务器的示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先上一段自己的程序中的代码片段,然后再借用别人的一些帖子内容和说明来完善。

Engine.getInstance().getConfigurationService().putBoolean(NgnConfigurationEntry.GENERAL_AUTOSTART, true);
startMyService();
startMyService()的代码
private void startMyService() {
		final Engine engine = (Engine) Engine.getInstance();
		Thread thread = new Thread(new Runnable() {
			@Override
			public void run() {
				if (!engine.isStarted()) {
					engine.start();
				}
			}
		});
		thread.setPriority(Thread.MAX_PRIORITY);
		thread.start();
	}

Engine的代码

public class Engine extends NgnEngine{
	private final static String TAG = Engine.class.getCanonicalName();
	
	private static final String CONTENT_TITLE = "IMSDroid";
	
	private static final int NOTIF_AVCALL_ID = 19833892;
	private static final int NOTIF_SMS_ID = 19833893;
	private static final int NOTIF_APP_ID = 19833894;
	private static final int NOTIF_CONTSHARE_ID = 19833895;
	private static final int NOTIF_CHAT_ID = 19833896;
	
	private IScreenService mScreenService;
	
	public static NgnEngine getInstance(){
		if(sInstance == null){
			sInstance = new Engine();
		}
		return sInstance;
	}
	
	public Engine(){
		super();
	}
	
	@Override
	public boolean start() {
		return super.start();
	}
	
	@Override
	public boolean stop() {
		return super.stop();
	}
	
	private void showNotification(int notifId, int drawableId, String tickerText) {
		if(!mStarted){
			return;
		}
        // Set the icon, scrolling text and timestamp
        final Notification notification = new Notification(drawableId, "", System.currentTimeMillis());
        
        Intent intent = new Intent(PocApplication.getContext(), GroupPersonal.class);
    	intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP  | Intent.FLAG_ACTIVITY_NEW_TASK);
    	LogUtils.d("lijia", "Engine  通知栏点击");
        switch(notifId){
        	case NOTIF_APP_ID:
        		notification.flags |= Notification.FLAG_ONGOING_EVENT;
        		intent.putExtra("notif-type", "reg");
        		break;
        		
        	case NOTIF_CONTSHARE_ID:
                intent.putExtra("action", MainActivity.ACTION_SHOW_CONTSHARE_SCREEN);
                notification.defaults |= Notification.DEFAULT_SOUND;
                break;
                
        	case NOTIF_SMS_ID:
                notification.flags |= Notification.FLAG_AUTO_CANCEL;
                notification.defaults |= Notification.DEFAULT_SOUND;
                notification.tickerText = tickerText;
                intent.putExtra("action", MainActivity.ACTION_SHOW_SMS);
                break;
                
        	case NOTIF_AVCALL_ID:
        		tickerText = String.format("%s (%d)", tickerText, NgnAVSession.getSize());
        		intent.putExtra("action", MainActivity.ACTION_SHOW_AVSCREEN);
        		break;
        		
        	case NOTIF_CHAT_ID:
        		notification.defaults |= Notification.DEFAULT_SOUND;
        		tickerText = String.format("%s (%d)", tickerText, NgnMsrpSession.getSize(new NgnPredicate<NgnMsrpSession>() {
					@Override
					public boolean apply(NgnMsrpSession session) {
						return session != null && NgnMediaType.isChat(session.getMediaType());
					}
				}));
        		intent.putExtra("action", MainActivity.ACTION_SHOW_CHAT_SCREEN);
        		break;
        		
       		default:
       			
       			break;
        }
        PendingIntent contentIntent = PendingIntent.getActivity(PocApplication.getContext(), notifId/*requestCode*/, intent, PendingIntent.FLAG_UPDATE_CURRENT);     

        // Set the info for the views that show in the notification panel.
        notification.setLatestEventInfo(PocApplication.getContext(), CONTENT_TITLE, tickerText, contentIntent);

        // Send the notification.
        // We use a layout id because it is a unique number.  We use it later to cancel.
        mNotifManager.notify(notifId, notification);
    }
	/**显示 是否连接通知,改变原点状态*/
	public void showAppNotif(int drawableId, String tickerText){
    	Log.d(TAG, "showAppNotif");
    	showNotification(NOTIF_APP_ID, drawableId, tickerText);
    }
	/**显示电话打入与收到的状态*/
	public void showAVCallNotif(int drawableId, String tickerText){
    	showNotification(NOTIF_AVCALL_ID, drawableId, tickerText);
    }
	/**显示 是否连接通知,改变原点状态*/
	public void cancelAVCallNotif(){
    	if(!NgnAVSession.hasActiveSession()){
    		mNotifManager.cancel(NOTIF_AVCALL_ID);
    	}
    }
	
	public void refreshAVCallNotif(int drawableId){
		if(!NgnAVSession.hasActiveSession()){
    		mNotifManager.cancel(NOTIF_AVCALL_ID);
    	}
    	else{
    		showNotification(NOTIF_AVCALL_ID, drawableId, "In Call");
    	}
    }
	
	public void showContentShareNotif(int drawableId, String tickerText){
    	showNotification(NOTIF_CONTSHARE_ID, drawableId, tickerText);
    }
	
	public void cancelContentShareNotif(){
    	if(!NgnMsrpSession.hasActiveSession(new NgnPredicate<NgnMsrpSession>() {
			@Override
			public boolean apply(NgnMsrpSession session) {
				return session != null && NgnMediaType.isFileTransfer(session.getMediaType());
			}}))
    	{
    		mNotifManager.cancel(NOTIF_CONTSHARE_ID);
    	}
    }
    
	public void refreshContentShareNotif(int drawableId){
		if(!NgnMsrpSession.hasActiveSession(new NgnPredicate<NgnMsrpSession>() {
			@Override
			public boolean apply(NgnMsrpSession session) {
				return session != null && NgnMediaType.isFileTransfer(session.getMediaType());
			}}))
    	{
    		mNotifManager.cancel(NOTIF_CONTSHARE_ID);
    	}
    	else{
    		showNotification(NOTIF_CONTSHARE_ID, drawableId, "Content sharing");
    	}
    }
	
	public void showContentChatNotif(int drawableId, String tickerText){
    	showNotification(NOTIF_CHAT_ID, drawableId, tickerText);
    }
	
	public void cancelChatNotif(){
    	if(!NgnMsrpSession.hasActiveSession(new NgnPredicate<NgnMsrpSession>() {
			@Override
			public boolean apply(NgnMsrpSession session) {
				return session != null && NgnMediaType.isChat(session.getMediaType());
			}}))
    	{
    		mNotifManager.cancel(NOTIF_CHAT_ID);
    	}
    }
    
	public void refreshChatNotif(int drawableId){
		if(!NgnMsrpSession.hasActiveSession(new NgnPredicate<NgnMsrpSession>() {
			@Override
			public boolean apply(NgnMsrpSession session) {
				return session != null && NgnMediaType.isChat(session.getMediaType());
			}}))
    	{
    		mNotifManager.cancel(NOTIF_CHAT_ID);
    	}
    	else{
    		showNotification(NOTIF_CHAT_ID, drawableId, "Chat");
    	}
    }
	
	public void showSMSNotif(int drawableId, String tickerText){
    	showNotification(NOTIF_SMS_ID, drawableId, tickerText);
    }
	
	public IScreenService getScreenService(){
		if(mScreenService == null){
			mScreenService = new ScreenService();
		}
		return mScreenService;
	}
	
	@Override
	public Class<? extends NgnNativeService> getNativeServiceClass(){
		return NativeService.class;
	}
使用过程中分别获取配置服务和sip服务
mConfigurationService = Engine.getInstance().getConfigurationService();
		mSipService = Engine.getInstance().getSipService();


下面贴一下其他作者的帖子说明。帖子地址http://blog.youkuaiyun.com/banketree/article/details/12580019

简介

imsdroid 是全功能的SIP / IMS的客户端,它基于doubango框架开发的app,doubango是目前世界上最好的3GPP IMS/RCS 嵌入式桌面系统框架,该框架提供了一套独特的功能,包括音频/视频通话、内容共享、消息、会议、通讯录等。

官网地址:http://code.google.com/p/imsdroid/

组件

1、Boghe 

IMS/ RCS Windows客户端

2、IMSDroid

IMS/ RCS Android客户端(使用NGN堆栈)

3、iDoubs

IMS/ RCS iOS客户端(iPhone,iPad和iPod Touch)

4、OpenVCS

开源视频会议服务器,用于管理多点控制单元(MCU),每个MCU可以处理多达64人参与

5、Flash2IMS

使用Adobe Flash 的SIP/ IMS网关

支持功能

1、SIP ( RFC 3261 3GPP TS 24.229 REL- 9 )

2、 IPv4 IPv6  TCP UDP

3、信号编码  SigComp (RFC 3320 、3485、 4077 、4464 、4465、4896、5049、5112、1951)

4、通讯录

5、GSMA 通信

6、 语音(GSMA VoLTE)

7、GSMA RCS and GSMA VoLTE

8 、IMS 登陆 MD5加密

9、3GPP

10、服务路由探索

11、注册事件监听(注册事件、拨打事件、来电事件、消息事件。。。)

12、3GPP IP ( 3GPP TS 23.038 、24.040 、 24.011、 24.341、24.451短信)

13、语音呼叫( G729AB1 、 AMR - NB 、iLBC、 GSM 、 PCMA 、 PCMU、 Speex NB )

14、视频通话( H264、MP4V - ES 、Theora、 H.263 、 H.263 -1998 、H.261 )

15、双音多频DTMF ( RFC 4733 )

16、解决网络延迟和阻塞技术QoS negotiation using Preconditions (RFC 3312, 4032 and 5027)

17、SIP会话定时器( RFC 4028 )

18、临时响应( PRACK )

19、通信保持(3GPP TS 24.610 )

20、消息等待指示( 3GPP TS 24.606 )

21、E.164号码呼叫通过使用ENUM协议( RFC 3761 )

22、NAT穿越

23、一对一和群组聊天


项目如图


效果如图


项目分析

如何注册一个SIP / IMS服务器?如下:

[java]  view plain  copy
  1.  final String realm = "sip:doubango.org";  
  2.  final String privateIdentity = "001";  
  3.  final String publicIdentity = "sip:001@doubango.org";  
  4.  final String password = "my secret";  
  5.  final String proxyHost = "192.168.0.1";  
  6.  RegistrationSession registrationSession;  
  7.  // Sip Callback  
  8.  final SipCallback callback = new SipCallback(){  
  9.                 @Override  
  10.                 public int OnDialogEvent(DialogEvent e) {  
  11.                                 final SipSession sipSession = e.getBaseSession();  
  12.                                 final long sipSessionId = sipSession.getId();  
  13.                                 final short code = e.getCode();  
  14.                                 switch (code){  
  15.                                                 case tinyWRAPConstants.tsip_event_code_dialog_connecting:  
  16.                                                                 if(registrationSession != null && registrationSession.getId()   
  17.   
  18. == sipSessionId){  
  19.                                                                                 // Registration in progress  
  20.                                                                 }  
  21.                                                                 break;  
  22.                                                 case tinyWRAPConstants.tsip_event_code_dialog_connected:  
  23.                                                                 if(registrationSession != null && registrationSession.getId()   
  24.   
  25. == sipSessionId){  
  26.                                                                                 // You are registered  
  27.                                                                 }  
  28.                                                                 break;  
  29.                                                 case tinyWRAPConstants.tsip_event_code_dialog_terminating:  
  30.                                                                 if(registrationSession != null && registrationSession.getId()   
  31.   
  32. == sipSessionId){  
  33.                                                                                 // You are unregistering  
  34.                                                                 }  
  35.                                                                 break;  
  36.                                                 case tinyWRAPConstants.tsip_event_code_dialog_terminated:  
  37.                                                                 if(registrationSession != null && registrationSession.getId()   
  38.   
  39. == sipSessionId){  
  40.                                                                                 // You are unregistered  
  41.                                                                 }  
  42.                                                                 break;  
  43.                                 }  
  44.                                                   
  45.                                 return 0;  
  46.                 }  
  47.    
  48.                 @Override  
  49.                 public int OnRegistrationEvent(RegistrationEvent e) {  
  50.                                 // low level events  
  51.                                 return 0;  
  52.                 }  
  53.  };  
  54.  // Create the SipStack  
  55.  SipStack sipStack = new SipStack(callback, realm, privateIdentity, publicIdentity);  
  56.  // Set Proxy Host and port  
  57.  sipStack.setProxyCSCF(proxyHost, 5060"UDP""IPv4");  
  58.  // Set password  
  59.  sipStack.setPassword(password);  
  60.  if(sipStack.isValid()){  
  61.                 if(sipStack.start()){  
  62.                                 registrationSession = new RegistrationSession(sipStack);  
  63.                                 registrationSession.setFromUri(publicIdentity);  
  64.                                 // Send SIP register request  
  65.                                 registrationSession.register_();  
  66.                 }  
  67.  }  


初始化引擎:

[java]  view plain  copy
  1. final NgnEngine mEngine = NgnEngine.getInstance();  
获取配置服务:

[java]  view plain  copy
  1. INgnConfigurationService mConfigurationService = mEngine.getConfigurationService();  
获取SIP / IMS服务:

[java]  view plain  copy
  1. INgnSipService mSipService = mEngine.getSipService();  
启动/停止引擎:

[java]  view plain  copy
  1. // Starts the engine  
  2. mEngine.start();  
  3. // Stops the engine  
  4. mEngine.stop();  
Contact Service
服务用于检索从本地地址簿

HTTP/HTTPS Service
HTTP / HTTPS服务用来发送和检索数据到/从远程服务器使用HTTP / HTTPS协议

Network Service
网络服务是用来管理WiFi和3G/4G网络连接

Sound Service
铃声,彩铃业务,警报

[java]  view plain  copy
  1. //获取和NGN引擎实例  
  2. NgnEngine mEngine = NgnEngine.getInstance();  
  3. //播放铃音  
  4. mEngine.getSoundService().startRingBackTone();  
  5. //停止铃音  
  6. mEngine.getSoundService().stopRingBackTone();  
Storage Service
管理存储功能

Configuration Service
用来存储用户的设置,设置好后重新启动

[java]  view plain  copy
  1. final INgnConfigurationService mConfigurationService = NgnEngine.getInstance().getConfigurationService();  

History Service
用于存储/检索历史事件(音频/视频,通讯,……)

[java]  view plain  copy
  1. final INgnHistoryService mHistoryService = NgnEngine.getInstance().getHistoryService();  


SIP/IMS Service
管理SIP/IMS栈

[java]  view plain  copy
  1. final INgnSipService mSipService = NgnEngine.getInstance().getSipService();  

Audio/Video calls
音频/视频通话


得到有关的音频/视频呼叫状态如下:
[java]  view plain  copy
  1. final String remoteUri = "+33600000000";  
  2.  final String validUri = NgnUriUtils.makeValidSipUri(remoteUri); // sip:+33600000000"@doubango.org  
  3.  NgnAVSession avSession = NgnAVSession.createOutgoingSession(mSipService.getSipStack(), NgnMediaType.Audio);  
  4.  if(avSession.makeCall(validUri)){  
  5.                 Log.d(TAG,"all is ok");  
  6.  }  
  7.  else{  
  8.  Log.e(TAG,"Failed to place the call");  
  9.  }  

拨打电话如下:
[java]  view plain  copy
  1. final String remoteUri = "+33600000000";  
  2.  final String validUri = NgnUriUtils.makeValidSipUri(remoteUri); // sip:+33600000000"@doubango.org  
  3.  NgnAVSession avSession = NgnAVSession.createOutgoingSession(mSipService.getSipStack(), NgnMediaType.AudioVideo);  
  4.  if(avSession.makeCall(validUri)){  
  5.                 Log.d(TAG,"all is ok");  
  6.  }  
  7.  else{  
  8.  Log.e(TAG,"Failed to place the call");  
  9.  }  

SMS and Chat  

3GPP短信流
[java]  view plain  copy
  1. final String SMSC = "sip:+3310000000@doubango.org"// SMS Center  
  2. final String remotePartyUri = "sip:+336000000@doubango.org"// remote party  
  3. final String textToSend = "hello world!";  
  4. final NgnMessagingSession imSession = NgnMessagingSession.createOutgoingSession(mSipService.getSipStack(),   
  5. remotePartyUri);  
  6. if(!imSession.SendBinaryMessage(textToSend,SMSC)){  
  7.                Log.e(TAG,"Failed to send");  
  8. }  
  9. else{  
  10. Log.d(TAG,"Message sent");  
  11. }  
  12. // release session  
  13. NgnMessagingSession.releaseSession(imSession);  

IM寻呼模式
[java]  view plain  copy
  1. final String textToSend = "hello world!";  
  2.  final String remotePartyUri = "sip:+336000000@doubango.org"// remote party  
  3.  final NgnMessagingSession imSession = NgnMessagingSession.createOutgoingSession(mSipService.getSipStack(),   
  4.  remotePartyUri);  
  5.  if(!imSession.sendTextMessage(textToSend)){  
  6.                 Log.e(TAG,"Failed to send");  
  7.  }  
  8.  else{  
  9.  Log.d(TAG,"Message sent");  
  10.  }  
  11.  // release session  
  12.  NgnMessagingSession.releaseSession(imSession);  

监听事件
SIP/IMS服务负责对SIP协议相关的所有任务(登记,音频/视频电话,寻呼机模式IM…)等都有监听,所有的通知都是异步方式。

[java]  view plain  copy
  1. final TextView mTvInfo = (TextView)findViewById(R.id.textViewInfo);  
  2.  final BroadcastReceiver mSipBroadCastRecv = new BroadcastReceiver() {  
  3.                                                 @Override  
  4.                                                 public void onReceive(Context context, Intent intent) {  
  5.                                                                 final String action = intent.getAction();  
  6.                                                                   
  7.                                                                 // Registration Event  
  8.                                                                 if(NgnRegistrationEventArgs.ACTION_REGISTRATION_EVENT.equals  
  9.   
  10. (action)){  
  11.                                                                                 NgnRegistrationEventArgs args =   
  12.   
  13. intent.getParcelableExtra(NgnEventArgs.EXTRA_EMBEDDED);  
  14.                                                                                 if(args == null){  
  15.                                                                                                 Log.e(TAG, "Invalid event   
  16.   
  17. args");  
  18.                                                                                                 return;  
  19.                                                                                 }  
  20.                                                                                 switch(args.getEventType()){  
  21.                                                                                                 case REGISTRATION_NOK:  
  22.                                                                                                                   
  23.   
  24. mTvInfo.setText("Failed to register :(");  
  25.                                                                                                                 break;  
  26.                                                                                                 case UNREGISTRATION_OK:  
  27.                                                                                                                   
  28.   
  29. mTvInfo.setText("You are now unregistered :)");  
  30.                                                                                                                 break;  
  31.                                                                                                 case REGISTRATION_OK:  
  32.                                                                                                                   
  33.   
  34. mTvInfo.setText("You are now registered :)");  
  35.                                                                                                                 break;  
  36.                                                                                                 case REGISTRATION_INPROGRESS:  
  37.                                                                                                                   
  38.   
  39. mTvInfo.setText("Trying to register...");  
  40.                                                                                                                 break;  
  41.                                                                                                 case UNREGISTRATION_INPROGRESS:  
  42.                                                                                                                   
  43.   
  44. mTvInfo.setText("Trying to unregister...");  
  45.                                                                                                                 break;  
  46.                                                                                                 case UNREGISTRATION_NOK:  
  47.                                                                                                                   
  48.   
  49. mTvInfo.setText("Failed to unregister :(");  
  50.                                                                                                                 break;  
  51.                                                                                 }  
  52.                                                                 }  
  53.                                                 }  
  54.                                 };  
  55.                                 final IntentFilter intentFilter = new IntentFilter();  
  56.                                 intentFilter.addAction(NgnRegistrationEventArgs.ACTION_REGISTRATION_EVENT);  
  57.                     registerReceiver(mSipBroadCastRecv, intentFilter);  
  58.   
  59. Listening for audio/video call state change  
  60.  You can listen to the audio/video call state change in order to get notified when the call state change (incoming, incall,   
  61.   
  62. outgoing, terminated, ...).   
  63.  final BroadcastReceiver mSipBroadCastRecv = new BroadcastReceiver() {  
  64.                                 @Override  
  65.                                 public void onReceive(Context context, Intent intent) {  
  66.                                                 InviteState state;  
  67.                                                 final String action = intent.getAction();  
  68.                                                 if(NgnInviteEventArgs.ACTION_INVITE_EVENT.equals(action)){  
  69.                                                                 NgnInviteEventArgs args = intent.getParcelableExtra  
  70.   
  71. (NgnEventArgs.EXTRA_EMBEDDED);  
  72.                                                                 if(args == null){  
  73.                                                                                 Log.e(TAG, "Invalid event args");  
  74.                                                                                 return;  
  75.                                                                 }  
  76.                                                                 Log.d(TAG, "This is an event for session number   
  77.   
  78. "+args.getSessionId());                           
  79.                                                                 // Retrieve the session from the store  
  80.                                                                 NgnAVSession avSession = NgnAVSession.getSession  
  81.   
  82. (args.getSessionId());  
  83.                                                                 if(avSession == null){  
  84.                                                                                 Log.e(TAG, "Cannot find session");  
  85.                                                                                 return;  
  86.                                                                 }  
  87.                                                                 switch((state = avSession.getState())){  
  88.                                                                                 case NONE:  
  89.                                                                                 default:  
  90.                                                                                                 break;  
  91.                                                                                                   
  92.                                                                                 case INCOMING:  
  93.                                                                                                 Log.i(TAG, "Incoming call");  
  94.                                                                                                 break;  
  95.                                                                                                   
  96.                                                                                 case INPROGRESS:  
  97.                                                                                                 Log.i(TAG, "Call in progress");  
  98.                                                                                                 break;  
  99.                                                                                                   
  100.                                                                                 case REMOTE_RINGING:  
  101.                                                                                                 Log.i(TAG, "Remote party is   
  102.   
  103. ringing");  
  104.                                                                                                 break;  
  105.                                                                                                   
  106.                                                                                 case EARLY_MEDIA:  
  107.                                                                                                 Log.i(TAG, "Early media   
  108.   
  109. started");  
  110.                                                                                                 break;  
  111.                                                                                                   
  112.                                                                                 case INCALL:  
  113.                                                                                                 Log.i(TAG, "Call connected");  
  114.                                                                                                 break;  
  115.                                                                                                   
  116.                                                                                 case TERMINATING:  
  117.                                                                                                 Log.i(TAG, "Call terminating");  
  118.                                                                                                 break;  
  119.                                                                                                   
  120.                                                                                 case TERMINATED:  
  121.                                                                                                 Log.i(TAG, "Call terminated");  
  122.                                                                                                 break;  
  123.                                                                 }  
  124.                                                 }  
  125.                                 }  
  126.                 };  

Realm
这个领域是身份验证的域名称,一个有效的SIP URI(sip:open-ims.test  or sip:10.0.0.1),程序开始之前设置信息,如果Proxy-CSCF的地址丢失,那么堆栈将自动使用DNS SRV NAPTR 和DHCP机制动态发现。
[java]  view plain  copy
  1. final String myRealm = "sip:doubango.org";   
  2. final boolean bSaveNow = true;  
  3. mConfigurationService(ConfigurationEntry.NETWORK_REALM, myRealm, bSaveNow);  

希望原创作者不介意我这种结合方式,在此表示感谢。


imsdroid 是全功能的SIP / IMS的客户端,它基于doubango框架开发的app,doubango是目前世界上最好的3GPP IMS/RCS 嵌入式桌面系统框架,该框架提供了一套独特的功能,包括音频/视频通话、内容共享、消息、会议、通讯录等。 官网地址:http://code.google.com/p/imsdroid/ 组件 1、Boghe IMS/ RCS Windows客户端 2、IMSDroid IMS/ RCS Android客户端(使用NGN堆栈) 3、iDoubs IMS/ RCS iOS客户端(iPhone,iPad和iPod Touch) 4、OpenVCS 开源视频会议服务器,用于管理多点控制单元(MCU),每个MCU可以处理多达64人参与 5、Flash2IMS 使用Adobe Flash 的SIP/ IMS网关 支持功能 1、SIP ( RFC 3261 3GPP TS 24.229 REL- 9 ) 2、 IPv4 IPv6 TCP UDP 3、信号编码 SigComp (RFC 3320 、3485、 4077 、4464 、4465、4896、5049、5112、1951) 4、通讯录 5、GSMA 通信 6、 语音(GSMA VoLTE) 7、GSMA RCS and GSMA VoLTE 8 、IMS 登陆 MD5加密 9、3GPP 10、服务路由探索 11、注册事件监听(注册事件、拨打事件、来电事件、消息事件。。。) 12、3GPP IP ( 3GPP TS 23.038 、24.040 、 24.011、 24.341、24.451短信) 13、语音呼叫( G729AB1 、 AMR - NB 、iLBC、 GSM 、 PCMA 、 PCMU、 Speex NB ) 14、视频通话( H264、MP4V - ES 、Theora、 H.263 、 H.263 -1998 、H.261 ) 15、双音多频DTMF ( RFC 4733 ) 16、解决网络延迟和阻塞技术QoS negotiation using Preconditions (RFC 3312, 4032 and 5027 17、SIP会话定时器( RFC 4028 ) 18、临时响应( PRACK ) 19、通信保持(3GPP TS 24.610 ) 20、消息等待指示( 3GPP TS 24.606 ) 21、E.164号码呼叫通过使用ENUM协议( RFC 3761 ) 22、NAT穿越 23、一对一和群组聊天
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值