7688 Duo 與亞馬遜物聯網服務實作 (三):AWS IoT Arduino Yún SDK

本篇接續「7688 Duo 與亞馬遜物聯網服務實作 (二):建立 AWS IoT 元件」一文,繼續介紹 AWS IoT,此系列的內容節錄自本團隊的將要出版的新書《7688 Duo 雲端應用手冊(暫定)》中,本書目前在校稿階段,最後出版內容可能會有些許不同。

亞馬遜IoT開發套件(AWS IoT Arduino Yún SDK)

AWS IoT 提供了以C語言為基礎的開發套件(Software Development Kit, SDK) 供我們使用, 此開發套件可直接支援三個平台:Arduino Yún、嵌入式C (供Linux 以及其他即時作業系統使用)、以及JavaScript runtime 套件(給有支援Node.js的平台使用)。7688本身可使用任一個SDK,不過由於 7688 Duo 相容於 Arduino Yún,這裡我們就以其作為主要工具,這也是為什麼我們在上一節在產生憑證與金鑰時請您選擇Arduino Yún。請至AWS Arduino Yún 的Github上下載最新的SDK:

https://github.com/aws/aws-iot-device-sdk-arduino-yun/

在畫面中選取複製或下載 (Clone or download),選擇「下載壓縮檔 (Download ZIP)」,如圖8-11所示,下載完後請解壓縮至桌面。

aws11

圖 8-11 下載AWS Arduino Yún SDK。

接著我們要複製憑證以及金鑰到SDK的目錄中, 除了您從AWS取得的私人金鑰以及憑證外,我們還需要 AWS IoT的數位憑證認證機構(Certificate Authority) 憑證檔,此檔案可從賽門鐵克 (Symantec,防毒軟體供應商) 的網站上下載:

https://www.symantec.com/content/en/us/enterprise/verisign/roots/VeriSign-Class%203-Public-Primary-Certification-Authority-G5.pem

