2020年12月5日 星期六

二•2 設計一使用Google App. Inventor 開發之-- Dweet.io雲端網站測試APP

      IoT物聯網的架構中由於受限於網路IP資源與網路通訊方式的限制因此所謂的雲端(Cloud)伺服器這個中介裝置就變成一個重要不可或缺的設備但是也因此衍伸出不少限制因為在網路通訊的世界裡基本上就是由發主動發出請求的客戶端(Client)裝置及接受請求的伺服器(Server)裝置這兩種角色所構成一般來說客戶端(Client)裝置才能發出請求伺服器(Server)端則只能被動接受請求以我們的系統來說在使用雲端中介伺服器之後不管是主控端或是被控端(例如前一節範例的ESP8266)這時候都必須執行客戶端(Client)裝置的角色了!

        當我們的ESP8266等元件執行客戶端(Client)裝置的角色時,我們就不可能在上面撰寫網頁程式,也就是說便無法像之前介紹過的AP單機模式或WiFi網路模式那樣,把一些人機介面或操作方法直接以網站網頁的方式供連線者使用。而在主控端除非剛好有可用的APP(例如瀏覽器)可用,否則這時候我們就需要另外設計應用的APP程式了!不過由於主控端可能是電腦(PC或筆電)或行動通訊裝置(如手機或平板電腦等),這時我們就會面臨這些裝置所使用的軟體操作系統(OS)為何﹖是微軟的Windows﹖還是AppleiOS﹖還是第三方的Linux系統這些問題在在都增加了開發者的難度與成本。

        因為一般人的開發硬體還以使用Windows的個人電腦為大宗所以目前市面上要開發設計手機的應用APP程式最容易入門也成本最低的大概就是由Google所開發的App Inventer(因為已經升級到第二版了一般簡稱為AI2)不過這個軟體所開發出來的APP只能針對使用Android系統的手機

接下來的這一個單元打算使用AI2設計一個簡單的Dweet.io網站測試程式以便測試我們設計的ESPXX物聯網系統動作是否正常

在進入Google AI2之後先開啟一個新的專案(Project)名稱請自訂然後在畫面布局設計(Design)開發環境下完成下面的頁面

在這個程式中共使用了

1.     4個水平布局元件HorizontalArrangement

2.     4個標記元件Label

3.     2個文字輸入盒TextBox

4.     3個按鈕Button

5.     1個網路元件Web

6.     1個時鐘元件Clock

7.     1個通知器元件Notifier



上列這些元件在手機螢幕上的相關位置如下圖所示



下圖是使用模擬器執行之後的畫面在左邊的手機模擬器畫面中標記1是用來輸入要上傳或下載的IoT物件名稱輸入文字盒名稱為「txbIoTName」標記2是啟動自動讀取感測器DHT11測量結果的按鈕名稱為「getDHT11」(按鈕標題為開始讀取DHT11)標記3是輸入自動讀取DHT11的間隔時間文字盒名稱為「txbTimerInt」標記4是讀取或下載標記1所輸入的IoT物件啟動按鈕名稱為「getDweets」(按鈕顯示標題為接收dweets)而標記5則是顯示接收自Dweet.io網站的回應訊息或下載資料的標記元件其名稱為「dweetPayload」標記6名稱為「sendDweets」(按鈕標題為送出)的按鈕則是啟動上傳資料到Dweet.io網站之用上傳的IoT物件名稱共用由標記1文字盒輸入的內容而上傳的內容則是由標記7「txbDweets」文字盒所提供



如果我們要以手動的方式讀取前一節範例中由ESP6266所上傳名稱為『ESP_DHT11』的DHT11溫/濕度的測量結果則可如下圖所示首先在標記1的文字盒「txbIoTName」中輸入『ESP_DHT11』這個IoT物件名稱後按下標記2的「接收dweets」按鈕便可以在標記3這個名稱為「dweetPayload」的標記元件區域中看到由Dweet.io所送回來的結果了。


