假設您已經決定開發一個 IoT 產品。首先,您可以瞭解許多從移動開發演變而來的實踐。具體地講,考慮以下這些實踐:
- 從服務中分離 API
- 迭代式地設計解決方案的原型
- 預測連線問題
化身 (avatar)、服務和解耦的 API
如果您建立過任何型別的 Web 應用程式,那麼您可能已經熟悉服務的概念。服務是應用程式提供的能力,是一個系統的傳統檢視,比如天氣資料服務。
使用此服務的是化身,它們是連線 Internet 的 “事物”(可以是軟體或實體的智慧事物)。然後,這些化身與此服務的一部分或整個服務進行互動。每個化身獨立地與該服務互動,它們聯合在一起會讓服務變得很強大。
我們以天氣資料服務為例。化身可以是一個使用者網站或一個顯示當前天氣讀數的移動應用程式。化身也可以是一個連網的氣象站,它每分鐘都向天氣服務報告資料,共享當前溫度、溼度和風速。
因為當前一代移動服務非常強大(Google 和具體的 Google Now、Facebook、Twitter,以及其他一些使用者應用程式),所以這些服務可通過各種各樣的方式來訪問,比如桌面應用程式、移動網站、特定的應用程式、第三方應用程式,甚至瀏覽器外掛。每個化身都可以根據需要使用盡可能多或儘可能少的服務,以滿足它們一個服務所在的上下文場景的需要。因此,可以將一個 “轉發此連結” 按鈕(一個服務)嵌入在任何網頁(一個化身)上,或者從 Android 上的主螢幕(一個化身)檢視一個搜尋結果列表(另一個服務)。
促成此方法的關鍵是設計擁有容易訪問的 API 的服務,使每個化身都可有效地根據上下文與之互動。
此方法在硬體領域的一個不錯的現代示例是 FitBit。FitBit 擁有一個產品線,它們旨在讓健康情況變得更加可度量。儘管某些產品(例如計步器與樓梯跟蹤器)之間存在著區別,但核心服務是相同的。這些產品聚合來自感測器的與活動相關的資料,並將聚合的資料提供給使用者,使其能根據自己的健康情況制定明智的決策。
從服務角度講,FitBit 提供了以下服務:
- 跟蹤活動資料(型別、持續時間、消耗的卡路里、發生的時間和心率)
- 跟蹤睡眠資料(睡眠和清醒的持續時間)
- 跟蹤卡路里和水的攝入
- 跟蹤體重資料
- 向系統中報告資料
從化身的角度講,不同的化身在 FitBit 裝置上表現出不同的行為:
- 身體健康跟蹤器記錄資訊並將其傳回給服務
- 一個移動應用程式提供聚合的資料的基本檢視
- 一個 Web 應用程式提供更詳細的歷史趨勢檢視
- 第三方系統可將資料推送到該平臺中(比如攝食量)
- 第三方系統可以讀取聚合資料(比如步數),將它們新增到自己的服務中
可以看到,解耦服務和生成優秀的 API 為 FitBit 提供了以下這些好處:
- 服務可以通過不同的化身來表達,從而在不同的位置(您手腕上、口袋裡、桌面上)提供值
- 第三方系統可以通過自己的服務向 FitBit 新增額外的值。
- 隨著移動領域的碎片化(因為更多的公司在與 Apple 競爭),FitBit 可以通過針對任何需要化身的裝置(甚至是 Windows Phone)的應用程式來快速且輕鬆地應對。
這種解耦方法越來越常見,因為應用程式必須同時提供移動和桌面 Web 體驗。如果以類似方式設定您的 IoT 服務,隨著市場機會的出現,您可以將它用於新的方向。
IoT 產品需要軟體和硬體原型
任何構建物理產品的人都知道,您將會從非常簡單的原型著手,根據反饋和它們在真實世界中的效能來不斷地改進它們。IoT 產品更加複雜,還需要設計軟體和網路元素的原型。
考慮可能使用您的 IoT 產品的無數場景時,此挑戰會被放大。它可能是一個感測器,但您如何與它互動?是否通過使用移動或 Web 應用程式?配置是否與報告不同?這些介面有多實用?問題清單似乎列不完。
由於移動環境可能導致上下文更改,從而影響服務實用性的性質,移動產品在應對此挑戰上已有很長的歷史。因此,移動開發通常會從基本的原型開始,隨著原型不斷完善來提供越來越多的真實功能。這個過程通常包含 4 個階段:
- 建立一個簡單的互動式 Web 應用程式,它使用一個開發框架來快速說明互動的核心方面。模擬服務對佔位符內容的所有呼叫,以便足以模擬需要呈現資訊和與之互動的方式。
- 隨著原型的完善,開始整合服務的簡單方面,以便能夠確定響應是否合適,以及是否與上下文相關。
- 開始設計超越功能原型的介面,確保考慮了互動方法、引導需求和反饋
- 繼續完善和整合功能,直到釋出該產品
通過迭代式地設計 IoT 產品的原型,可以確保它具有實用價值,而且整合了您服務的正確方面。請注意,不是每個上下文都需要您服務的每個方面。檢視一個現代移動銀行應用程式,您會看到,除了帳戶餘額和一些支付/轉賬互動之外,通常無法自由使用整個銀行平臺。在移動銀行使用的上下文中,使用者通常只檢查他們是否有足夠的錢來就餐或快速支付賬單。
除了設計 IoT 服務和化身的原型之外,還可以採用迭代方式設計您在產品中使用的硬體的原型:
- 從簡單、現成的硬體開始。儘管每個人都認為 Arduino 是一個業餘愛好者平臺,但實際上它很便宜,而且使用效果很好,足夠可靠地快速生成您可以互動的東西。只需幾美元,您就可以確定您的想法是否有任何價值,無需投資建立自定義系統主機板設計。
- 使用盡可能多的現成元件來完善原型。將它保持在一定的範圍內,以便可以快速拆開重建它。這非常適合通過孔零元件(hole component)和可插拔的模組來設計系統板的原型。使用眾所周知的元件,以便您可以設計原型,而不是迷失在實現細節中。
- 將您的關鍵元件與它們連線到的系統板分開。利用採用了標準協議(比如 I2C 和 SPI)的元件,這意味著您可以將 Arduino 更換為BeagleBone 或 Raspberry Pi。
- 在決定更換硬體之前,儘可能長時間地依靠現有硬體,然後再考慮更換它。
值得注意的是,您可以使用 Raspberry Pi、Arduino、ESP8266 或類似的元件作為 IoT 產品的核心。是的,您有一些很好的理由在需要時使用特定的晶片或系統板。但是,如果建立一個連線 Internet 的花園感測器,ATMEGA328(Arduino 的核心)或 ESP8266 將為您提供足夠的自由空間。通過使用現成元件,您可以獲得已有的規模優勢,以及基本問題已解決的優勢。
如今的硬體很容易實施逆向工程。在 IoT 產品中,價值在服務中,而不在各個化身中。因此,昂貴的、定製設計的硬體元件會提高化身的成本,而不會以有意義的方式增加服務的價值(而且可以拉低您產品的價格)。保持您的元件和控制器板模組化。然後,如果需要遷移到更強大或更昂貴的系統板上,您無需再次從頭構建所有部分。
原型設計的最後一點是,確保您記錄了使用和錯誤細節。此日誌有助於理解系統內有用部分和無用部分,還有助於更快地除錯功能,這在原型設計階段是關鍵的需求。此日誌可以一直保留到生產階段,記下終端使用者在此日誌中遇到的明顯的隱私問題,以及您需要適當解決的問題。
離線優先設計可以解決連線問題
許多生活在大城市(尤其是美國西部城市)的工程師都認為移動和 wifi 網路的普及是理所當然的。這種錯誤假設可能導致您的產品完全無用。現代移動和 Web 開發擁有一種稱為 “離線優先” 的實踐,它旨在構建將能在網路斷開時儘可能正常執行的應用程式。所有特性都可能不可用,但斷開連線和恢復連線需要是一種不會影響到終端使用者的無縫流程。
從移動角度講,這些一般原則用於促進離線優先設計:
- 假設網路可能在任何時刻消失 – 甚至(以及特別是)在傳輸中途消失。
- 更頻繁地使用簡短的訊息,而不是單條龐大的請求和響應。
- 使用本地儲存來緩衝需要通過網路傳輸的訊息。儲存在本地的訊息可在離線時排隊,或者可在發生故障時再次傳送。
- 確保應用程式評估了連線性,而不要期望使用者已經知道連線情況。
- 在幕後提供資料同步機制,比如首先執行系統狀態更新,在以後再同步帶版本的資料(使使用者可以繼續執行自己的任務)。
從 IoT 角度講,上述許多情況都是存在的,但許多感測器裝置都假設永遠連線到 wifi。當然,如果您在人口密度很高的地方(比如香港等大城市中心的住宅建築),可能有 50 – 100 個 wifi 網路在爭用同一個訊號空間(並相互干擾)。任何參加開發人員大會的人都知道,在 200 位開發人員都使用膝上型電腦、平板電腦和行動電話建立了熱點時,wifi 有多可怕。我曾清楚地看到,由於噪音和爭用,很多無線模組拒絕在大會上關聯。
那麼從 IoT 的角度講,您從這些實踐中學到了什麼?考慮這些設計要點:
要進一步瞭解 MQTT,可以閱讀 developerWorks 教程 “探索 IBM Bluemix 上的 MQTT 和物聯網服務”。
- 假設網路隨時可能中斷。
- 首先在本地編寫,然後傳送資料。
- 在服務端,使用 RabbitMQ 等訊息排隊系統來處理您的訊息。
- 使用輕量型和彈性的訊息協議,比如 CoAP 和 MQTT,而不是更重量型的 HTTP。
向服務中構建提醒系統,以便可以診斷某個節點何時斷開網路一定時間。此提醒必須是僅供參考的,且不會干擾使用者(可能因為裝置的電池沒電了而出現提醒)。
隨著更多裝置進入網路空間,網路可靠性無法保證,甚至在家庭網路環境中也是如此。您必須確保離線功能和網路恢復能力是 IoT 開發的關鍵元件。
結束語
在本文中,我介紹了將 API 與服務解耦,如何能幫助建立強大的 IoT 應用程式。另外,通過使用簡單的、模組化的硬體,比如 Arduino 主機板,您可以更輕鬆地開發 IoT 解決方案。最後,通過使用離線優先的移動開發概念,更容易確保您的 IoT 裝置在網路上取得成功。您現在已經很好地瞭解瞭如何將移動開發最佳實踐應用到物聯網 (IoT) 開發中,讓您的 IoT 更有可能取得成功。