(Google 短網址: https://goo.gl/inXOhV)

請將此檔案另儲存為 root-CA.crt,並將其連同私人金鑰以及憑證複製到資料夾 AWS-IoT-Arduino-Yun-SDK/AWS-IoT-Python-Runtime/certs/ 。由於 AWS IoT Arduino Yún SDK 使用到了 Yún Bridge 函式庫,我們需要登入7688 Duo 並啟用它以及一些相關設定。7688已經將這些相關設定全部集合起來內建於一個 UCI 設定檔中,所以我們只要啟用它即可。請開啟終端機或是 PuTTY ,並 ssh 至 7688 Duo:

>ssh root@mylinkit.local

接下來啟用UCI設定檔並重新啟動7688 Duo:

>uci set yunbridge.config.disabled=’0′

>uci commit

>reboot

在7688重啟後,我們就可以開始來安裝SDK了,以下分不同的作業系統介紹:

Mac OS/Linux

開啟終端機,將目錄指到SDK資料夾 AWS-IoT-Arduino-Yun-SDK,並使用 chmod 指令更改批次檔 AWSIoTArduinoYunInstallAll.sh 的權限,以確保它可以正常執行:

>cd AWS-IoT-Arduino-Yun-SDK

>chmod 755 AWSIoTArduinoYunInstallAll.sh

接下來我們就可以執行該批次檔,此檔案會自動幫我們在7688 Duo上下載與安裝所有我們需要的套件 (distribute, python-openssl, pip, AWSIoTPythonSDKv1.0.0)。請確保7688 Duo與你的電腦都已連上同一個網路:

>./AWSIoTArduinoYunInstallAll.sh <IP 位置> <使用者名稱> <密碼>

其中 IP 位置使用 mylinkit.local 即可。這個指令會需要幾分鐘的時間完成,在過程中您會看到畫面不斷跑出個套件的安裝進度。在安裝完成前請不要關掉終端機。

小筆記:UCI 系統

UCI 是 “Unified Configuration Interface”的縮寫,為OpenWrt的中央設定工具。基本上,所有的重要設定都透過它完成,而這些設定通常都攸關系統的主要功能。UCI常出現在路由器或是其他嵌入式裝置的網路介面裡,也就是說,這些裝置在預設情況下應該都要有已經建立好的UCI設定。

最後安裝Arduino 函式庫。複製資料夾 AWS-IoT-Arduino-Yun-SDK/AWS-IoT-Arduino-Yun-Library 到您安裝Arduino函式庫的地方,Mac OS 上預設為Documents/Arduino/libraries。複製完成後重新啟動Arduino,您就可以看到AWS IoT的範例。

之後若是您想要上傳新的憑證與金鑰檔到7688 Duo,除了自己使用scp指令外,也可以透過執行批次檔 AWSIoTArduinoYunScp.sh,用法如下:

>./AWSIoTArduinoYunScp.sh <IP 位置> <使用者名稱> <密碼> <檔案> <目的地>

記得終端機路徑要先切換到 AWS-IoT-Arduino-Yun-SDK。使用這個批次檔的好處是它可以幫您上傳整個目錄,所以您可以直接上傳整個certs 資料夾:

>./AWSIoTArduinoYunScp.sh mylinkit.local root <密碼> ./AWS-IoT-Python-Runtime/certs /root/AWS-IoT-Python-Runtime/

Windows

在安裝之前,請先安裝 WinSCP。WinSCP 是在Windows中使用SSH的開放原始碼的圖形化程式,提供SFTP用戶端 。WinSCP同時也支援SCP通訊協定。它主要的功能是安全的在電腦間傳輸檔案。安裝完後,使用它將AWS-IoT-Python-Runtime/ 資料夾上傳到7688 Duo的根目錄。記得憑證、私人金鑰以及數位憑證必須已在 certs資料夾裡。

接著使用PuTTY ssh到7688 Duo,並執行以下指令以安裝SDK以及相關套件:

>opkg update

>opkg install distribute

>opkg install python-openssl

>easy_install pip pip install AWSIoTPythonSDK==1.0.0

此步驟會需要幾分鐘的時間完成。最後,複製資料夾 AWS-IoT-Arduino-Yun-SDK/AWS-IoT-Arduino-Yun-Library 到您安裝Arduino函式庫的地方 ,完成後重新啟動Arduino,您就可以看到AWS IoT的範例。

上傳資料至AWS

AWS IoT Arduino Yún SDK 提供了三個範例,這裡我們介紹其中一個範例:BasicPubSub。此範例示範了一個簡單的 MQTT 發布以及訂閱功能,您可以透過這個範例來測試7688 Duo是否真的可以連上您的 AWS IoT元件。

當您開啟BasicPubSub時,您會看到同時還有一個標頭檔aws_iot_config.h也被開啟。您必須貼上之前在AWS上取得的程式碼 (圖 8-10) ,取代此標頭檔的第21-27行,以讓7688 Duo順利連上AWS,如圖 8-12所示。如前所述,這段程式碼定義了裝置、憑證以及協定的名稱。

aws12

 

圖 8-12 在aws_iot_config.h貼上裝置的連線資訊。

接下來介紹此程式與SDK有關的語法,之後若是您要撰寫自己的程式,這些都是必要步驟。

  • 宣告一個 AWS IoT 的 MQTT用戶端
aws_iot_mqtt_client myClient;
  • 在 setup() 裡,設定Serial 通訊,並連線至AWS,若是有錯誤則顯示到 Serial monitor上
Serial.begin(115200);
...
if((rc = myClient.setup(AWS_IOT_CLIENT_ID)) == 0) {
// Load user configuration
if((rc = myClient.config(AWS_IOT_MQTT_HOST, ... == 0) {
// Use default connect: 60 sec for keepalive
if((rc = myClient.connect()) == 0) {
success_connect = true;
...
}
else {...}
}
else {...}
}
else {...}
...
  • 同樣在setup(),訂閱一個MQTT主題「topic1」並等待幾秒,若是有錯誤同樣會顯示。
if((rc = myClient.subscribe("topic1", 1, msg_callback)) != 0) {
Serial.println(F("Subscribe failed!"));
Serial.println(rc);
}
delay(2000);
  • 在loop() 裡,每隔5秒使用publish指令發布訊息到所訂閱的主題中,並使用yield指令檢查所訂閱主題回傳的訊息。此指令另外還會檢查連線狀態以及釋放多餘的資源,若是迴圈上傳資料的時間間隔大於十秒,在這十秒內您必須至少呼叫yield指令兩次,以維持連線穩定。
sprintf(msg, "new message %d", cnt);
if((rc = myClient.publish("topic1", msg, strlen(msg), 1, false)) != 0) {
Serial.println(F("Publish failed!"));
Serial.println(rc);
}
if((rc = myClient.yield()) != 0) {
Serial.println(F("Yield failed!"));
Serial.println(rc);
}
...
delay(5000);

若是您在執行程式時看到錯誤代碼 -1,請試著重新上傳程式到7688 Duo裡。若是收到其他錯誤代碼,那表示您的AWS IoT環境沒有建立好,請檢查您是否有漏掉前面所提到的步驟。

發佈留言

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