至於這個「接收dweets」按鈕的程式方塊(Block)則如下圖所示,當這個按鈕被按下時,程式會先檢查使用者是否有在標記1的文字盒「txbIoTName」中輸入要下載的IoT物件名稱[1]也就是說文字盒「txbIoTName」的輸入內容不能是空白,至於名稱是否正確那就不是我們能處理的範圍了!如果輸入是空白則程式會由Notifier1送出短暫的警告訊息[不要忘了輸入IoT名稱!] [2]。

如果輸入正常則程式會將此IoT物件名稱和前面介紹過的Dweet.io雲端網站下載指令也就是


http://dweet.io/get/latest/dweet/for/


組合打包後指派給Web1的Url[3]然後再呼叫Web1的Get】處理副程式[4]Dweet.io雲端網站將結果回傳給程式時會觸發Web1的GetText事件這時我們再啟動”Web1.GetText”事件處理方塊[5] (即下圖中的最下方處),在此程式方塊中會將Dweet.io雲端網站回傳的回應碼(responseCode)與回傳內容(responseContent)分別交由「dweetRC」與「myThing」這兩個全域變數傳送給原來呼叫的按鈕程式去處理[6]

接著程式會先判斷這次的請求及回傳過程是否正常﹖即回應碼是否為「200」[7]﹖如果是則將接收到的完整的訊息內容顯示在「dweetPayload」這個標記元件區域中[8]。如果有錯,則會顯示[接收錯誤!錯誤碼為:XXX]的訊息[9],其中的”XXX”即為傳送或接收錯誤的回應碼(responseCode)。



如果想啟動自動讀取感測器DHT11測量結果的功能則可按下標題為「開始讀取DHT11」的按鈕,當程式開始執行時如下圖左邊手機模擬器畫面的標記1所示這個按鈕的標題會先切換為「停止讀取DHT11且文字的顏色也會改成藍色除此之外由於程式會定時自動去Dweet.io雲端網站讀取資料為了避免跟其他的動作衝突這時標記3名稱為「getDweets」(顯示標題為接收dweets)及標記4名稱為「sendDweets」(按鈕標題為送出)這兩個按鈕會被禁能(disable)按鈕 

當自動下載讀取指令送出之後,在等待的過程中標記2這個用來負責顯示回應接收訊息的標記元件「dweetPayload」區域中,會先出現[DHT11讀取中…]的提示訊息等Dweet.io雲端網站回應到來時標記元件「dweetPayload」的內容會如下圖右邊畫面標記5所示先是接收到的量測結果其中的訊息內容包括本程式已經從Dweet.io雲端網站讀取的次數這個DHT11的編號以及量測到的溫/溼度值

至於標記6名稱為「txbTimerInt」的文字盒則是用來輸入自動讀取DHT11感測器的測量間隔時間其單位是以秒計;在程式啟動後的預設值為10秒由於Dweet.io雲端網站跟我們的距離是未知數應該是在遙遠的天涯海角因為路途遙遠即使是電磁波由於要經過許多關卡來回也是要花一些時間所以不要期望能馬上就能看到結果也就是說即使設定為1秒可能也要等一段時間才會收到回應所以建議最小值不要小於5秒以免因為短時間內重複發送太多次反而造成雍塞而產生錯誤




標題為「開始讀取DHT11」的自動讀取感測器DHT11按鈕,其程式方塊如下圖所示在一開始同樣的有防呆的功能會先去測試名稱為「txbTimerInt」這個用來輸入自動讀取DHT11感測器的測量間隔時間文字盒內容是否為空白[1]﹖如果是則會由Notifier1送出短暫的警告訊息[請輸入讀取時間值!] [2],由於這個輸入文字盒已經設定屬性為僅能輸入數字(NumberOnly)但使用者還是可以輸入負號”-“和”0”所以我們發現這些輸入值都必須發出不同的警告訊息提醒使用者請他們再次輸入以免程式當掉或是出現不可預期的錯誤[3][4]

