從程式人角度看Arduino這類開發板與相關電路模組,實際上可視為軟體的延伸,它們使得開發者可以與實體世界的資訊做連結,近來IoT概念興起,開啟了這類連結更多可能性。

姑且不論IoT背後一些被炒作的概念,網路應用程式開發,本就是程式人擅長之領域,若可以透過網路控制開發板,實際上就給了軟體開發者更多的可能性,而在實現這些可能性時,現階段無論軟硬體,都有非常多的資源可供選擇。

Arduino與Web伺服器

如果想透過瀏覽器來控制Arduino,基本上要有個Web伺服器進行請求處理與回應,若Arduino硬體上沒有網路支援(例如單純使用Arduion Uno),可透過電腦來運行Web伺服器,再由Web伺服器與Arduino進行溝通。

目前來說,有現成的一些軟體具有這類功能,像是為了降低孩子們接觸Arduino困難的S4A(Scratch for Arduino),就內建有Web伺服器(命名為遠端感應器),可透過瀏覽器傳送請求給Web伺服器,訊息在Scratch中以廣播方式,讓訂閱對應訊息的程式積木可以進行相關流程,例如,讓Arduino角色的積木,可以控制LED的開與關。

透過S4A內建的Web伺服器作代理,解決了自行撰寫伺服器的問題,不過,在網頁操作時的使用者介面設計上,必須自行處理,在網路上有幾個名稱同為WebDuino的專案,其中node-webduino是基於node.js實現,它使用http模組來建立Web伺服器,並使用socketstream作為Web框架,實現了現成的網頁操作介面,當然,因為操作介面本身就是HTML、JavaScript、CSS組成,讓前端工程師,可以只使用前端技術,就作出讓網頁(以及行動裝置)與Arduino互動的應用程式。

實際上,電腦上建立的Web伺服器是作為代理(Proxy),當接收到瀏覽器請求時,處理並轉發訊息給Arduino,在Arduino官方網站最新的Interfacing with Other Software文件中,提供了各種軟體與Arduino互動的方式,而電腦與Arduino的溝通方式,基本上是透過serial頻道,如果開發者熟悉某個語言,可以基於該語言,實現自己的Web伺服器。

比方說,在Arduino官方網站〈Arduino + Python〉文件中,提供了Python如何透過pySerial從Arduino讀取資料,以及如何將資料傳送給Arduino的範例,因而,開發者可以使用Python建立一個簡單的Web伺服器,結合pySerial,就可以實現一個透過瀏覽器,讀取相關感應器資訊,或者是設定Arduino相關腳位的應用程式。

當然,並不是每個語言,都能提供與serial頻道溝通的功能(像是Flash),這時可以透過現成的代理伺服器程式,例如在Arduino官方網站上的〈Serial-to-Network Proxies〉,就提供各種代理程式,有些本身很簡單並提供原始碼,像是〈JavaProxy〉,如果開發者熟悉Java,可以基於它來做與Arduino的進一步整合;實際上,若從不懂node.js的前端工程師角度來看,方才介紹的node-webduino,就是一種代理伺服器程式。

硬體上的網路支援

顯然地,無論透過以上何種方式,都得有個電腦執行Web伺服器,而Arduino板子必須與電腦銜接,如果想要獨立地運行Arduino,那麼Arduino板子就必須有硬體上的網路功能支援,這可以透過外接網路模組,或者使用內建網路連線能力的Arduino板子來達成。

舉例來說,在Arduino官方網站〈Web Server〉文件中,介紹了如何在Arduino Uno加上Arduino Ethernet Shield這塊板子之後,以Ethernet程式庫建立網路伺服器,Arduino Ethernet Shield必須透過有線網路連結,如果要透過無線網路,可以在Arduino Uno加上Arduino WiFi Shield,在Arduino官方網站〈WiFi Web Server〉文件中,就有如何透過Wifi程式庫建立網路伺服器的相關介紹;另一個也常見的ESP8266 WiFi模組,也有對應方式建立伺服器。

