2013年12月11日 星期三

用Spark.function()自定REST API

前一篇有提到, TINKER API提供的四個功能都是很基本的, 如果只靠那四個, 那Spark cloud的負荷會很大, 想像一下, 如果說要做一台遙控車, 把馬達控制的程式都寫在遠端, 那需要發出多少命令? 如果REST API只是負責來發前進, 後退, 轉彎, 其他如該輸出多少給馬達或哪個腳位這類的邏輯留在core上面, 這樣的設計就會顯得合理多了
所幸Spark其實有考慮到這問題, 只是目前的文件真的很殘缺, 還真很難找到相關資料, 這問題的答案就是:
Spark.function()
這函數的作用在於對應core上的函數以及自定的REST API:
這函數第一個參數是REST命令的名字, 第二個則是處理這命令的函數, 相當簡單

(From: http://julianshen.tumblr.com/post/69702065061/spark-function-rest-api)

2013年12月8日 星期日

Spark core & Spark cloud

image

Spark core跟一般Arduino不同, 它並沒有一個在PC上的IDE供你寫及編譯程式, 這動作完全是在雲端, 開發者在Web IDE上攥寫程式, 之後server會去編譯並下載firmware到Spark core端執行

明明電腦跟Spark core都在眼前, 但程式卻不是在眼前編譯反而繞了一段路從Spark cloud下來, 感覺是有點多此一舉, 但其實Spark cloud的功能不僅於此, 它還提供了一個叫TINKER的服務

TINKER分為兩部分, 一個是手機上的TINKER APP

image

這App的用途就是讓你可以在不用寫任何一行程式的情況下, 就可以測試你的Spark core, 它背後的作法就是發送REST API, 也就是另一部分, 所謂的TINKER API, 到Spark cloud上, Spark cloud在把對應的命令轉到core上面, 由於core設定只要一打開就會連上網連到Spark cloud上, 因此可以用如此的方式控制它

因為可以透過TINKER API來控制core, 加上TINKER API也是公開的REST API, 因此, 我們未必要用Arduino的程式寫法來控制core, 我們也可以透過TINKER API用自己想用的程式語言來做開發

以以下的閃爍LED當做例子:

image

以傳統Arduino的寫法, 這樣一個程式(這範例應該老到掉牙了), 應該是這樣的:

跟C有點像, 當然啦,你不用期待它有啥多執行緒(Multiple threading), 或是啥事件驅動(event driven)等等東西可以用啦, 基本上它也是編譯好跑在Spark core上, core並沒有強大的運算能力跟複雜的硬體可以搞這麼複雜的東西, 有一點要注意的是, 這樣一個程式從Spark cloud燒錄到core去, 原本的TINKER就會被取代而失效, 必須由TINKER APP重新燒錄

至於說到TINKER API, 由於是REST API, 因此你可以用你習慣的語言去包裝, 不管是java, javascript, 或是go也好, 包裝它相當容易, 基本上目前也只有四個API: digitalwrite, digitalread, analogread, analogwrite

我包裝了Node.js跟Go可以使用的版本, 需要的人可以直接取用:

  1. Node.js module: https://github.com/julianshen/SparkCoreJs
  2. Go: https://github.com/julianshen/SparkGo

如果改用了Node.js或是Go, 那這個閃爍程式該如何寫?

Node.js:

這邊就可以把原本用"delay"的方式改用javascript中的setTimeout來實作

Go:

Go這邊則就是用了Tick

Access token跟device ID其實是可以去你的Web IDE上查到的

透過TINKER API, 這樣程式就不用一定得要"on board"去執行, 而且使用的程式語言也不會有侷限, 但缺點是, 首先要考慮到網路所造成的時間差問題, 另一個問題是, 現在提供的API像是digitalread這樣的API都非常的基本, 如果所有程式全部放在遠端, 遠端程式就必須要很頻繁的透過Spark cloud來發號司令, 如果連上Spark cloud的core越多, Spark cloud的負擔就相當可觀, 如果能提供custom command或custom api的方式, 把部分常態的邏輯變成在core端執行的內儲程序被呼叫, 或許可以減輕些Spark cloud的負擔

2013年12月7日 星期六

Spark core

image
前天回家發現一包順豐快遞的包裹, 心想, 我又沒去淘寶或對岸訂啥東西, 怎會有那邊來的包裹, 拿起來仔細一看, 這不是我之前在Kickstarter上Back那個叫Spark core的project嗎? (http://www.kickstarter.com/projects/sparkdevices/spark-core-wi-fi-for-everything-arduino-compatible?ref=home_social)
雖然依稀記得前幾天收到它開始出貨的消息, 可是後來完全忘了這一回事了, 這也是目前我第一個也是唯一在Kickstarter上back的東西
這是一個很有趣的產品, 也完全開放, open source, https://github.com/spark , 一開始看到盒子就讓我有點些許驚艷的感覺, 一打開, 原來這這麼小一片(還附片麵包版, 真是貼心), 用的則是TI CC3000MOD
image
這顆Chip有個比較有趣的功能就是 Smart Config (http://processors.wiki.ti.com/index.php/CC3000_Smart_Config), 有點不是很了它背後的機制, 不過這機制讓Spark core很容易的就可以設定好Wifi, Spark core本身沒任何的介面, 所以在設定Wifi hotspot跟Wifi密碼是一個大問題, Smart Config解決了這個問題, 所以你可以在手機上很輕易的輸入你要用的hotspot跟密碼, 接著Spark core就很神奇的連上hotspot, 然後連上Spark cloud, 這之間, Spark core根本也不需要跟你的手機透過藍芽或任何方式先連線, 不過手機這時候是必須使用Wifi而不是連上3G, 對於這種小型裝置來說, 這的確是一個很方便的方式
Spark core還有一個蠻聰明的部分, 那就是Spark cloud, 當他連上wifi時, 他就會嘗試連上Spark cloud, 在第一次設定時, 會先嘗試做註冊的動作, 把Spark core跟你的Spark帳號連結在一起, 不過我一開始不是很順利, 看起來Spark core已經順利連上Spark cloud, 但卻一直沒跟我帳號連結在一起, 這動作搞了我兩天, 多虧熱心的CEO Zach耐心的幫我查問題, 最後透過手動的方式把這搞定了
Spark cloud讓你可以利用他的Web IDE去寫firmware, 然後download到Spark core執行, 甚至, 你也可以不用寫任何程式, 直接透過他的Tinker API (REST), 去對你Spark core上的腳位做如digitalWrite之類的動作, 所以是可以把複雜的邏輯放在遠端
整體來說, 這是蠻有趣的產品, 蠻期待看他的未來的