由於這個按鈕是一魚兩吃同時具備開始與停止自動讀取的功能至於是執行那一種動作在此是以它的標題文字來決定如果按鈕的標題為「開始讀取DHT11代表開始啟動自動讀取的功能[5]而這個功能主要是靠時鐘元件『Clock1』來完成在此主要是先將「getDweets」(顯示標題為接收dweets)及「sendDweets」(按鈕標題為送出)這兩個按鈕禁能(Disable) [6]並把按鈕本身的標題改為「停止讀取DHT11[7]然後依照使用者輸入的讀取時間去設定『Clock1』的動作時間(TimerInterval) [8]接著讓回應接收訊息的標記元件「dweetPayload」區域顯示[DHT11讀取中…]的提示訊息[9]最後一個步驟才啟動時鐘『Clock1』也就是讓他的「Enabled」屬性設定為”true”10

如果按鈕是停止自動讀取的功能則程式會先將時鐘計時動作停下來[11]然後將按鈕的標題恢復為「開始讀取DHT11[12]最後讓標題為接收dweets送出」的這兩個按鈕重新啟用(Enabled=true) [13]


接下來讓我們看一下時鐘Clock1計時器(Timer)程式方塊的內容首先將顯示接收回應訊息的標記元件「dweetPayload」內容清空[1]然後將Dweet.io雲端網站下載指令指派給Web1的Url[2]然後再呼叫網路元件Web1的Get】處理副程式等待Dweet.io雲端網站的回應[3]

Dweet.io雲端網站將結果回傳之後同樣先判斷這次的請求及回傳過程是否正常﹖即回應碼(responseCode)是否為「200」[4]﹖如果有錯,則會顯示[接收錯誤!錯誤碼為:XXX]的訊息[10]。假如接收正確便開始將相關的訊息顯示在標記元件「dweetPayload」內首先是顯示本程式已經從Dweet.io雲端網站讀取和下載的次數[5]、[6]再來是這個DHT11的編號[7] ,接著是量測到的濕度值[8] ,最後是溫度值[9]



為了後面的遠端輸出控制範例本測試程式預先加入手動輸出控制的功能如下圖所示便是這個功能的使用畫面;當要上傳資料到Dweet.io雲端網站時先在標記1的文字盒內輸入這筆資料的IoT物件名稱以圖中的內容為例即為「ESP_LEDS_Control」;接著在標記2的文字盒內輸入要上傳的資料內容後按下標記3標題為「送出」的按鈕即可。只要網路有正常的傳輸不管結果是否正確,Dweet.io雲端網站的回應內容都會顯示在標記4的標記元件「dweetPayload」內。







標題為送出」的「sendDweets」按鈕,其程式方塊如下圖所示程式一樣先檢查使用者是否有在文字盒「txbIoTName」中輸入要下載的IoT物件名稱是否為空白[1]如果輸入是空白則程式會由Notifier1送出短暫的警告訊息[不要忘了輸入IoT名稱!] [2]。

如果輸入正常則程式會將此IoT物件名稱和前面介紹過的Dweet.io雲端網站下載指令組合打包後指派給Web1的Url[3]然後再呼叫Web1的Get】處理副程式[4]Dweet.io雲端網站將結果回傳給程式時會觸發Web1的GetText事件這時我們再啟動”Web1.GetText”事件處理方塊[5] (即下圖中的最下方處),在此程式方塊中會將Dweet.io雲端網站回傳的回應碼(responseCode)與回傳內容(responseContent)分別交由「dweetRC」與「myThing」這兩個全域變數傳送給原來呼叫的按鈕程式去處理[6]

接著程式會先判斷這次的請求過程是否正常﹖即回應碼是否為「200」[7]﹖如果是則將接收到的完整的訊息內容顯示在「dweetPayload」這個標記元件區域中[8]。如果有錯,則會顯示[接收錯誤!錯誤碼為:XXX]的訊息[9],其中的”XXX”即為傳送或接收錯誤的回應碼(responseCode)。




沒有留言:

張貼留言