SIP Voip 在 Android 系統的開發

        大約二十年前,VoIP 網路電話技術如火如荼地發展,隨著 Ethernet 網路越來越成熟,網路品質也越來越穩定,辦公室的桌上話機逐漸被網路電話所取代,當時的思科 (Cisco) 就是網路界的霸主。當時我們開發網路話機是以 embedded system 為架構的設計,如圖四所示,搭配 CTI 伺服器組成一套辦公室的電話系統解決方案。

       近年來,隨著智慧型手機逐漸普及化,無線網路 (WiFi) 和行動數據的頻寬與通訊品質大幅提升,出現了許多軟體電話 (Soft Phone) 的 APP。其實,這些軟體電話也是網路電話的一種,從過去的桌上型網路電話,進化成行動型網路電話。軟體電話也存在很久了,過去主要安裝在 PC 上,但因為使用者操作起來並不像網路話機的方便,早些年這種安裝在 PC 上的軟體電話多半不流行。拜智慧型手機的快速發展之賜,軟體電話找到發展的空間,像 LINE、微信...等社群軟體都內建網路或視訊電話。本文最後有桌上型的網路電路與手機上的軟體網路電話之影片操作。

        最近我開始研究 Android 系統與程式開發,並且打算把過去在 embedded system 的網路電話代碼移植到手機系統上。過去開發網路電話的程式代碼都是以 C/C++ 語言為主,然而 Android APP 卻多以 Java 語法為主,在本人的Android NDK 開發的初體驗」一文中,我找到如何將 C/C++ 程式碼移植到 Android 系統的方法。一般 Android 開發以 Java 為主,只需安裝 JDK 編譯環境,但為了整合 C/C++ 的代碼,我們必須安裝 NDK 的編譯環境。下圖一所示是 JDK 與 NDK 在系統開發的架構圖,Java 與 C/C++ 之間存在一個溝通的介面,稱為 JNI (Java Native Interface)。

        為何使用 NDK?在 [1] 有段文章提到,「如果應用領域是系統底層的硬件管理,圖像處理或者遊戲開發,這些更加注重實時性和程序效率的應用,將會考慮使用 Native 編程」。另外一點,多數的 open source 都以 C/C++ 語法所開發而且幾乎相容於 Linux 環境,若想要移植到 Android 系統的話,則必須用 NDK 方式。

圖一:Java 與 Native 的架構圖

        安裝 JDK 與 NDK 之後,我開始從桌上的網路電話 C/C++ 代碼移植到 Android 開發環境,下圖二所示是整合 SIP 程式碼 (放在 jni 目錄下),有關使用者介者的 Java 程式碼則放在 src 目錄下。在 jni 下,我下載了開放源碼 ortp 0.25 和 mediastreamer 2.12 整合到 SIP Voip 裡面,主要處理 RTP 封包與語音處理的部分

圖二:SIP Voip 的專案


       下圖三所示是 APP 的使用者操作介面 (UI - User Interface),這是 Android 的畫面排版檔案,而這部分是以 Java 語法編程的。每個按鍵透過 JNI 介面將按鍵碼傳到底層的 C/C++ 中,而 APP 上方的 LCD 小螢幕顯示則是從底層傳上來的訊息,也是經由 JNI 介面來通訊。

圖三:Android 的主畫面排板

圖四:嵌入式系統的 VoIP 話機

       最後,我用這個 APP 和桌上型網路話機來測試,底下影片是兩邊互相撥打的過程。第一步先從 APP 撥打網路話機,接通後,因為兩邊放置太靠近而產生了 echo,然後掛斷。第二步從網路話機撥打到 APP 端,接通後再掛斷,操作過程驗證雙向通話是成功的。

操作影片

參考資料

[1] Android 應用開發從入門到精通,人民郵電出版社
[2] Linphone open source VOIP project,http://www.linphone.org/

留言

這個網誌中的熱門文章

Android APP 藍芽範例說明 -- BluetoothChat

Android APP BLE範例程式 -- BluetoothLeGatt

三軸重力加速計 Accelerometer