研究筆記 - LASS on LinkItOne Code Trace

1. 前言

我雖然一直有關注 LASS,但因為工作忙碌,所以一直沒有時間好好研究。直到現在 LASS 已經漸漸發展到一個稍具規模的專案了。這篇文章記錄我在颱風假時邊看邊研究的歷程。主要的重點放在了解程式怎麼運作、以及 "猜測" 背後的設計想法(畢竟工程師很不愛寫文件的 = =)。

1.1. 起手式

  • 資源
  • LASS 的分工算是很精細的,資源整理都做得很不錯。facebook 就是哈拉討論和活動發布。hackpad 上面整理很多文件、資源,以及正在進行中的專案。基本上 hackpad 看 「LASS - README」就夠了,它是一個不錯的入口頁面。

    因為是 code trace,所以我會把重點放在 github。

    1.2. github

    LASS 的 github 名稱是 LinkItONEDevGroup,原因是第一版的 LASS,就是用 LinkItOne 做出來的。現在已經漸漸移植到不同種類的開發板了。目前 github (rev:01e0e13) 上面的資料夾如下:

    1.3. github: Device_LinkItOne

    我想最完整的概念和實作應該還是在 LinkItOne 的版本中。以這個專案當切入點應該不錯!

    1.4. Device_LinkItOne/Libraries

    .

    1.5. code trace tools

    如果要在 Linux 上面 code trace 的話, vim 的 syntax plugin 可以裝。

    2. 主程式 LASS.ino

    2.1. Code Comment Info

    裡面有些資訊,既然它寫很長,表示有詳細的說明先看吧:

  • Board jumper setting:
  • Default Output PIN:
  • Sensor Input PIN:
  • Action Output PIN:
  • Sensor position definition:
  • Note: 這些註解現在還是這樣嗎?

  • Default system sensor order:
  • Default user sensor order:
  • Note: 這些註解現在還是這樣嗎?

  • Default user sensor order in APP-3 (MAPS):
  • Note: 這些註解現在還是這樣嗎?

  • Default Sensor Type:
  • Note: 這些註解現在還是這樣嗎?

  • Optional sample sensor: (幾乎都是 seeedstudio 的 Grove 模組)
  • Note: 其實我不知道那個 AP1,..AP4 代表什麼意思

  • Optional alarm:
  • 2.2. configuration.h

    第一步,先設定 WiFi SSID & PASSWD,預設使用 WPA

    是否使用 Blynk。如果要使用還需要填入 blynk_auth ID

    設定 MQTT,主要是設定 DEVICE_ID

    設定 GPS。設定 FAKE_GPS=1 可以使用假的 GPS 位置傳資料,位置定義於 gps_lat, gps_lon, gps_alt。

    GPS_SIGNAL_NOCHECK: 我猜是要不要檢查 GPS 訊號正常才傳送?

    LASS 設定。APP_ID 分為三種,system/public/provate,有不同的 base number

    要不要發出警訊。包含蜂鳴器和做 MQTT callback

    感測器設定

    這應該是 Arduino 內建特殊功能用的 pin

    這一大段是各個 "APP" 用的。第一個 #if 是 system 用的

    後面 #elif 是各個使用者定義的 public 區塊

    系統其它參數設定。很多,看 code 的時候回來查就好

    2.3. Code Trace呼叫階層關係

  • BLYNK_READ (有一堆 XD)
  • msgCallback(): 由 PubSubClient callback
  • setting_verify(): setting init/save/load (debug 用平常不呼叫)
  • setup()
  • loop()
  • 2.4. 流程 (巨觀)

    setup() 裡判斷 APP_ID 的機制有點像是 profiles,不同的 user 可以自己定義 APP_ID。每個 APP_ID 可以對應不同的 sensors。例如有的人可能使用 DHT22 量測溫溼度,有的人則使用 SHT31。為什麼這樣設計,細節還不是很清楚。

    loop() 從巨觀來看蠻合理的,WiFi 連線 -> 收資料 -> 傳出去,主要大概是這樣。我覺得 logic_select() 和 packInfo() 的作法應該可以更精簡。

    另外,這篇: 如何加入新感測器 也稍微提到了幾個重點 function()

    3. Data Format

    應該要了解到底送了什麼資料出去,以及 LASS 是怎麼規劃資料格式的。

    3.1.  hackpad Ref

     3.2 MQTT Record definition

     

    資料格式從 0.7.3 以後就是下面的樣子 (目前是 0.8.3。看 LASS.ino 的 VER_APP)

    下面直接由 sample 說明。

    前半段是一些 global data:

    下面這兩個跟是否使用 fake GPS 資料有關,奇怪的是 code 裡面用上面的格式。文件說的卻是下面的格式?

    (updated) 這裡有說明 V0.8 後 Fake GPS說明。看起來 FAKE_GPS 才是目前的做法 (跟 code 一樣就對了 XD)

    s_n 是 “sensor type” 由 [type]+[sequence] 組成,目前的格式看起來有兩種:

    GPS 有很多種格式,LASS 使用 GPGGA 當作預設的格式

    總之,最大的傳輸量是 512-1

    3.3. MQTT Topic definition

    MQTT 發布或訂閱時需要知道的 topic name

    3.4. APP_ID

    App Lists 可以看大家上傳檔案的格式。而且這個可以對照 configuration.h 那一堆 APP_ID #ifdef

    概念是每個人的開發板可能都使用不同的 sensors 組合,而有不同的應用。所以這個 “App Lists” 頁面就是用來告訴大家目前的應用 APP(lication) 有哪些,以及該訂閱哪個 MQTT topic。

    APP_ID 由 [application type] 和 [序列 number] 所組成。

  • application type
  • LASS 定義了三種 app type:

    APP_ID 最後的值,會落在三個區間。這三個區間表示他們所屬的 application type

    Note: 如果有新增,必須更新 App Lists

  • 幾個特別的 APP_ID
  • LASS/configuration.h 裡面應該可以看到

    然後 LASS/LASS.ino 又有這一段

    APP_ID==(APPTYPE_SYSTEM_BASE+1) 其實 code 裡面就是 APP_ID=1,因為在 0~255 之間,所以它是一個 System APP。

    看 code 可以知道,通常決定 APP_ID 之後還會決定一個 APP_NAME,APP_ID=1 的 APP_NAME=“PM25”。剛好 mapping 最後的 MQTT topic: LASS/Test/PM25

    APP_ID 還有個比較特別的是 APP_ID=0, 它的 APP_NAME=“Default”,MQTT topic: LASS/Test/Default。它的內容應該只有四個:

    其實正好就是對應到 system sensor 的 s_0, s_1, s_2, s_3, s_4。

    Note: 其實文件中沒提到 s_4 但是 code 裡面有 @@!

    一路看到這邊後,覺得 APP_ID 很奇怪,它似乎不再傳送的 MQTT 封包內容裡? 

    結果剛剛看到這篇: 如何加入新的 APP_ID

    看吧!!!

    3.5. DEVICE_ID

    Device ID 的定義在這: Device ID definition

    編碼格式原則是 LASS-YYY_xxx

    4. Others

    LASS Specification 這份文件提到 LASS 系統巨觀應該提供怎樣的功能。若是想使用非 LinkItOne 的平台,應該儘可能地做到符合 LASS 的 spec.

    ~ END ~