文章總列表

假日藍芽/Android工程師: 寫個APP讀心跳

我一直很好奇手機是怎麼和心跳表溝通。如果想自己寫個APP做實驗,要搞定三個麻煩:
  • 我不會寫Java
  • 我不會寫Android的GUI程式
  • 我不會寫Android的藍芽程式
寫了幾個禮拜,每次搞定一點。這個主題太大,也不可能寫下所有東西。這篇文章記下學習過程的重要關鍵點。


Android開發環境
幾乎所有Android程式書都有一章在講怎麼安裝開發環境。我選Google包裝好得Eclipse ADT Bundle,抓回來裝好就可以在Windows/MAC上都可以寫程式。用這個環境寫出第一個Android APP非常容易,點一點就可以在手機上跑起來。

書上也有講怎麼用模擬器開發,但我的目標是開發藍芽程式,直接在手機上跑比較實在。


JAVA
我大概10年前有嘗試學Java,接著馬上放棄,大概算99%的新手吧。我的記憶只剩怎麼寫Hello World的程式:

    // hello.java
    public class hello {
        public static void main(String[] args) {
            System.out.println("Hello World");
        }
    }

編譯指令
    javac hello.java

執行指令
    java hello

第一個Java程式會跑之後,就用它測試If-Else,For-Loop,Function-call,FILE-IO,String-processing,很快可以抓到一些Java的感覺。感謝世界上眾多的Java開發者,幾乎什麼問題都找得到答案。用類似這樣的關鍵字"java open file",就找得到資訊了。


Android GUI Programming
Android GUI框架在幕後定義某種流程,在事件發生時呼叫一些callback函數回應事件。使用者的工作就是了解這個框架是怎麼回事,然後提供callback函數回應事件。GUI本身很複雜,在上頭寫程式也很複雜也就不會很意外了。

比如按下畫面上某個按鈕,Android會呼叫onClickListener()。使用者可以在裡面做需要的處理。Java語言在這件事上,還額外增強複雜度,他允許4種方式來寫callback function。(暈倒)

Eclipse開發環境相當進步。他會在背景編譯程式,然後寫錯或著有warning時可以同步給建議。GUI的函數名稱都靠腰長,還好Eclipse有函數名稱補完的功能,不然我經常懷疑有誰能記得"Textview.OnEditorActionListener()"


Android Bluetooth Low Energy Programming
我的參考書Getting Started with Bluetooth Low Energy, O'Reilly有一章很實用,介紹用Bluetooth Application Accelerator來寫藍芽通訊程式。這套程式庫是藍芽官方提供的,把底層介面包裝得簡單一點。這類的通訊協定天生就是不同步(asynchronous),程式庫本身也提供一堆callback function表示什麼事件來到。以下列出我用到的callback functions,列在這裡抓個感覺。
  1. uiDeviceFound()
  2. uiDeviceConnected()
  3. uiDeviceDisconnected()
  4. uiAvailableServices()
  5. uiNewValueForCharacteristic()

Show Time
程式啟動時,如果藍芽沒開,會提示使用者啟動藍芽

主畫面裡,點畫面上方中間的SCAN就會搜尋心跳表。然後就會和GATT server打交道,打開notification功能後,就可以收得到心跳數。數值顯示在畫面左下方,75 bpm。
Eclipse開發環境滿不錯的,程式執行時的log可以很方便觀察。下圖是手機收到BLE裝置送的notification時,onNotify()會被叫起。最後會呼叫到使用者的callback function,然後把心跳顯示在畫面上。

這樣子下次我就可以跟人家豪小說,我也會寫藍芽 + Android開發了 (笑)

留言

這個網誌中的熱門文章

幼犬書桌椅選擇心得 升降桌 兒童桌椅

Herman Miller Aeron 一代氣壓棒維修

STM32 UART + DMA,使用HAL實作TX/RX,以及不定長度接收