文章

顯示從 7月, 2016 起發佈的文章

[應用] 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 系統的話,則必須用 ND

[應用] STM32F373 控制板之自我測試程式

圖片
        這次為了某個控制器的案子,製作 120片STM32F373控制板,如圖一所示。從 PCB 製版到打件的過程,最終製作好的板子可能會出現不良,可能是元件不良,可能是打件不良,可能是 PCB 銅線斷了....等等。這些不良品如果要單靠手工一步一步挑出來,花費的時間將會很長,所以最好能靠板子本身的一些功能,設計一套自我測試的方法。 圖一:STM32F373控制板         STM32F373控制板上有 Flash 晶片、各有13組 DI / DO、兩組 AI 和一組 AO、包含 RS-232 和  RS485,如圖三右半圖所示。自我測試的概念,可參考圖三的方塊圖。要達到自我測試的功能,我先設計一塊測試電路板 (如圖二所示),這塊板子上面將 13組 DI 和 DO 對應自環起來 (loopback),再把 AI / AO 也自環。而 RS-232 和 RS-485 也可以對接,只要將 TX接對方的 RX,RX 接對方的 TX。剩下一個 AI,則設計一個可變電阻來測試它。         除了設計測試板之外,STM32上面也要寫一套自我測試的韌體。DI / DO 的跑馬燈,韌體先對第一個 DO 輸出,當第一個 DI 偵測到後,韌體再對第二個 DO 輸出。以此類推,DI / DO 就會如跑馬燈一樣一路往下走。假設有 DO 元件壞了,那麼 DI 就偵測不到變化,跑馬燈就跑不下去了,同理 DI 線路有問題的話,跑馬燈也會停止。         AI / AO 的自我測試,韌體會對 AO 輸出固定數值,每隔一段時間便增加數值,直到最大值。再從最大值往下遞減,直到最低值,以此反覆。因為 AO 的輸出,我們可以從 AI 偵測到數值的變化,藉這個方式驗證 AI / AO 元件與線路是否正常。如果 AO 元件有問題,AI 將偵測不到數值的變化,同理 AI 元件有問題,則數值將無法穩定遞增或遞減。         RS-232 / RS-485 的自我測試,韌體對 RS-232 送出一組字串,再檢查 RS-485 這邊有沒有收到。同樣地,RS-485 送出另一組字串,再觀察 RS-232 這邊有沒有收到。如果相關元件壞掉或者電路斷線的話,我們就能很快挑出有問題的板子。 圖二:測試電路板與待測的控制板 圖三