MATLAB和物聯網連載6: Thingspeak Tutorial 5
在前面的教程中,我們已經學習了Thingspeak的三種服務:MATLAB Analysis, MATLAB Visualization, Plugins 和TimeControl(圖中綠色所示),這一節我們將用兩個例子繼續學習React,TalkBack和ThingHTTP服務(圖中紅色所示)。在第一個例子中,我們把React和ThingHTTP的服務和另一個物聯網領域很流行的IFTTT服務連接在一起, 利用NodeMCU 來演示如何讓聯網硬體在一定條件下給郵箱發郵件。第二個例子中,我們將演示用Talkback服務來控制聯網硬體。
如用Thingspeak和IFTTT讓物聯網硬體發郵件
這篇土壤濕度檢測的教程中 (濕度數據存放在Thingspeak的 Channel 138112中), 我們設計了一個聯網的硬體負責定時收集土壤的濕度,有些時候,我們希望在數據滿足一定條件的情況下,可以觸發一些反應(React)。比如土壤濕度低於某個值,就發出一個警報或郵件。 下面就是這個設想的架構:聯網硬體通過濕度檢測儀監視土壤濕度,然後通過HTTP Put定時向數據收集服務Thingspeak報告濕度數據,Thingspeak中通過React服務來監視該頻道的數據,一但濕度數值低於15,就觸發ThingHTTP服務,而ThingHTTP的工作則是繼續觸發IFTTT中的Maker Channel的服務,最後發送郵件。
+-----+---------------------------------------------------------------n| | +-----------+ +--------------+n| | |soil +--------+ NodeMCU |n| | +-----------+ +--------+-----+n| | |n| | |HTTP Put Request n+-----+-------------------------------------+-------------------------n| T | +--------+-----+ n| H | |Thingspeak | n| I | +-+-----------++ n| N | | | n| G | +-----+----+ ++--------+ n| S | | React | | Thing | n| P | | | | HTTP | n| E | | | | | n| A | +----------+ +----+----+ n| K | |HTTP Put Requestn+-----+----------------------------------------------+-----------------n| I | +---------------------+----+ n| F | | IFTTT Maker Channel | n| T | | | n| T | +------------+-------------+ n| T | | n| | |IFTTT with Gmail n+-----+-------------------------------------+--------------------------n| | +-------+------+ n| | | Gmail | n| | +--------------+n+-----+----------------------------------------------------------------n
IFTTT Maker Channel的設置
現在我們從後向前來設置這個反應鏈,IFTTT是If This Then That的縮寫,它的服務是:用戶通過指定This(觸發條件/如果)和That(連鎖反應/就)來創建自己的Recipe(物聯網如果就反應鏈),來自動化一些簡單的小任務。比如:如果(If)用手機拍了照片,就(That)自動的把這張照片存在Dropbox中。IFTTT中有一個Maker Channel可以將Web Request作為If的條件,這就是我們今天要使用的。首先在Maker Channel中創建一個Recipe:
這個Recipe的Trigger是:如果(If)收到一個Web Request
就(That)選擇Trigger的Response,這裡選擇mail(作為例子筆者選擇gmail)
還填入要發送的郵件的內容,注意它給出的模板格式,其中{{}}允許我們從發送來的Web Request中提取同名的數據,然後轉發到郵件當中去
Maker Channel中有詳細如何向Channel發送HTTP的request的教程,參見這裡。Maker Channel還提供了測試功能,來驗證Response的設置
或者使用如下的命令直接測試
curl -X POST -H "Content-Type: application/json" -d {"value1":"1"} https://maker.ifttt.com/trigger/plant_alarm/with/key/cY05pyaeXXXn
ThingHTTP的設置
ThingHTTP將負責向Maker Channel發送Web Request。首先創建一個新的ThingHTTP服務,和IFTTT的連接設置如下
注意:
- URL中要包括IFTTT提供的一個Private Key
- Content type必須是JSON,因為IFTTT Maker Channel預期的格式是JSON
- 在Body中,可以援引任何Channel中的數據,這是要發送給IFTTT的數據,格式如下:
{"value1":"%%channel_138112_field_1%%"}n
React的設置
最後,創建一個React服務,設置如下:每15分鐘檢查一下Channel 138112,如果值低於15,觸發ThingHTTP中的plant alarm服務
因為土壤的濕度一直低於15,所以完成這個設置之後,因為很快就會受到NodeMCU通過Thingspeak和IFTTT發送的郵件。
如何用Thingspeak控制聯網硬體
向硬體發送命令的最簡單的方式當然是使用MQTT,該協議是一種發送和接受的模式(Subscribe and Publish)。除此之外Thingspeak還提供了一個服務,叫做Talkback,它把要向硬體發送的命令存在一個消息或命令隊列中,並且由硬體自己主動地查詢(Pull)要傳遞給自己的信息。比如:如果我們希望NodeMCU可以往不同的Channel中發送數據,而具體往哪一個Channel中發送,則由writeKey來決定(因為Channel和writeKey有一一對應的關係),這就要求在部署硬體之後,必須可以再修改writeKey,這就要求writeKey不能在程序中事先指定好,而必須從其它地方得到的。由於writeKey是一串隨機的字元串,所以它不能當做double型的數據存在數據Channel中,於是,可以存貯任意字元的Talkback服務在這兒就派上用場了。下面是這個例子的架構圖: 硬體先從Talkback的服務處得到writeKey,再把數據發送到writeKey對應的Channel。
+---+--------------------------------------------------------n | T | n | H | +---------------+ +----------------+n | I | | Talkback | | Channel |n | H | | | | |n | G | | writekey | | |n | S | +-----------+---+ +-----^----------+n | | | ^ n-+---+----------------V---------------------+------------------n | N | V |n | O | +--+----------+ |n | D | | NodeMCU | |n | E | | +----------+n | M | | |n | C | +-------------+n | U | n +---+---------------------------------------------------------n
Talkback提供簡單的HTTP介面,來存儲和維護一個消息命令隊列,如下所示: Example : Talkback ID(10060)
PositionCommand IDCommand string12687601command_122687602command_232687603command_3它支持往隊列中添加,更新命令,還有從隊列中取出(消耗)一個命令,當取出命令的時候,它遵循先進先出原則。每一個talkback服務都有一個ID,相當於消息隊列的ID,而在一個隊列中,每一個命令也有一個自己的ID,叫做Command ID,在更新command string時,即需要指定Talkback ID,還需要指定Command ID.
往隊列中插入一個command的curl命令如下
curl -X POST -H "Content-Type: application/json" -d {"api_key":"writekey","command_string":"new_command"} https://api.thingspeak.com/talkbacks/10060/commands.jsonn
在NodeMCU上,往隊列中插入command,可以通過NodeMCU的Net Library完成
conn=net.createConnection(net.TCP, 0) nnconn:on("connection",function(conn, payload)n cmd ="POST /talkbacks/10060/commands.json?api_key=R0BP3QV2NRPRVEJQ&command_string=3PGT8C4EBT5SRY4K"nt.. " HTTP/1.1rn"nt.. "Host: api.thingspeak.comrn"nt.. "rn";nt conn:send(cmd); nt end) nnconn:on("receive", function(conn, payload)n print("received");n conn:close()n end) nconn:connect(80,api.thingspeak.com)n
最後,先查詢Talkback消息命令隊列,然後決定哪一個channel中發送數據的NodeMCU Lua程序參見這篇的最後一段: A practical Example: Talkback: Queue commands to NodeMCU via Thingspeak
推薦閱讀:
※淺談線性化
※Matlab如何製作屬於自己的縮寫詞典
※機器學習筆記25 —— 編程作業8異常檢測演算法和推薦系統
※MATLAB數據可視化[2]:heatmap