《電子技術應用》
您所在的位置:首頁 > 通信與網絡 > 設計應用 > 基于Android的VoIP系統實現原理
基于Android的VoIP系統實現原理
OFweek電子工程網
摘要: 隨著我國三網融合的推進,VoIP與IPTV一起成為這一龐大工程的重要標志。而目前手機中,VoIP的解決方案并不是很多,特別是在Google公司推出的開源操作系統Android中。
Abstract:
Key words :

  0 引言

  VoIP" title="VoIP">VoIP(Voice over Internet Protocol)即首先數字化語音信號并壓縮成幀,轉換為IP數據包在網絡上傳輸,以此完成語音通話的業務,是一種利用IP協議傳輸語音數據的、新興的通信技術。

  隨著我國三網融合" title="三網融合">三網融合的推進,VoIP與IPTV(Interactive Personality TV)一起成為這一龐大工程的重要標志。而目前手機中,VoIP的解決方案并不是很多,特別是在Google公司推出的開源操作系統Android" title="Android">Android中。盡管該系統推出時間不長,憑借強大的功能、良好的界面、廣泛的商業支持,為用戶帶來很好的體驗,成為2010年最熱門且發展最快的手機操作系統。因此,兩者的結合,將是未來的發展趨勢。本文提出一種基于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類能夠調用。

  2.2.1 新建PJSIP類

  為各個待實現的類新建一個包,可以命名為“com.android.VoIP.pjsip”,在該包中添加該系統相關的一些類,主要有如下6個類:

  

  這些類分別為上節中原理各個步驟的實現。這部分僅僅是為C庫的調用提供一個接口,因此具體的實現將放在本地C/C++程序中。

  2.2.2 頭文件的生成

  C庫與Java間還需通過一個后綴為“.h”的頭文件來銜接,這個頭文件可以手動編寫,也可以通過“Javah”來生成,該工具包含在JDK中,是由SUN公司提供的。

  Javah生產的頭文件包含一定的規則,例如,本例中,它將生成的函數聲明為“Java_com_android_IMSandroid_pjsip_**”的形式,以便在調用C庫時能正確識別。

  由于Java中的數據類型與C/C++不盡相同,因此還必須注意參數傳遞時參數類型的轉換。本文所涉及到的Java數據類型有String和int型,Javah生成的頭文件中會先定義好需要傳遞的參數類型以及函數返回類型,例如方法“add_account(String sip_user,Stringsip_dom-ain,String sip_passwd)”,在頭文件中將定義函數的形式為“JNIEXPORT jint JNICALL Java_com_android_IMSandroid_pjsip_add_lac-count(JNIEnv*,jclass,jstring,jstring,jstring)”,其中JNIEXPORT為JNI外部函數聲明,jint是“jni.h”中定義C語言中整形的對應類型,JNCALL是JNI關鍵字。比較特殊的是JNIEnv,它是一個指向類型為JNIEnv_的一個特殊JNI數據結構的指針,它的每個元素都指向一個JNI函數的指針,jclass會根據引用Java類的不同而不同,本文中“pjsip.class”是靜態類,因此這里的jclass指的是類本身,如果是非靜態類則指的是對象。后面幾個就是pjsip類需要傳遞的參數,根據“jni.h”的定義,String類型對應jstring,int對應jint。然而這只是函數申明與類中方法的形式對應,參數的具體傳遞還需要相應的轉化,具體實現將在下一節詳細介紹。

  2.2.3 JNI接口函數的實現

  創建了pjsip庫類和頭文件之后,必須應用一個庫接口函數,這部分是pjsip接口的實現,限于篇幅,本文只講解幾個重要函數的實現。

  (1)init函數

  首先是init函數,對應的接口函數為JNICALL Java_com_android_IMSandroid_pjsip_init。該函數在系統初始化時調用,其作用是配置相關參數,并發起一個pjsua應用。它先通過函數“pjsua_create()”創建一個“pjsua”應用,然后通過三個函數“pjsua_config_default(&cfg)”,“pjsua_logging_config_default(&log_cfg”),“pjsua_media_config_default(&media_cfg)”配置其相關參數,其中cfg是pjsua的相關參數,主要是狀態改變時的回調函數;log_cfg用來配置log級別;media_cfg中包含時鐘頻率、聲道數目等相關參數。

  完成配置之后就可以使用pjsua_init(&cfg,&log_cfg,&media_cfg)將先前配置的參數初始化。在初始化之后,還需為pjsua添加一個udp傳輸,這一步是通過pjsua_transport_create(PJSIP_TRANSPORT_UDP,&cfg,NULL)來實現的,cfg中包含指定的通訊端口,3GPP建議使用5060。

  需要注意的是,配置完以上參數之后,還需指定SPEEX編碼優先級,一般將其設為最大,可以通過函數pisua_codec_set_priority(&-speex_codec_id,255)來實現。所有配置完成之后,就可以發起pjsua,即最后調用pjsua_start()。成功的話,本函數的返回類型為PJ_SUCCESS。

  (2)make_call函數

  另一個很重要的函數是make_call,其在本接口文件中對應的函數為Java_com_Android_IMSandroid_pjsip_make_lcall,這個函數一般在發起會話時調用,它與上一個函數在結構上最大的不同在于本函數需要傳遞一個字符串參數,前面提到,Java與C/C++在參數結構上并不完全相同,因此這里需要將Java傳遞過來的String類型的參數轉化,可以通過“url_ptr=(char*)env-》GetStringUTFChars(url,&iscopy)”來實現。env-》GetStringUTFChars在“jni.h”中定義,其功能是將jsting類型(Java)的url復制到char*類型(C)的url_ptr中,以此來完成參數類型的轉換。

  為了保證傳遞地址的有效性,還需要使用pjsua_verify_sip_url(url_ptr)驗證,這個函數主要驗證url_ptr是符合SIP的規則,即是否是一個合法的SIP地址。然而char*型的地址pjsua中還是不能直接使用的,這是因為pjsua重新封裝了參數類型,所以最后還需要將其轉化成pj_ str_t類型,pjlib提供pj_str()函數可以完成轉化。在完成了參數的轉化后,調用“pjsua_call_make_call()”,將發起會話。

  (3)hangup函數和pjsua_destroy函數

  這兩個函數用來銷毀和掛斷會話,一般在需結束的時候調用,它們在接口函數中對應Java_com_android_

  IMSandroid_pjsip_hangup和Java_com_android_IMSandroid_pjsip_destroy,由于沒有參數傳遞,也沒有其他的調用,因此這兩個函數非常簡單,基本上直接調用pjsua提供的pjsua_call_hangup_all()和pjsua_destroy()就能實現。pisua中這兩個函數將完成內存釋放、賬戶注銷等工作。

  (4)add_account函數

  該函數在基本的pjsua中并不是必須的,但如果要使用SIP服務器的話,就必須實現該函數,它在接口函數中對應“Java_com_android_I-MSandroid_pjsip_add_1account”,同“make_call”一樣,也需要傳遞參數,不同的是,它傳遞三個參數,只是原理大體一樣。

  首先它將參數轉化后保持到cfg,通過“pjsua_acc_add(&cfg,PJ_TRUE,&ace_id)”將參數添加到pjsua。pjsua將以其中的sip服務器為目的地址,注冊會話發起申請,經過一系列的操作之后,與目的地址發起會話。

  0 引言

  VoIP(Voice over Internet Protocol)即首先數字化語音信號并壓縮成幀,轉換為IP數據包在網絡上傳輸,以此完成語音通話的業務,是一種利用IP協議傳輸語音數據的、新興的通信技術。

  隨著我國三網融合的推進,VoIP與IPTV(Interactive Personality TV)一起成為這一龐大工程的重要標志。而目前手機中,VoIP的解決方案并不是很多,特別是在Google公司推出的開源操作系統Android中。盡管該系統推出時間不長,憑借強大的功能、良好的界面、廣泛的商業支持,為用戶帶來很好的體驗,成為2010年最熱門且發展最快的手機操作系統。因此,兩者的結合,將是未來的發展趨勢。本文提出一種基于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類能夠調用。

  2.2.1 新建PJSIP類

  為各個待實現的類新建一個包,可以命名為“com.android.VoIP.pjsip”,在該包中添加該系統相關的一些類,主要有如下6個類:

  

  這些類分別為上節中原理各個步驟的實現。這部分僅僅是為C庫的調用提供一個接口,因此具體的實現將放在本地C/C++程序中。

  2.2.2 頭文件的生成

  C庫與Java間還需通過一個后綴為“.h”的頭文件來銜接,這個頭文件可以手動編寫,也可以通過“Javah”來生成,該工具包含在JDK中,是由SUN公司提供的。

  Javah生產的頭文件包含一定的規則,例如,本例中,它將生成的函數聲明為“Java_com_android_IMSandroid_pjsip_**”的形式,以便在調用C庫時能正確識別。

  由于Java中的數據類型與C/C++不盡相同,因此還必須注意參數傳遞時參數類型的轉換。本文所涉及到的Java數據類型有String和int型,Javah生成的頭文件中會先定義好需要傳遞的參數類型以及函數返回類型,例如方法“add_account(String sip_user,Stringsip_dom-ain,String sip_passwd)”,在頭文件中將定義函數的形式為“JNIEXPORT jint JNICALL Java_com_android_IMSandroid_pjsip_add_lac-count(JNIEnv*,jclass,jstring,jstring,jstring)”,其中JNIEXPORT為JNI外部函數聲明,jint是“jni.h”中定義C語言中整形的對應類型,JNCALL是JNI關鍵字。比較特殊的是JNIEnv,它是一個指向類型為JNIEnv_的一個特殊JNI數據結構的指針,它的每個元素都指向一個JNI函數的指針,jclass會根據引用Java類的不同而不同,本文中“pjsip.class”是靜態類,因此這里的jclass指的是類本身,如果是非靜態類則指的是對象。后面幾個就是pjsip類需要傳遞的參數,根據“jni.h”的定義,String類型對應jstring,int對應jint。然而這只是函數申明與類中方法的形式對應,參數的具體傳遞還需要相應的轉化,具體實現將在下一節詳細介紹。

  2.2.3 JNI接口函數的實現

  創建了pjsip庫類和頭文件之后,必須應用一個庫接口函數,這部分是pjsip接口的實現,限于篇幅,本文只講解幾個重要函數的實現。

  (1)init函數

  首先是init函數,對應的接口函數為JNICALL Java_com_android_IMSandroid_pjsip_init。該函數在系統初始化時調用,其作用是配置相關參數,并發起一個pjsua應用。它先通過函數“pjsua_create()”創建一個“pjsua”應用,然后通過三個函數“pjsua_config_default(&cfg)”,“pjsua_logging_config_default(&log_cfg”),“pjsua_media_config_default(&media_cfg)”配置其相關參數,其中cfg是pjsua的相關參數,主要是狀態改變時的回調函數;log_cfg用來配置log級別;media_cfg中包含時鐘頻率、聲道數目等相關參數。

  完成配置之后就可以使用pjsua_init(&cfg,&log_cfg,&media_cfg)將先前配置的參數初始化。在初始化之后,還需為pjsua添加一個udp傳輸,這一步是通過pjsua_transport_create(PJSIP_TRANSPORT_UDP,&cfg,NULL)來實現的,cfg中包含指定的通訊端口,3GPP建議使用5060。

  需要注意的是,配置完以上參數之后,還需指定SPEEX編碼優先級,一般將其設為最大,可以通過函數pisua_codec_set_priority(&-speex_codec_id,255)來實現。所有配置完成之后,就可以發起pjsua,即最后調用pjsua_start()。成功的話,本函數的返回類型為PJ_SUCCESS。

  (2)make_call函數

  另一個很重要的函數是make_call,其在本接口文件中對應的函數為Java_com_Android_IMSandroid_pjsip_make_lcall,這個函數一般在發起會話時調用,它與上一個函數在結構上最大的不同在于本函數需要傳遞一個字符串參數,前面提到,Java與C/C++在參數結構上并不完全相同,因此這里需要將Java傳遞過來的String類型的參數轉化,可以通過“url_ptr=(char*)env-》GetStringUTFChars(url,&iscopy)”來實現。env-》GetStringUTFChars在“jni.h”中定義,其功能是將jsting類型(Java)的url復制到char*類型(C)的url_ptr中,以此來完成參數類型的轉換。

  為了保證傳遞地址的有效性,還需要使用pjsua_verify_sip_url(url_ptr)驗證,這個函數主要驗證url_ptr是符合SIP的規則,即是否是一個合法的SIP地址。然而char*型的地址pjsua中還是不能直接使用的,這是因為pjsua重新封裝了參數類型,所以最后還需要將其轉化成pj_ str_t類型,pjlib提供pj_str()函數可以完成轉化。在完成了參數的轉化后,調用“pjsua_call_make_call()”,將發起會話。

  (3)hangup函數和pjsua_destroy函數

  這兩個函數用來銷毀和掛斷會話,一般在需結束的時候調用,它們在接口函數中對應Java_com_android_

  IMSandroid_pjsip_hangup和Java_com_android_IMSandroid_pjsip_destroy,由于沒有參數傳遞,也沒有其他的調用,因此這兩個函數非常簡單,基本上直接調用pjsua提供的pjsua_call_hangup_all()和pjsua_destroy()就能實現。pisua中這兩個函數將完成內存釋放、賬戶注銷等工作。

  (4)add_account函數

  該函數在基本的pjsua中并不是必須的,但如果要使用SIP服務器的話,就必須實現該函數,它在接口函數中對應“Java_com_android_I-MSandroid_pjsip_add_1account”,同“make_call”一樣,也需要傳遞參數,不同的是,它傳遞三個參數,只是原理大體一樣。

  首先它將參數轉化后保持到cfg,通過“pjsua_acc_add(&cfg,PJ_TRUE,&ace_id)”將參數添加到pjsua。pjsua將以其中的sip服務器為目的地址,注冊會話發起申請,經過一系列的操作之后,與目的地址發起會話。

  2.2.4 主程序與用戶界面

  系統的主程序是一個標準的Android應用程序,它使用Java語言開發,符合SDK規范。與一般的SDK程序不同的是,該類中必須使用Syst-em.loadLibrary加載PJSIP庫文件。形式如下:

  System.loadLibrary(“pjsip-jni”);

  其中,pjsip-jni就是上節中PJSIP協議棧生成的庫。

  主程序中的基本方式均按照上節中的過程,創建并初始化PJSUA;當call按鍵被觸發時發起會話,調用make-call()方法;當用戶接受通話時,點擊hang或cancel按鍵,觸發hang()或采用destry()方法等。

  用戶接口是通過Android SDK來實現的,這部分幾乎全都是Java語言,由于UI不是本文的重點,因此只介紹一個簡單的界面,實際應用中用戶交互是非常重要的。為了實現所需的功能,至少需要一個文本框來提供SIP地址,以及兩個按鍵來控制會話發起和結束。另外,在呼叫與通話過程中,還需要一個頁面來顯示,這里可以通過對話框來顯示,最后的界面如圖2所示。

  

  3 封裝與調試

  為了能在Android平臺上方便地使用該系統,在實現了PJSIP協議棧、JNI接口以及UI之后,還需將上面所有的模塊進行封裝。Android SDK提供了一些很有用的工具,如aapt等,由于本文重點不在AndriodSDK,所以可以采用集成開發工具(如集成在Eclipse中的ADT)來封裝。在工程libs(如果不存在則新建)目錄下新建一個名為armeabi的目錄,將上節生成的.so庫文件放到該目錄下。ADT在封裝資源時會自動將該庫文件封裝到apk文件中,apk是Android操作系統中應用程序的封裝形式,在所有android平臺中均能使用。

  封裝后安裝到Android手機、MID或虛擬機中,并發起會話。與開源SIP軟件Linphone通信的結果如圖2所示。

  4 結語

  通過測試表明,該系統能夠對發起并很好地控制SIP信令,該系統由于采用SIP協議,因此與所有采用這一協議的軟件均能通信,如Lin-phone,Kphone等,功能測試中表現良好,實現了VoIP的基本需求。同時如果要增加功能,可以在Java類中添加相應的方法并在應用層調用即可,具有一定的可擴展性。

  由于手機等手持設備在規格和配置上的差異,該系統在具體的設備上使用時,界面略有不同,但是同系統架構的手機使用時并不影響功能,在HTC Desire和MOTO Milestone上測試均能正常使用。但是,當移植到不同的架構時(即使同時ARM架構),仍需做一定的優化,一般采取主流平臺的多種版本方式來解決,這也是所有多廠商移動設備上一個無法避免的問題。

