作者:阿海
俗話說的好:『人在江湖混,難免會被捅一刀』,阿海過去曾在物聯網專案部署前,明明已經測了上千萬遍的程式碼,人到了現場,卻還是發生問題,如果專案部署數量只有一兩台,那還是小事情,但是像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架構圖
首先,先將專案主程式放進系統,並能在系統啟動時自動執行,我們先將它放進開機啟動表 rc.local 中,步驟如下:
步驟5 – 重新開機
接下來,將未來要更新的檔案放到網際網路上,這邊阿海放到 dropbox 上來簡單展示,這邊一共要放上三個檔案:
- main2.py (這是要置換的OpenWRT端主程式)
- newversion.hex
- version.info (這是說明本次更新的檔案清單路徑和各檔案的MD5驗證碼)
如果使用 7688 Duo 來發展專案那麼 Arduino 端要更新時可能也得一併操作。
前兩個檔案置放完後,就可以在 Dropbox 上取得公開的連結,這時繼續編寫第三個檔案。
為了未來擴充方便,這邊格式阿海使用 JSON 來編排。
再來就是燒錄一下 7688 Duo 上 Arduino 的『舊版』程式,以及看一下舊版的執行結果,稍待才能驗證我們真的有更新成功。

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

舊版Arduino執行結果

本範例流程圖

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

kill主程式並且置換新的主程式檔案後重新啟動系統
接下來,將檔案上傳到 LinkIt 7688 來執行看看結果如何。
來看看新的 Arduino 端的輸出結果,如果是正確的版本,那整個更新就算是大功告成了!

新Arduino輸出結果
最後確認程式可行之後將 ota.py 透過 crontab 置入系統排程,讓系統每隔一段時間就能夠自動檢查是否需要更新,此處設定為每週一的凌晨將會自動檢查是否需要更新,但是如果你真的裝置很多節點,建議你想辦法錯開時間,不然就自己 DDOS 攻擊自己了。
![[步驟1]登入mylinkit.local](http://makerpro.cc/wp-content/uploads/2015/12/22-登入mylinkit.jpg)
步驟1 – 登入mylinkit.local
![[步驟2]呼叫crontab 編輯界面](http://makerpro.cc/wp-content/uploads/2015/12/23-步驟2呼叫crontab-編輯界面.jpg)
步驟2 – 呼叫crontab 編輯界面
步驟3 – 按『 i 』進入編輯器開始編輯內文,之後按 『esc』退出 『:wq!』 寫入 crontab 有其使用的格式,本範例為每週一0:00分來執行
![[步驟3]在命令列鍵入:crontab -l 確認crontab寫入成功](http://makerpro.cc/wp-content/uploads/2015/12/25-步驟3在命令列鍵入:crontab-l-確認crontab寫入成功.jpg)
步驟3 – 在命令列鍵入:crontab-l 確認crontab寫入成功
以上就完成線上更新的基本功能了,今天就先講到這邊吧,阿海水電工要來去烘水管了。
( 程式碼 ) :avrdude -c linuxgpio -C /etc/avrdude.conf -p m32u4 -U flash:w:/etc/arduino/Caterina-smart7688.hex -Uflash:w:$1 $2
- 【LASS實作】用7688 Duo遠端控制PM2.5偵測裝置 - 2016/01/29
- 【Tutorial】如何為LinkIt 7688/Duo開發案進行線上更新 - 2015/12/29
訂閱MakerPRO知識充電報
與40000位開發者一同掌握科技創新的技術資訊!