No Code AI(肉寇)AI自動化兩日精通|實體6小時+線上6小時
|

【Tutorial】如何為LinkIt 7688/Duo開發案進行線上更新

   

作者:阿海

俗話說的好:『人在江湖混,難免會被捅一刀』,阿海過去曾在物聯網專案部署前,明明已經測了上千萬遍的程式碼,人到了現場,卻還是發生問題,如果專案部署數量只有一兩台,那還是小事情,但是像LinkIt 這種便宜到你想隨處丟一個的裝置,這時要一一去更新幾百台,就是累累的事情了,遇到這種狀況,線上自動更新就是一個減少人力負擔的辦法,本篇要示範「如何在你的LinkIt 7688 / Duo專案中,實現線上更新的功能」。

欲完成本範例所需要的物品:

  • Linkit 7688 Duo 開發版x1
  • Micro USB傳輸線 x1

(註:本範例完整檔案放置在 LASS的 Github

在繼續下去之前,先來複習一下 LinkIt 7688/Duo 的架構,LinkIt 7688 Duo,是基於 MT7628 MPU 運行 OpenWRT (Linux Based)以及Arduino IDE相容的 ATMEGA 32U2,因此在更新的時候,就得考量這兩個各自的更新方式。

 7688架構圖

7688架構圖

首先,先將專案主程式放進系統,並能在系統啟動時自動執行,我們先將它放進開機啟動表 rc.local 中,步驟如下:

步驟1 - 先將專案主程式傳送到7688目錄中

步驟1 – 先將專案主程式傳送到7688目錄中

步驟2 - ssh登入7688

步驟2 – ssh登入7688

 步驟3 - 切換目錄 vim編輯rc.local

步驟3 – 切換目錄 vim編輯rc.local

步驟4 - chmod 755 使rc.local具有執行權限

步驟4 – chmod 755 使rc.local具有執行權限

步驟5 – 重新開機

步驟6 - 重新登入7688

步驟6 – 重新登入7688

步驟7 - 用top確認你的主程式有運作成功

步驟7 – 用top確認你的主程式有運作成功

用top確認你的主程式有運作成功

用top確認你的主程式有運作成功

接下來,將未來要更新的檔案放到網際網路上,這邊阿海放到 dropbox 上來簡單展示,這邊一共要放上三個檔案:

  1. main2.py (這是要置換的OpenWRT端主程式)
  2. newversion.hex
  3. 如果使用 7688 Duo 來發展專案那麼 Arduino 端要更新時可能也得一併操作。

    取得Dropbox公開連結

    取得Dropbox公開連結

    前兩個檔案置放完後,就可以在 Dropbox 上取得公開的連結,這時繼續編寫第三個檔案。

  4.  version.info (這是說明本次更新的檔案清單路徑和各檔案的MD5驗證碼)

為了未來擴充方便,這邊格式阿海使用 JSON 來編排。

驗證碼version.info

驗證碼version.info

再來就是燒錄一下 7688 Duo 上 Arduino 的『舊版』程式,以及看一下舊版的執行結果,稍待才能驗證我們真的有更新成功。

燒錄舊版

燒錄舊版

這樣範例的環境都搭建好了,接下來就可以撰寫線上更新的程式了, Linux 上能夠 Run 的程式相當的多元,這邊,阿海選擇一個初學者三天就可以學得好的 Python,來撰寫相關程式碼。

舊版Arduino執行結果

舊版Arduino執行結果

本範例流程圖

本範例流程圖

取得更新資訊

取得更新資訊

檢查是否需要更新版本(註:一般要把版本資訊變數放在其他地方)

檢查是否需要更新版本(註:一般要把版本資訊變數放在其他地方)

如果需要更新,透過curl外部指令來下載所需要檔案

如果需要更新,透過curl外部指令來下載所需要檔案

下載完後,直接用MD5碼來確認下載成功還是失敗

下載完後,直接用MD5碼來確認下載成功還是失敗

呼叫AVRDUDE來燒錄Arduino端

呼叫AVRDUDE來燒錄Arduino端

kill主程式並且置換新的主程式檔案後重新啟動系統

kill主程式並且置換新的主程式檔案後重新啟動系統

接下來,將檔案上傳到 LinkIt 7688 來執行看看結果如何。

上傳檔案到Linkit7688

上傳檔案到Linkit7688

OTA執行結果

OTA執行結果

來看看新的 Arduino 端的輸出結果,如果是正確的版本,那整個更新就算是大功告成了!

新Arduino輸出結果

新Arduino輸出結果

最後確認程式可行之後將 ota.py 透過 crontab 置入系統排程,讓系統每隔一段時間就能夠自動檢查是否需要更新,此處設定為每週一的凌晨將會自動檢查是否需要更新,但是如果你真的裝置很多節點,建議你想辦法錯開時間,不然就自己 DDOS 攻擊自己了。

[步驟1]登入mylinkit.local

步驟1 – 登入mylinkit.local

[步驟2]呼叫crontab 編輯界面

步驟2 – 呼叫crontab 編輯界面

步驟3 – 按『 i 』進入編輯器開始編輯內文,之後按 『esc』退出 『:wq!』 寫入 crontab 有其使用的格式,本範例為每週一0:00分來執行

[步驟3]在命令列鍵入:crontab -l 確認crontab寫入成功

步驟3 – 在命令列鍵入:crontab-l 確認crontab寫入成功

以上就完成線上更新的基本功能了,今天就先講到這邊吧,阿海水電工要來去烘水管了。

<備註>:使用 Arduino 輸出建置的 Hex,預設不包含 Bootloader,因此你要是發現,在執行本範例之後將無法繼續使用 Arduino IDE 燒錄,必須要進到 OpenWRT ,燒錄包含 Bootloader 的Blank程式Hex檔。

26-

( 程式碼 ) :avrdude -c linuxgpio -C /etc/avrdude.conf -p m32u4 -U flash:w:/etc/arduino/Caterina-smart7688.hex -Uflash:w:$1 $2

阿海

訂閱MakerPRO知識充電報

與40000位開發者一同掌握科技創新的技術資訊!

Author: 阿海

來自雲林,原本在台北闖蕩物聯網工程數年,後來告老返鄉,目前為水電工。2015年以肉多多多肉植物科技農場首次參展Maker Faire Taipei 2015。目前在LASS公益感測網路開源方案撰寫相關研究和程式碼。

Share This Post On
468 ad

Submit a Comment

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *