天天看點

帶你讀《基于區塊鍊的物聯網項目開發》之二:建立物聯網解決方案第2章

點選檢視第一章

第2章

建立物聯網解決方案

在上一章中,我們探讨了物聯網和IBM Watson物聯網平台。我們還建立了一個簡單的解決方案。在本章中,我們将再建立一個端到端解決方案,從裝置選擇到建立裝置固件和應用,最終實作給花園澆水的自動控制系統。

本章将讨論如下主題:

  • 了解如何建立解決方案。
  • 建立一個連接配接裝置。
  • 建立一個連接配接到平台的簡單應用。
  • 釋出和處理裝置事件。
  • 向裝置釋出行動。
  • 如何擷取幫助。

2.1 技術要求

完整的解決方案代碼在ch2檔案夾中,網址:

https://github.com/PacktPub-lishing/Hands-On-IoT-Solutions-with-Blockchain.git

存儲庫。

确定你已經安裝了Cloud Foundry CLI 和 Bluemix CLI,這些指令行接口的安裝過程詳見網址

https://console.bluemix.net/docs/cli/index.html#overview

2.2 園藝解決方案

澆水系統是物聯網DIY群體常用案例。我們也把它作為我們在IBM Watson物聯網平台啟程的案例。

2.2.1 需求概述

好的解決方案可以真正解決人們的問題,讓我們從對實際問題的了解開始我們的解決方案:

John是個商人,一個人住在城裡的一間較高價的電梯大廈,一周要出差3~4天。在不旅行或不工作的時候,John喜歡照顧他的植物。然而,由于他每周有半個星期不在家,又要保證他的花園健康和美麗,John必須費一番腦筋。

John給花園安裝了自動澆水系統,但是該系統還存在一些問題:要麼是系統在天氣炎熱或幹燥的時候沒有給植物澆足夠的水,要麼是在天氣好的時候水澆多了。

John想知道是否有辦法控制澆水時間,即隻有植物達到一定的土壤水分條件時或者當他認為有必要時,系統才給他的植物澆水。

2.2.2 解決方案概覽

下圖展示了為解決John的問題而開發的解決方案:

帶你讀《基于區塊鍊的物聯網項目開發》之二:建立物聯網解決方案第2章

給John的花園增加一台聯網裝置,該裝置按照設定的程式對土壤濕度和周圍環境溫度進行測量,并将事件釋出給IBM Watson物聯網平台,裝置還能通過訂閱觸發器釋出指令。

在IBM Cloud(Bluemix)上事先部署的應用程式将對John花園裝置發送過來的資料進行判斷,每當達到配置的最低土壤濕度水準或較高的溫度門檻值時,該應用都會發送一個操作指令,在一定時間内為植物澆水。

2.2.3 裝置選擇

根據上一節的方案設計,該項目所選用的裝置必須具有如下功能:

  • 能夠測量土壤濕度(模拟探測儀很适合這種方法)。
  • 具有人機互動能力(這樣使用者就可以在他覺得有必要的時候給花園澆水)。
  • 能夠對土壤濕度進行監測(可配置的規則)。

要實作該解決方案,還要滿足如下條件:

  • 使用者能夠提供Wi-Fi網絡連接配接。
  • 為系統提供電源。
  • 該系統僅供較高價的電梯大廈使用,是以無須遠端連接配接。
  • 搭載的容量與Wi-Fi連接配接無關。

由于我們是在建立實際的裝置之前進行原型化,是以可利用現有原型平台快速建立連接配接和測試。為此,我們可使用功能比較強大且實作子產品化的平台Intel Edison和 Grove。

我們将尋找具有Wi-Fi連接配接和模拟傳感器連接配接的裝置、土壤濕度傳感器、土壤溫度傳感器和水電磁閥等,該解決方案的具體裝置清單如下:

帶你讀《基于區塊鍊的物聯網項目開發》之二:建立物聯網解決方案第2章

下圖概述了在裝置清單中指定的裝置,但裝置的形狀和顔色隻供參考,可能會因供應商、版本或其他特性而有所不同:

帶你讀《基于區塊鍊的物聯網項目開發》之二:建立物聯網解決方案第2章

下面我們快速浏覽一下清單中的裝置

1. Intel Edison系統

Edison是一個晶片系統,基于英特爾x86架構,具有專門為物聯網應用設計的嵌入式藍牙4.0和Wi-Fi。Edison運作名為Yocto的Linux發行版,支援Python、Node.js、C和C++等許多平台,還有用于使用Arduino IDE、Eclipse和Intel XDK開發解決方案的插件。

2. Arduino 拓展闆

Intel 公司釋出了Edison 系統的Arduino擴充闆(breakout board),其中用到的引腳接口(pin interface)與Arduino 子產品用到的引腳接口标準一緻,且與多種Arduino shield擴充版相容。可以使用标準Arduino IDE、相容庫、連接配接器和shield, 是以Intel Edison Arduino擴充闆是一款非常好的Arduino原型操作平台接口。

3. Grove系統

Grove包含一系列元件和shield,它建立了标準化的子產品化平台,其中包含由SeeeD建立的原型解決方案的建構塊。有許多可用的原型,包括可以在網際網路上使用的Grove平台的工作代碼,特别是DIY社群站點上。

Grove系統為市場上大量采用的平台提供了shield,例如Arduino、Raspberry Pi和BeagleBone。可以在網際網路上找到與計算子產品、面包闆、Grove子產品和備件捆綁在一起的包。

注意,并非每個傳感器都與每個平台相容,因為某些平台缺乏某些功能。例如,Raspberry Pi不提供模拟接口,是以通過模拟接口連接配接的傳感器與其不相容。

讓我們看看将作為這個物聯網解決方案的一部分使用的Grove元件。

(1)Arduino Grove面包闆

在本項目中,我們将使用Arduino Grove面包闆(base shield),它提供了一個接口,用于Grove标準的連接配接器,以将Grove子產品連接配接到Arduino引腳接口。它提供4個模拟接口、4個I2C接口、7個數字接口和1個UART接口。

(2)Grove傳感器

在本項目中,我們将使用兩種不同類型的傳感器:土壤濕度傳感器和環境溫度傳感器。

土壤濕度傳感器是模拟探測儀,提供土壤電阻測量,我們稍後将在本章中解釋。溫度傳感器建立在熱敏電阻基礎上,其技術名額和計算方法在2.3.2節也有詳細的介紹。

兩個傳感器都使用标準Grove連接配接器電纜,該電纜提供VCC、GND和到探測儀的資料連接配接。

(3)Grove按鈕

這個按鈕與傳感器一樣連接配接到計算子產品,但提供了開路或閉路狀态,由按鈕控制。

它可以有不同的解釋:當按鈕被按下時,連接配接被中斷,這意味着它在按鈕沒有按下的時候可以繼續做一些事情;或者當按鈕被按下時,連接配接被激活,這意味着它隻在按鈕被按下之後才會做一些事情。

(4)Grove繼電器

繼電器子產品連接配接到标準的Grove接口,由于其不提供讀數功能,是以被歸為執行器。

其他執行器子產品,如LED、顯示器、電機驅動器和蜂鳴器等,用于執行操作,而不是讀取狀态。繼電器子產品也有兩種狀态,開路或閉路,這意味着繼電器的輸入連接配接沒有連接配接到輸出端。

我們對各部分的介紹到此結束,下面繼續讨論解決方案中的下個步驟。

2.2.4 裝置布線

要組裝硬體,我們需要正确地将傳感器探測儀連接配接到處理單元,即Intel Edison子產品。Grove子產品使連接配接非常簡單,如以下步驟所示:

  1. 使用Grove通用電纜:

●将Grove濕度傳感器連接配接到面包闆的A0連接配接插孔上。

●将Grove溫度傳感器連接配接到面包闆的A3連接配接插孔上。

●将Grove繼電器子產品連接配接到面包闆的D2連接配接插孔上。

●将Grove按鈕子產品連接配接到面包闆的D3連接配接插孔上。

  1. 使用跳線:

●将電磁閥的V+端連接配接到外接12V電源。

●将外部GND引腳連接配接到面包闆中的GND引腳上。

●将繼電器連接配接到GND引腳上。

●将電磁閥GND端子與一個繼電器子產品連接配接上。

下圖顯示了正确的連接配接方式:

帶你讀《基于區塊鍊的物聯網項目開發》之二:建立物聯網解決方案第2章

2.3 對裝置固件進行編碼

接下來,我們将建立一個裝置應用(固件)來讀取傳感器資料并将其發送到指定的應用程式。在上一章中,我們使用Node.js從裝置模拟器釋出事件,現在我們将使用這個方法來利用上一章的代碼。記住,這個解決方案的目的是在溫度高或土壤濕度太低時給植物澆水。

下一節将展示建立固件所需的代碼,該代碼将讀取所有傳感器資料并将事件釋出到IBM Watson物聯網平台。

2.3.1 測量土壤濕度

在本項目中采用的傳感器探測儀是一種電阻式傳感器,它測量通過傳感器探測儀的電流。它有兩個被實體分離的探測儀,一個連接配接到正極,另一個連接配接到GND端。當兩個探測儀由一個共同的表面連接配接時,它将測量通過該表面的電流并給我們一個讀數。

在我們的案例中,探測儀接觸土壤時會測量流過的電流。當土壤濕度增加後會變得更易導電,探測儀會探測到更多的電流。

Arduino拓展版中的 Intel Edison模數轉換器(ADC)有12位分辨率,但是通過軟體限制為10位分辨率。如果我們将此作為測量的基礎,我們将得到以下對讀數的了解:

帶你讀《基于區塊鍊的物聯網項目開發》之二:建立物聯網解決方案第2章

這意味着我們的讀數範圍是0~1 023,其中0表示根本沒有水,1 023表示100%的水。當然由于土壤中礦物質等雜質的存在,會影響讀數。但在本方案中,我們暫且忽略這一因素,假設土壤濕度測量是準确的。當它完全幹燥時,其測量值是0%,如果是一杯水,其測量值是100%。

下面代碼目标是每2秒讀取一次土壤濕度傳感器:

帶你讀《基于區塊鍊的物聯網項目開發》之二:建立物聯網解決方案第2章

要運作代碼,請在Edison的SSH控制台中輸入npm start。

為了測試,我們先看看輸出到控制台的傳感器讀數,并對這些資料有一定了解:

帶你讀《基于區塊鍊的物聯網項目開發》之二:建立物聯網解決方案第2章

0代表土壤濕度為0%,1 023代表土壤濕度為100%,利用程式中的樣本測量值這樣計算:

帶你讀《基于區塊鍊的物聯網項目開發》之二:建立物聯網解決方案第2章

利用前面的公式,将測量值轉換為百分比值,如下所示:

帶你讀《基于區塊鍊的物聯網項目開發》之二:建立物聯網解決方案第2章

2.3.2 檢測環境溫度

類似于前面的代碼塊(更複雜一些),溫度傳感器傳回傳感器的模拟讀數。

關于制造商如何讀取傳感器見網址:

http://wiki.seeedstudio.com/Grove-

Temperature-Sensor_V1.2/,我們會發現傳感器v1.2帶有一個值為4 250的熱敏電阻和一個100 k的電阻。

是以,使用該傳感器計算溫度值的公式如下:

帶你讀《基于區塊鍊的物聯網項目開發》之二:建立物聯網解決方案第2章

下面的代碼将根據傳感器的讀數每2秒給出一次溫度:

帶你讀《基于區塊鍊的物聯網項目開發》之二:建立物聯網解決方案第2章
帶你讀《基于區塊鍊的物聯網項目開發》之二:建立物聯網解決方案第2章

此代碼的輸出如下所示:

帶你讀《基于區塊鍊的物聯網項目開發》之二:建立物聯網解決方案第2章

這些讀數主要通過SSH控制台被記錄下來。

2.3.3 打開繼電器

最後,由于我們希望開關繼電器來控制水的流動,在1秒後打開水和2秒後關閉水的代碼如下:

帶你讀《基于區塊鍊的物聯網項目開發》之二:建立物聯網解決方案第2章
帶你讀《基于區塊鍊的物聯網項目開發》之二:建立物聯網解決方案第2章

延遲1秒後,你将看到D3繼電器子產品啟動,你也将聽到一個點選。這意味着繼電器連接配接被關閉,2秒後它将關閉并打開連接配接。

2.3.4 釋出事件

在本章,我們已經研究了Node.js腳本,該腳本能夠同時讀取土壤濕度和溫度,我們還研究了可以打開和關閉讓水流向植物的繼電器的代碼。

現在的目标是将這兩個值釋出到IBM Watson物聯網平台。

如上一章所示,有必要建立一個裝置并記錄憑證,以便我們可以使用它們将裝置連接配接到平台。下面代碼執行正常事件的釋出:

帶你讀《基于區塊鍊的物聯網項目開發》之二:建立物聯網解決方案第2章
帶你讀《基于區塊鍊的物聯網項目開發》之二:建立物聯網解決方案第2章

腳本啟動後,它們将從device.json檔案加載配置,連接配接到IBM Watson物聯網平台,然後每5分鐘釋出一次包含目前土壤濕度和溫度的事件。

2.3.5 監測事件

檢視裝置釋出資料的最簡單方法是使用闆卡。如果在建立卡時保持裝置腳本運作,它将從裝置釋出的資料結構中擷取值。

  1. 若要建立卡,請通路IBM Watson IoT Platform控制台并選擇左側菜單中的面闆:
    帶你讀《基于區塊鍊的物聯網項目開發》之二:建立物聯網解決方案第2章
  2. 在頁面右上方,選擇+Create New Board,按照提示填寫資訊。大多數必須提供的資訊是雜亂無章的,但要確定它對目标使用者是有意義的。在這裡建立的闆是用來顯示植物監測讀數的:
    帶你讀《基于區塊鍊的物聯網項目開發》之二:建立物聯網解決方案第2章

闆是一組相關的卡片,卡片是裝置向平台釋出的一組相關值。

  1. 選擇建立的闆,并通過選擇+Add New Card建立卡片。
  2. 選擇Line chart 裝置可視化按鈕,建立裝置:
    帶你讀《基于區塊鍊的物聯網項目開發》之二:建立物聯網解決方案第2章
  3. 在選擇Line chart卡片之後,需要為事件建立資料源。将建立的裝置作為卡片的資料源。資料源,顧名思義,就是資訊的來源,可以用它和從裝置上收集的度量來填充表格:
    帶你讀《基于區塊鍊的物聯網項目開發》之二:建立物聯網解決方案第2章

6.在對資料源進行選擇處理之後,有必要對将要繪制在圖表上的名額進行選擇。如果裝置已經向IBM Watson物聯網平台釋出了一些事件,則可以使用度量名稱進行選擇編輯。另一方面,如果以前從未運作過裝置代碼,則需要提供度量名稱。建議至少在建立圖表之前測試裝置代碼以避免出錯。

7.在正在開發的解決方案中,我們希望卡片線上條圖中同時繪制并跟蹤。将每個度量與其對應的機關、最大值和最小值相加。對于土壤水分,我們使用百分比,是以機關分别為%的最小值和最大值分别為0和100:

帶你讀《基于區塊鍊的物聯網項目開發》之二:建立物聯網解決方案第2章
  1. 溫度以攝氏度為機關,最小和最大值分别為0和100:
    帶你讀《基于區塊鍊的物聯網項目開發》之二:建立物聯網解決方案第2章
  2. 選擇喜歡的卡片大小,并為其命名,并建立它。現在,已釋出的資料可以可視化了:
    帶你讀《基于區塊鍊的物聯網項目開發》之二:建立物聯網解決方案第2章

可以按照時間線驗證植物裝置傳輸的測量結果。還可以改變圖中的時間線。

2.3.6 訂閱行動

釋出裝置事件之後,該定義裝置操作了。在案例中,解決方案使用者John希望在監測到土壤濕度門檻值時,系統能夠給他的植物澆水。

水流量由電磁閥控制,電磁閥由繼電器子產品開啟和關閉。下面的代碼是對以前的代碼的更新,包括訂閱植物澆水操作,這将打開閥門1分鐘。

  1. 首先導入所有包依賴項,用預定義的值定義電阻和熱敏電阻常數,然後從device.json加載配置:
    帶你讀《基于區塊鍊的物聯網項目開發》之二:建立物聯網解決方案第2章
  2. 然後,建立幫助函數,将傳感器讀數轉換為可用的值。以下功能負責從實際的裝置中檢索傳感器值,并将它們轉換為人類可以了解的值:
    帶你讀《基于區塊鍊的物聯網項目開發》之二:建立物聯網解決方案第2章
  3. 下一步是建立一個激活電磁閥的輔助函數,等待所要求的時間(seconds ToWater變量的值),然後關閉閥門以便停止澆水:
    帶你讀《基于區塊鍊的物聯網項目開發》之二:建立物聯網解決方案第2章
  4. 連接配接到IBM Watson物聯網平台并建立一個釋出函數,它将每5分鐘将事件釋出到平台上:
    帶你讀《基于區塊鍊的物聯網項目開發》之二:建立物聯網解決方案第2章
帶你讀《基于區塊鍊的物聯網項目開發》之二:建立物聯網解決方案第2章
  1. 并建立訂閱water事件的函數,觸發water Plant功能:
    帶你讀《基于區塊鍊的物聯網項目開發》之二:建立物聯網解決方案第2章

按照使用者John的需求所進行的裝置固件編碼結束。

2.4 建立後端應用

裝置固件安裝完成以後,主要進行應用程式開發,應用程式負責處理裝置事件并發送指令,以便John的花園可以一直保持一定濕度。

應用程式代碼将在IBM Cloud平台(Bluemix)上運作。由于這隻是一個應用示例,我們将使用環境變量來存儲參數(溫度和土壤濕度門檻值)。

2.4.1 在IBM Cloud平台上建立Cloud Foundry應用程式

  1. 要在IBM Cloud中建立應用程式,請通路 https://console.bluemix.net ,選擇Createre source選項并在左側菜單中選擇Cloud Foundry Apps,然後為Node.js選擇SDK。完成此操作後,給應用程式命名并建立運作:
    帶你讀《基于區塊鍊的物聯網項目開發》之二:建立物聯網解決方案第2章
  2. 應用程式建立完成後,選擇左側菜單欄的Connections 選項,建立一個到物聯網服務的連接配接:
    帶你讀《基于區塊鍊的物聯網項目開發》之二:建立物聯網解決方案第2章
  3. 建立與IBM Watson物聯網平台機構的連接配接後,選擇左側菜單中的Runtime選項,然後選擇Environment Variables。在螢幕底部,添加兩個User defined變量,MINIMUM_MOISTURE值填寫300,MAXIMUM_TEMPRATURE值填寫50:
    帶你讀《基于區塊鍊的物聯網項目開發》之二:建立物聯網解決方案第2章

上一章中我們使用了一個JSON文檔儲存配置,但是本章不同,我們現在所需的配置是上一章中已經存儲的配置,目前需要的唯一配置是VCAP_SERVICES及其環境變量。這些變量可以通過預設庫包的代碼來通路,同時,在Node.js中有很多“加速器”,這些“加速器”将有助與通路Cloud Foundry環境相關的裝置,例如:在下一章中使用的代碼展示的cfenv子產品。

2.4.2 上傳代碼

我們要将應用部署到Cloud Foundry環境中, 而重要的是要了解, Cloud Foundry 容器希望釋出一個HTTP端口,是以即使沒有使用容器露出HTTP 資源接口,我們也要開啟 Express JS 伺服器。

