跳至主要內容

[應用] 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/
[3] 完整版 OpenTalk 移動分機 APP 下載,www.sequocomm.com 所提供

留言

此網誌的熱門文章

[筆記] Android APP BLE範例程式 -- BluetoothLeGatt

前言        在 Android 裡面的藍芽和低功耗藍芽 (Bluetooth Low Energy) 控制方式不一樣,這裡有一篇文章[連結]說明傳統藍芽與 BLE 有哪些部份不同。此外在 API 方面,很多低功耗藍芽的函式必須在 API level 18 以上才能使用,也就是 Android 4.3平台以上。上一篇介紹的 BluetoothChat 程式是採用傳統的藍芽控制方式,為了讓開發者認識 BLE 如何控制,Android 官方網站提供一個 BLE Gatt 的範例程式,圖一所示是這個範例程式的專案檔,主要的程式檔為 DeviceScanActivity、DeviceControlActivity 和 BluetoothLeService。
圖一:BLE範例程式專案檔

        圖二所示是這個範例的系統方塊圖,從 AndroidManifest.xml 設定檔可得知操作畫面先呼叫 DeviceScanActivity 類別,它衍生自 ListActivity 類別。這 Activity 畫面的 onCreate( ) 函式裡面依舊執行傳統藍芽的檢查:

檢查本身有無藍芽裝置 (參考前一篇 BluetoothChat 的做法)檢查有無 BLE service打開藍芽功能搜尋 BLE 設備        當 DeviceScanActivity 創建出來後,畫面右上方會出現選單,這對應到類別的 option 操作。這裡有兩種選擇:start scan 或 stop scan,如下圖的左邊所示。當搜尋後的結果會列在畫面上,操作者可以從中選一 BLE 設備進行連線,如下圖的右邊所示。透過 Intent 方式開啟 DeviceControlActivity 類別,生成這類別過程會開啟 BluetoothLeService 這個藍芽服務。這裡使用了一個技巧,就是 bind service 的方法,我們把這個 service 類別想像成提供在背景持續工作的服務,而且能提供訊息給 UI 畫面。
圖二:BLE範例的系統方塊圖

搜尋 BLE 設備         搜尋 BLE 設備的方式與傳統藍芽有些不同,第一步都必須取得藍芽配適器 Bluetooth Adapter,不過接下來 BLE 呼叫的函式則不一樣。API分別提供 startLeScan 開始搜尋和 stopL…

[模組] 三軸重力加速計 Accelerometer (GY-61 ADXL335)

模組介紹         三軸重力加速計是一種重力感測器,也稱為加速規或加速計。三軸指的是 X, Y, Z 軸,重力加速度就是我們高中理化曾學過的地心引力 (g)。由於這個重力加速度是地球的天然資源 (就像磁力線的指南針),所以當我們身體傾斜或翻轉時,透過地心引力的影響讓身體內部機構可感受到其傾斜或翻轉。於是,將此概念應用到科技工業上,像電玩的體感遊戲 (Wii, Kinect...)、飛行器、懸臂旋轉、震動感測...等都使用到相關元件,本文針對三軸重力加速計的晶片做測試研究,希望能獲得更多的應用靈感。首先,找一顆晶片試試吧!Arduino 開發套件常見的三軸加速計,使用的是 ADI ADXL335/345 晶片,因此我買了一個來測試玩玩看,並用 NXP LPC1114 晶片來設計系統。
        三軸重力加速計晶片是 MEMS 設計工藝,能將這種感測技術設計到小晶片裡面,不得不佩服這群工程人員。由於地表的重力加速度有方向性,晶片又根據該重力為基準來測量三軸的變化,所以晶片與三軸的方向座標必須先定義好,如下面圖一所示,晶片面朝上為 Z軸。以圖一為例,晶片放置水平,量測到的重力數值為 X 軸 0g, Y 軸 0g, Z軸 1g。然後,該晶片內部再將這三軸的物理量轉換成電壓值輸出。實驗中,我手上拿到的是 ADXL335,它是輸出三軸的電壓值,所以設計系統時需要選用具有 ADC 功能的 MCU ,才能將這三個電壓值轉換回重力值。此外,ADI 還開發另一顆 ADXL345 晶片,與 ADXL335 晶片有些不一樣的地方,前者內部已有包含 ADC 功能,能將重力值直接轉換成數位值,並使用 I2C / SPI 介面和外部通訊,提供使用者不同的選擇。
圖一:晶片的三軸方向座標
規格分析        三軸重力加速計晶片在使用前先要找到 0g 的電壓值,這也是校正歸零的步驟。雖然每顆晶片出廠前都經過測試,但是每顆晶片之間的物理特性還是存在一點點差距,這種差距還算是合理範圍,只是我們必須用校正的方式將它拉到同一標準內,消除這種誤差。底下圖二所示為晶片的規格,當 0g 的時候,電壓輸出是 1.5V,所以我將晶片放成水平後,X/Y軸讀到的電壓約 1.58V 左右,也就是這兩軸差不多為 0g (規格的測試環境是 Vs = 3V,我的環境是 Vs = 3.3V)。接著,看規格裡的靈敏度…

[筆記] Android APP 藍芽範例說明 -- BluetoothChat

準備工作         第一次寫 Android 藍牙連線程式還不知該如何開始 (新手上路),於是先找一本 APP 開發的書吧!也許從書中能獲得一些訊息。之前筆者主要使用的程式語言是 C/C++,所以初次看到 APP 的每個範例都不是很面熟。經過幾周的研讀後,給後進初學者的建議是先準備下列的書和開發環境: Java 8.0 程式語言 ,如果對 Java 語法不熟悉,最好有一本工具書能快速查詢。Android APP 程式設計,學習 UI 如何設計的概念。開發 IDE 環境 Android Studio 1.4 以上Android 官方的開發網站提供不少範例程式,由於先前開發藍牙相關的設備,因此我們從網站下載一個 BluetoothChat 程式來研究,藉此熟悉 Android SDK 來了解如何使用藍牙介面。首先了解一下這個範例有什麼功能,它的功能其實很簡單 (範例就是要簡單才夠力),即透過藍牙通訊在手機或平板上互傳訊息的程式。圖一是範例程式的專案打開後列出相關的檔案,包含設定檔、java程式檔、資源檔。然而主要的程式檔為MainActivity、BluetoothChatFragment、BluetoothChatService、DeviceActivity 這四個,另外還有一些程式檔案是 debug log 的用途,方便我們在 debug 模式下顯示於 IDE 的訊息。不過,初學者可以直接從上述的四個檔案來研究,log 以後有興趣再說。
圖一:範例 BluetoothChat 專案

        下圖二是範例 BluetoothChat 的流程圖,主要是由上述的四個 java 檔案組成的類別。APP 程式一開始先呼叫 MainActivity,這是初學者必須懂的常識,如果不清楚的話,趕緊找本書K一K。當系統呼叫 MainActivity 類別時,該類別會生成一個新的 BluetoothChatFragment,這是一個 Android Fragment 所衍生的類別,關於 fragment 是甚麼?它跟 UI 畫面有關,請參考官方網站的詳細解說。此外,生成 BluetoothChatFragment 的同時也會新生成 BluetoothChatService 類別,這個類別負責藍牙服務的程式模組,也就是從藍牙設備連線到取得通訊 socket 都是由這個類別來…