如果想在Wiznet-based Ethernet shields(像是Arduino Ethernet Shield)上頭,建立功能更豐富的Web伺服器,可以使用GitHub上sirleech/Webduino,這是個名稱同為WebDuino的專案,它進一步提供了JSON/RESTful介面,以及HTTP Basic Authentication等功能。

如果想要同時具備有線與無線功能,可以使用Arduino Yún這塊板子,除了提供有線與無線網路之外,這塊版子本身具有兩個微控制器,其中一個運行Linux發行套件Linino,這表示開發者可以在上頭運行Linux的各種功能,像是用Python寫好程式,在Linino上安裝,然後使用Arduino官方語言來呼叫。

使用Arduino Yún的話,可以透過YunServer程式庫建立Web伺服器,開發者基於這個伺服器設計REST API,比方說,可以設計為透過瀏覽器直接呼叫arduino.local/arduino/digital/13/1時,在Arduino執行digitalWrite(13, HIGH),或是呼叫arduino.local/arduino/robot/turnright時,讓Arduino機器人右轉。

雲端IoT服務

Arduino硬體資源有限,雖然可以在板子上直接運行Web伺服器,但想要將所有功能都放上去是不可能的,目前有不少雲端服務,提供了應用程式常用的後端功能,可以將感應器的資料傳送至這類服務提供的IoT伺服器,由它們來記錄、儲存資料。

以Thingspeak為例,開發者可以為某個Arduino設備建立Channel,設定要儲存的資料欄位,取得API Key,之後就可以透過API Key與對應的欄位值,以HTTP方法將感應器的資料發送至Channel並儲存。

有些雲端服務更進一步地,提供了各種語言的API,而且提供了快速建立App的流程,例如開發者熟悉的Parse,在建立App並取得Application ID與Client Key之後,還提供了線上測試範例,開發者也可以直接複製程式碼加入自己的專案之中。

Parse日前在Facebook的F8開發人員年度會議上,發布了Parse for IoT,直接提供了對Arduino的支援(目前第一塊支援的板子是Arduino Yún),讓使用Arduino的開發者更為方便。

實際上,Arduino Yún是Temboo與Arduino聯合開發的板子,自然地,Temboo提供了對Arduino Yún最直接的支援,Temboo提供與多種熱門網路服務的連結,開發者可以將資料發布至Google試算表,或者是Twitter等服務,除了GitHub、Google Docs、Gmail、Twitter、Facebook等服務的串接之外,Temboo也提供了與Parse的API整合。

務實的物物相聯

當然,就現今IoT概念中,希望進一步做到的一點,是能夠物物相聯,每個物品與另一個物品直接溝通,而不單只是由人透過Web來操作相關設備。

以S4A的作法為參考的話,可以由一臺電腦當作廣播伺服器,而其他電腦連接至廣播伺服器,這麼一來,任一臺電腦發出廣播訊息,其他電腦都能收到,從而使得與電腦連接的各個Arduino設備,可以實現彼此溝通的效果,在不使用S4A的情況下,也可以使用熟悉的語言來實現類似的概念。

至於Arduino板子銜接網路模組,或者是直接使用Arduino Yún,由於本身具備網路功能,只要透過相對應的網路程式庫,就可以做到彼此溝通。

就現今而言,想要讓Arduino(或其他開發板)能結合網路,無論是軟體、硬體模組或者是後端服務,幾乎就是一個要什麼有什麼的狀態,而且都包裝為簡便易用的軟體介面,姑且不論IoT背後有一些被炒作的概念(像是BigData等),程式人可以透過網路控制板子,真的就可以玩好多東西,因此,下次如果又想到「若是能直接透過網路控制某個物品就好了」的時候,那就動手試試看吧!

作者簡介


Advertisement

更多 iThome相關內容