此內容為AET網站原創,未經授權禁止轉載。
主站蜘蛛池模板: 69欧美视频 | 午夜精品久久99蜜桃的功能介绍 | 国产精品第一页在线观看 | 成人在线观看视频网站 | www婷婷av久久久影片 | 久久久久无码国产精品不卡 | 在线观看视频福利 | 亚洲精选一区二区 | 亚洲六月婷婷 | 丁香花五月天 | 特级淫片aaaaaaa级附近的 | 亚洲日本一区二区三区在线 | 国内精品91少妇在线播放 | 亚洲欧洲日产国产 最新 | 中文字幕人妻丝袜二区 | 日本毛片在线看 | ⅹⅹⅹ黄色片视频 | 精品日韩在线播放 | 成人私密视频 | 日日干夜夜爱 | 永久黄网站色视频免费直播 | 好爽好大久久久级淫片毛片小说 | 精品动漫3d一区二区三区免费版 | 4438xx亚洲最大五色丁香软件 | 可播放的亚洲男同网站 | 成人一级黄色片 | 九色国产 | 色婷婷激情 | 国产乱子伦无套一区二区三区 | 伊人性伊人情综合网 | 一本一道dvd在线观看免费视频 | 国产亚洲精品久久久久久无几年桃 | av一本久道久久综合久久鬼色 | 亚洲国产日韩欧美在线观看 | 亚洲va久久久噜噜噜久久男同 | 亚洲欧洲日本在线 | 久久99精品久久久久久噜噜 | 日日干影院 | 亚洲色图视频网站 | 亚洲wwww| av噜噜在线观看 | 国产午夜精品一区二区三区四区 | 男人用嘴添女人下身免费视频 | 日韩女优在线播放 | blacked精品一区国产在线观看 | 麻豆文化传媒精品一区观看 | 欧美大片在线免费观看 | h网站免费在线观看 | 舐め犯し波多野结衣在线观看 | 欧美字幕 | 美女网站免费福利视频 | 日本另类αv欧美另类aⅴ | 国内偷自拍性夫妇 | 超碰在线观看99 | 极品熟妇大蝴蝶20p 国产女人高潮叫床视频 | 中国女人做爰视频 | 久久99久久99| 在线一区二区三区视频 | 午夜在线视频一区二区区别 | 精品综合久久 | 国产三级精品三级在专区 | 九九色精品 | 多男一女一级淫片免费播放口 | 天堂中文在线播放 | 欧洲精品一区 | 91精品久久久久久久91蜜桃 | 国产色视频一区二区三区qq号 | 日本人做爰大片免费网站 | 国产极品一区二区 | 婷婷久久五月 | 美女国内精品自产拍在线播放 | 日本添下边视频全过程 | 久久久国产精品亚洲一区 | 久久久无码人妻精品一区 | 亚洲天堂成人在线视频 | 播五月婷婷 | 成人小视频在线免费观看 | 亚洲精品久久久久久久不卡四虎 | 成人性生交大片免费看96 | 国产91在线观看丝袜 | 成人免费视频一区二区三区 | 欧美精品一区二区三区在线 | 咪咪色图| 国产特级毛片aaaaaa高潮流水 | 久久久1| 亚洲风情亚aⅴ在线发布 | 日韩在线视频网站 | 久久亚洲色一区二区三区 | 26uuu亚洲国产欧美日韩 | 奇米第四色777 | 乌克兰少妇xxxx做受野外 | 中文字幕专区高清在线观看 | 91美女吸乳羞羞网站 | 国产精选免费进入 | 丝袜美腿一区二区三区 | 国产午夜精品一区二区三区不卡 | 成人做爰9片免费视频 | 三个男吃我奶头一边一个视频 | 亚洲视频国产精品 | 国产精品99久久久久的智能播放 | 亚洲黄网在线 | 久久国产乱子伦精品 | 99精品国产在热久久婷婷 | 福利一区二区三区视频在线观看 | 真多人做人爱视频高清免费 | 国产精品久久福利 | 欧美精品韩国精品 | 偷窥自拍青青草 | 色呦呦在线观看视频 | 四虎免费久久 | 国产原创精品 | 麻豆国产一区二区三区四区 | 亚洲最大成人综合网720p | 伊人久久精品一区二区三区 | 亚洲乱码在线观看 | 中文字幕在线精品中文字幕导入 | 国精产品一区一区三区有限公司 | 九九黄色 | 好吊妞国产欧美日韩免费观看网站 | 亚洲九九 | 精品人妻大屁股白浆无码 | 久久精品女人的天堂av | 外国成人 | 在线观看人成视频免费 | 亚洲日日射 | 国产精品看片 | 国产麻豆一精品一av一免费 | www.超碰| 日本丰满少妇xxxx | 亚洲国产精品无码久久久秋霞1 | 欧美人动与zoxxxx乱 | 久久精品一区二区三区四区 | 亚洲日韩男人网在线 | 大度亲吻原声视频在线观看 | 在线精品亚洲观看不卡欧 | 成人性生交大片免费看- | 麻豆亚洲精品 | 国产md视频一区二区三区 | 中文字幕人妻丝袜二区 | 特级毛片a片久久久久久 | 伊人网在线视频观看 | 亚洲精品久久久狠狠狠爱 | 啪在线视频 | 中国小鲜肉xvideoscom | 91福利视频在线 | 新版本天堂资源在线中文8的特点 | 九色porny丨国产首页在线 | 91在线看视频 | 国产欧美一区二区精品性色 | 懂色av一区二区三区四区五区 | 中国女人真人一级毛片 | 中文在线最新版天堂 | www中文字幕在线观看 | 最新最近中文字幕 | 国产精品黄在线观看免费软件 | 新狼窝色av性久久久久久 | 日韩欧美亚洲天堂 | 欧美18videosex性欧美黑吊 | 国产农村乱对白刺激视频 | 免费线上av | 99久久国产综合精品1 | 一二三区在线 | 理论片午午伦夜理片影院 | 中文字幕精品国产 | 国产在线播 | 永久免费无码av网站在线观看 | 做爰吃奶全过程免费的网站 | 日本大尺度激情做爰电2022 | 激情伦成人综合小说 | 亚洲天堂毛片 | 台湾佬成人中文网222vvv | 一本色道久久综合亚洲精品不卡 | 亚洲伦理99热久久 | 性xxx欧美| 超碰男人的天堂 | 九色视频偷拍少妇的秘密 | 动漫av纯肉无码免费播放 | 天天干夜夜拍 | 国产免费又色又爽粗视频 | 巨大乳做爰视频在线看 | 中文无套内谢少妇视频 | 蜜乳av一区二区三区 | 最近免费中文字幕大全免费版视频 | 欧美人与性动交a欧美精品 欧美人与性动交xxⅹxx | 偷拍一区二区三区在线婷婷 | 欧美日韩国产二区 | 日韩片在线观看 | 亚洲九色| 最新视频 - x88av| 亚洲ⅴ国产v天堂a无码二区 | 91久草视频| 中文字幕精品一区二区2021年 | 日韩欧美一 | 夜夜嗨av一区二区三区四区 | 国产一级视频免费播放 | 波多野结衣在线视频免费观看 | 777午夜福利理论电影网 | 97国产精品一区二区 | 国产日韩在线免费观看 | 欧美真人性野外做爰 | 无翼乌口工全彩无遮挡h全彩 | aaaaa级少妇高潮大片免费看 | 国产精品一二三四区 | 国产91在线高潮白浆在线观看 | 嘿嘿射在线观看 | 国产熟妇久久777777 | 毛片网站在线观看 | 中文不卡在线 | 日韩伊人久久 | 91在线网站 | 亚洲精品综合五月久久小说 | 全黄性性激高免费视频 | 本田岬高潮一区二区三区 | 国产精品毛片久久久久久久 | 国产精品久久久久影院色老大 | 国产精品短视频 | 国产精品7777777 | 日韩手机看片 | 中文字幕亚洲色妞精品天堂 | 欧美你懂得 | 99精品在线播放 | 天天爱天天做天天爽夜夜揉 | av观看在线观看 | 欧美与黑人午夜性猛交久久久 | 天堂一区在线 | 欧美精品黑人粗大 | 国产精品岛国久久久久久久久红粉 | 小向美奈子在线观看 | 久久天天躁夜夜躁狠狠85麻豆 | 在线观看视频区 | 天堂а√8在线最新版在线 大地资源中文第三页 | 日本少妇激情25p | 日本免费一级片 | 国产xxxxxxxxx| 亚洲天堂导航 | 欧美黑人性xxx猛交 欧美黑人一区二区 | 一级a性色生活片毛片 | 看片国产 | 岛国福利视频 | 全部av―极品视觉盛宴 | 日本在线视频一区 | 亚洲中文字幕久久无码精品 | 国产免费踩踏调教视频 | 久久网亚洲 | 在线一区av| 少妇熟女高潮流白浆 | 在线资源观看va | 97人人模人人爽人人喊0 | 亚洲 另类 在线 欧美 制服 | 日本aⅴ片| 久久蜜桃av一区精品变态类天堂 | 亚洲蜜臀av乱码久久精品蜜桃 | 午夜精品影院 | 免费人妻无码不卡中文字幕18禁 | 久久人人爽人人爽人人 | 五月天婷婷在线视频 | 人妖精品videosex性欧美 | 青青青免费视频在线 | 污网在线看 | 久操热久操| 亚洲国产精品久久久久秋霞蜜臀 | 五月婷婷网站 | 18禁真人抽搐一进一出在线 | 国产在线不卡一区二区三区 | 欧美丰满熟妇xx猛交 | 国产一区二区三区不卡av | 91刺激视频 | 成人亚洲综合av天堂 | 欧美sm视频 | 亚洲国产精品一区二区成人片国内 | 伊人久久影视 | 少妇被躁爽到高潮无码文 | 91超薄丝袜肉丝一区二区 | 亚洲无av在线中文字幕 | 亚洲高清aⅴ日本欧美视频 国产suv精品一区二区69 | 久久久麻豆精品一区二区 | 桥本有菜免费av一区二区三区 | 懂色av中文字幕 | 欧美成人午夜77777 | 97天天干 | 精品人伦一区二区三区 | 日日av拍夜夜添久久免费 | 久久久久一区二区三区四区 | 俄罗斯乱妇 | 亚州视频一区二区三区 | 国产精品成人久久 | 国产精品高潮露脸在线观看 | 亚洲精品国产剧情久久9191 | 久草中文在线观看 | 麻豆私人影院 | 很嫩很紧直喷白浆h | 欧美精品在欧美一区二区少妇 | 中文字幕乱视频 | 成人污污视频 | 久草免费资源 | 亚洲免费资源 | 午夜视频在线观看一区二区 | 国产熟女一区二区三区五月婷 | 久久久妇女 | 国产精品毛片久久久久久久 | 亚洲成人第一 | 91中文字日产乱幕4区 | 国产精品分类 | 日本一区视频在线观看 | 久久久久久久久女人体 | 一品二品三品中文字幕 | 日本老熟欧美老熟妇 | 欧美一级特黄视频 | 女人脱了内裤趴开腿让男躁 | 日韩视频 中文字幕 | 国产性生大片免费观看性 | 精品亚洲欧美无人区乱码 | 国内精品视频一区二区三区 | 91成人欧美| 精品久久影院 | 美女张开腿黄网站免费 | 日韩精品一卡 | 日韩网红少妇无码视频香港 | 久久视频在线免费观看 | 公妇乱偷在线播放 | 欧美网站免费 | 色极品影院 | 亚洲一区二区 | 欧美特一级 | 欧美亚洲日韩国产人成在线播放 | 一区二区三区久久久久 | 国产精品女同一区二区软件 | 日韩一片| 国产精品久久久久久久久久久久久久久 | 免费超爽视频在线观看 | 97超碰人人模人人人爽人人爱 | 懂色av中文字幕 | 亚洲第一综合天堂另类专 | 97人人爽人人澡人人精品 | 久久一区精品 | 日本三级生活片 | 性啪啪chinese东北女人 | 狠狠色狠狠色综合日日92 | 黄色毛片毛茸茸 | 忘忧草精品久久久久久久高清 | 日本免费高清视频 | 精品一区二区三区四区视频 | 成人日韩精品 | 91精品国产91久久久久久吃药 | 欧美xxxxbbb| 国精产品999国精产品官网 | 成人开心网 | 99久久精品一区二区三区 | 久久久久少妇 | 国产精品成人网站 | 国产三区在线播放 | 精品国产福利在线 | 波多野吉衣久久 | 少妇做爰免费视频网站色黄 | 在线视频中文 | 午夜尤物丰满大乳美女 | 九九久久国产 | 日韩视频免费观看高清 | 夜夜春很很躁夜夜躁 | 成人网ww555视频免费看 | 久久人人爽人人爽人人片亞洲 | 国产精品乱子乱xxxx | 欧美日韩国产免费观看 | 无码中文字幕波多野结衣 | 天堂mv在线mv免费mv香蕉 | 欧美性受xxxx黑人猛交 | 聚色视频| 亚洲精品久久久久久下一站 | 国产黄色片免费看 | 国产欧美久久一区二区三区 | av一区二区三区四区 | av三级在线播放 | 亚洲第一av网站 | 特级大胆西西4444人体 | 精品视频一区二区三区在线观看 | 中文幕无线码中文字蜜桃 | 开心激情久久 | 国产在线精品一区二区不卡麻豆 | 少妇无套内谢久久久久 | 少妇一区二区三区 | 2019中文字幕在线 | 人妻少妇偷人精品无码 | 亚洲午夜精品久久久久久浪潮 | 大学生女人三级在线播放 | 少妇边打电话边呻吟在线91 | 久久视频在线观看 | 国产毛片毛片 | 爱插视频 | 国产一区二区三区精品视频 | 日韩人妻精品无码一区二区三区 | 综合久久国产 | 国产成人自拍网 | 日韩一卡2卡3卡4卡2021免费观看国色天香 | 中文字幕视频一区 | 爽欲亲伦97部 | 衣服被扒开强摸双乳18禁网站 | 国产精品视频yjizz免费 | 国产极品在线观看 | 国产女人18毛片水真多18 | 欧洲女人牲交性开放视频 | 五月天久久久 | 亚洲欲| 一区二区激情日韩五月天 | 狠狠色丁香久久婷婷综合五月 | 亚洲精品久久久口爆吞精 | 顶级黄色片 | 在线不卡日本v二区到六区 免费又黄又爽又猛的毛片 特级西西人体444www高清大胆 | 亚洲精品无码午夜福利中文字幕 | 第一福利丝瓜av导航 | 九九热免费观看 | 天天夜碰日日摸日日澡性色av | 久久久午夜精品福利内容 | 有声小说 成人专区 | 国产男女猛烈无遮挡免费视频 | 香蕉视频网页版 | 成人视品 | 黄色5级片| 国产精品乱码一区二区三 | 狠狠色噜噜狠狠狠狠色综合网 | 狠狠色噜噜狠狠狠狠7777米奇 | 日韩免费一区二区三区 | 青青草视频偷拍 | 香蕉国产在线视频 | 国产综合免费视频 | 国产成人精品无码片区在线观看 | 亚洲中文字幕无码一区 | 亚洲毛片儿 | 亚洲在线中文字幕 | 老头糟蹋新婚少妇系列小说 | 欧美尿交 magnet | 精品国产91久久久久久久 | www.国产黄色 | 亚洲婷婷丁香 | 国内偷拍精品视频 | 久久久国产亚洲 | 青青青青青操 | 国产老熟妇精品观看 | 精品无人国产偷自产在线 | 欧美三级小说 | 高潮毛片无遮挡高清免费视频网站 | 成人午夜激情视频 | 无码人妻精品一区二区三区免费 | 公妇乱淫1~6集全观看不了啦 | 国产精品无码av一区二区三区 | 国产无套粉嫩白浆 | 亚洲精品成a人在线观看 | mm131丰满少妇人体欣赏图 | 美女久久久久久久久 | 精品国产18久久久久久依依影院 | 我们2018在线观看免费版高清 | 国产女上位 | 夜夜躁很很躁日日躁麻豆 | 女人张开腿让男人桶个爽 | 实拍澡堂美女洗澡av | 日本午夜在线视频 | 亚洲精品久久久无码一区二区 | www99日本精品片com | 邻居少妇张开腿让我爽了一夜 | 成人黄色性视频 | 久久人人爽人人爽人人片ⅴ | 日韩亚洲精品视频 | 一区二区乱子伦在线播放 | 香蕉精品视频在线观看 | 亚洲精品久久久久久久久久久久久久 | 99re国产视频 | 国变精品美女久久久久av爽 | 国产在线不卡精品网站 | 一级黄色毛片播放 | 步兵在线一区二区三区 | 亚洲欧洲综合av | 一品二品三品中文字幕 | 蜜桃av网站 | 综合激情五月综合激情五月激情1 | 四虎国产精品永久在线 | 精品免费一区 | 亚洲第一视频在线 | 国产精品高潮呻吟视频 | 色香蕉av| 成人av高清在线观看 | 自拍偷拍欧美亚洲 | 深夜国产视频 | 免费黄色在线网址 | 天天干天天摸天天操 | 天天色综合6 | 亚洲欧美999 | 在线精品国产一区二区三区 | 国产又色又爽又黄又免费文章 | 精品国产依人香蕉在线精品 | 中文字幕手机在线视频 | 日本特黄特黄刺激大片 | 999久久久国产精品消防器材 | 国产xx视频 | 91久久精品一区二区二区 | 中文人妻av久久人妻18 | 国产成人精品一区二三区 | 光棍影院一区二区 | 久久福利在线 | 97夜夜澡人人双人人人喊 | 侵犯亲女在线播放视频 | 国产淫片av片久久久久久 | 亚洲成a | 欧美天天爽| 欧美乱妇狂野欧美在线视频 | 亚洲人成亚洲人成在线观看 | 色一情一乱一伦一区二区三区日本 | 久久www免费人成一看片 | 国产成人网 | 亚洲一区二区在线播放相泽 | 大肉大捧一进一出好爽视频mba | 亚洲色成人一区二区三区小说 | 亚洲视频在线免费看 | 国产特级全黄一级97毛片 | 亚洲欧美日韩偷拍 | 白色丝袜美女羞羞av | 欧美黑吊大战白妞 | 国产高清不卡无码视频 | 亚洲人成人网 | 综合人妻久久一区二区精品 | 在线精品亚洲一区二区佐佐木明希 | 国产卡一卡二卡三无线乱码新区 | 你懂的网址在线播放 | 52avavjizz亚洲精品 | 午夜影视av| 成人在线高清视频 | 超级乱淫视频 | 欧美日韩在线高清 | 日本a√在线观看 | 青青草一区二区 | 青青青青青青草 | 性猛交富婆╳xxx乱大交麻豆 | 夜色福利| 男女一边摸一边做爽视频 | 噜噜色综合噜噜色噜噜色 | 好大好硬好爽免费视频 | 日本成人在线免费观看 | 国产色爽 | 好男人www社区 | 性欧美在线视频 | 免费看国产曰批40分钟 | 俺也去婷婷| 久久美女性网 | 亚洲精品乱码久久久久久不卡 | 国产精品九九九九九 | 亚洲蜜桃v妇女 | 国产欧美精品一区二区三区 | 国产精品日产欧美久久久久 | 偷拍综合网 | 伊人久久大香线 | www黄色在线观看 | 亚洲美女激情视频 | 97国产超碰| 无人区码一码二码w358cc | 国产交换配乱淫视频a免费 国产精成人品免费观看 | 精区一品二品星空传媒 | 三级av免费看 | 自拍欧美亚洲 | 亚洲一级二级三级 | 国产超碰91人人做人人爽 | 婷婷五综合 | 欧美v视频 | a免费网站免费观看 | 日本japanese丰满白浆 | 亚洲国产成人久久精品软件 | 日韩精品久久久久久久电影蜜臀 | 九九综合视频 | 精品美女久久久久 | 国产精品国产三级国产aⅴ下载 | 国产精品美女一区二区视频 | 精品国产乱码久久久久久丨区2区 | 亚洲熟妇无码av在线播放 | 永久免费观看片在线现看 | 亚洲无圣光 | 免费69视频 | 多啪视频 | 黄色小视频免费看 | 乱码av午夜噜噜噜噜动漫 | 女人喷潮完整视频 | 免费国产黄线在线观看 | 欧美野外做受又粗又硬 | 国产免费一区 | 成人乱淫av日日摸夜夜爽 | 新婚夜第一次深深挺进 | 国产成人av免费 | 亚洲精品久久久久中文字幕m男 | 欧美色呦呦 | 中文字幕乱码中文乱码b站 中文字幕毛片 | 波多野结衣电车痴汉 | 夜夜爽日日澡人人添 | 99精品欧美一区二区 | 国产特级毛片aaaaaaa高清 | 夜夜高潮次次欢爽av女 | 女人的黄色片 | 中文字幕丰满伦子无码 | 国产交换配乱婬视频 | 午夜免费观看视频 | 香港三日三级少妇三级99 | 国产亚洲精品久久久久四川人 | 亚洲欧洲一区 | 久久久999久久久 | 亚洲精品久久久狠狠狠爱 | 久久99热这里只频精品6 | 一区二区三区在线 | 网站 | 99精品中文字幕 | 久久视频国产 | 国产男女裸体做爰爽爽 | 色综合另类小说图片区 | 久久综合九色综合欧美狠狠 | 91免费视频| 亚洲人成人无码www 国产亚洲精品久久久久秋霞 | www.色com情11 | 色噜噜一区二区 | 北京富婆泄欲对白 | 视频一区二区三区免费 | 国产69久久精品成人看 | 91中文啦|