以下代碼處理從裝置接收的事件,并在滿足條件時釋出行動指令。

  1. 同樣,代碼的入口點是加載子產品依賴項,并從Cloud Foundry環境變量收集所需的配置:
    帶你讀《基于區塊鍊的物聯網項目開發》之二:建立物聯網解決方案第2章
  2. 然後從Cloud Foundry環境加載配置資料并生成連接配接配置資料:
    帶你讀《基于區塊鍊的物聯網項目開發》之二:建立物聯網解決方案第2章
  3. 下一步是連接配接到IBM Watson物聯網平台并訂閱目标裝置事件:
    帶你讀《基于區塊鍊的物聯網項目開發》之二:建立物聯網解決方案第2章
  4. 每當從訂閱接收到事件時,應用程式檢查裝置報告的溫度是否更高或土壤濕度是否低于定義的門檻值。如果是這樣,将以秒為機關的指定持續時間的水事件釋出到裝置上,進而激活噴水閥:
    帶你讀《基于區塊鍊的物聯網項目開發》之二:建立物聯網解決方案第2章
  5. 啟動Express伺服器,Node.js 容器的IBM Cloud SDK啟動,并在Cloud Foundry環境下對其進行監控:
    帶你讀《基于區塊鍊的物聯網項目開發》之二:建立物聯網解決方案第2章

要部署應用程式,請打開manifest.yml檔案并更改應用程式的name屬性。然後,打開指令行終端,切換到應用基本目錄(manifest.yml所在的位置),并使用bluemix CLI部署應用:

帶你讀《基于區塊鍊的物聯網項目開發》之二:建立物聯網解決方案第2章

擷取成功部署消息後,使用bluemix CLI檢查應用日志:

帶你讀《基于區塊鍊的物聯網項目開發》之二:建立物聯網解決方案第2章

該指令将從Cloud Foundry應用程式中檢索和顯示日志檔案,如下所示。要確定可以檢索這些日志,請確定所有應用跟蹤都發送到stdout和stderr:

帶你讀《基于區塊鍊的物聯網項目開發》之二:建立物聯網解決方案第2章

Cloud Foundry應用的日志檔案

檢視裝置日志,你可以看到,每當滿足設定條件時,裝置都會收到一個為花園澆水的行動請求:

帶你讀《基于區塊鍊的物聯網項目開發》之二:建立物聯網解決方案第2章

此時,你已經有了一個物聯網應用和裝置連接配接,并且可以在IBM 雲環境中正常工作。

2.5 小結

在本章中,我們開發了一個在支援Node.js的真實裝置上運作的解決方案。我們還使用與裝置GPIO(通用IO)互動的低級mraa庫,讀取模拟傳感器(溫度和土壤濕度傳感器),并使用數字引腳打開和關閉繼電器。這看起來很簡單,但大多數裝置都有傳感器和執行器,這可能會改變它們的使用方式。然而,它們本質上遵循相同的概念。

我們在IBM Watson物聯網平台中建立了一個儀表盤,它有助于檢視實時資料裝置釋出的内容。我們還在IBM Cloud平台(Bluemix)中建立了一個應用程式,并将支援服務(IBM Watson物聯網平台組織)附加到應用程式,以便利用配置資料連接配接到服務,并使用Bluemix指令行界面部署應用程式。

下一章将介紹作為互聯企業平台的區塊鍊,并解釋其價值和常見的應用案例,其中它為業務鍊增加價值。

2.6 補充閱讀

使用IBM Watson物聯網平台完成解決方案所需的大部分資源可以在以下連結的官方文檔中找到:

https://console.bluemix.net/docs/services/IoT/index.html#gettingstartedtemplate

IBM社群還釋出了許多IBM Watson物聯網開發指南,可在developerWorks Recipes網站上找到:

https://developer.ibm.com/recipes/tutorials/category/internet-of-things-iot/

了解如何将項目上載到GitHub存儲庫以及如何建立傳遞路線,以便在系統有新的更新推送到存儲庫時可自動建構、測試和部署應用程式,這一點雖不在本書範圍内,但是也非常有用。

有關Grove系統平台、子產品、捆綁的平台子產品群組件規格的更多資訊,請通路制造商網站:

http://wiki.seeedstudio.com/Grove/

繼續閱讀