MATLAB和物聯網連載3: Thingspeak Tutorial 2
如何用Postman向Thingspeak獲取和推送數據
前面我們已經介紹過用瀏覽器的地址欄來測試Thingspeak功能,瀏覽器可以幫助轉發HTTP的請求給Thingspeak。在實際開發IOT應用時, 最好使用更方便的測試工具,Postman就是這樣一個HTTP請求的模擬工具,它可以從這裡下載。
Postman的使用需要提供HTTP動詞和URL地址,該URL地址表示對Thingspeak的資源請求,而每個頻道對應的資源的URL地址可以從Data Import/Export Tab中找到
上面這個頻道是筆者家裡的一顆巴西木的盆中土壤濕度,因為巴西木耐旱不耐澇,所以為了防止植物水澆的多了,筆者用一個可聯網的Micro controller來隨時監視土壤的濕度。 現在我們查詢該頻道數據,首先選擇GET動詞,再把資源的URL從Thingspeak中拷貝到Postman地址框,然後SEND,得到JSON形式的頻道數據做為結果
結果包含基本的頻道信息,和最近的兩個濕度計的讀數,結果分別是56和57.再在網頁上檢查一下該頻道的Public View,當前的最新的濕度正是57:
下面我們再用另一個公共的頻道:142264,來測試數據的推送, 首先在Data Import/Export中查到其Update Channel Feed的POST的資源地址
選擇動詞Post,拷貝URL地址,點擊Params按鈕,然後填入api key和要推送的數字,最後點Send
如何用Desktop MATLAB向Thingspeak獲取和推送數據
從13a開始,MATLAB開始支持Support Package。在MATLAB中直接連接Thingspeak就需要安裝這樣額外的工具箱。 筆者使用的是15a,需要從如下的地址下載:
http://www.mathworks.com/matlabcentral/fileexchange/52244-thingspeak-support-toolboxn
該mltbx的文件會自動把工具箱安裝在用戶的專屬MATLAB文件夾中,你可以通過
>> which thingspeakReadn
命令來檢查實際安裝路徑。
安裝完畢之後,可以用thingspeakRead函數來獲得指定Channel的數據,示例如下:
[data,t] = thingSpeakRead(138112,Fields,1,NumPoints,5000);n
該命令中,要求返回頻道138112,即土壤濕度頻道中的第一個fields中最後5000個數據(Thingspeak支持最大一次返回80000個數據點)。 返回值中,data是包含溫度的數組,t是MATLAB的datetime對象數組。我們可以把得到的結果轉化成MATLAB的timeseries對象,然後做圖
ts = timeseries(data,cellstr(t),Name,Soil Humidity);nplot(ts)n
其中濕度的一次大幅度增加是因為澆了比較多的水,然後迅速大幅下降可能是因為水都滲到了盆底,而濕度計的深度有限僅能探測到30cm深左右土壤。
往頻道中寫數據可以使用thingspeakWrite函數,沿用之前使用的公共頻道142264來測試數據的推送,代碼示例如下:
thingSpeakWrite(142264,[304],WriteKey,LZMPN3V00CB7MWU1)n
其中的WriteKey是創建頻道時系統自動生成的,和頻道有一一對應的關係。 可以通過如下的公共的URL來檢查該頻道 Demo Postman Post
如何用MATLAB App和Thingspeak定期收集城市天氣數據
這節舉例用Thingspeak定期收集城市溫度數據,來演示在Thingspeak產品中:數據頻道,MATLAB APP以及TimeControl如何相互作用。效果如下圖所示,三張圖代表三個不同的城市溫度隨時間的變化。
在實際物聯網應用中,環境的信息比如溫度,一般來自於溫度感測器。本例簡單起見,直接從網上獲得感興趣的城市的當前溫度。物聯網的編程方式和傳統的不同,傳統編程一般一個程序完成所有或者大部分的任務,而物聯網常見編程方式是組合使用各組件來完成一個任務。本節例子中,設計4個組件:
- 一個提供天氣查詢的API
- 從API中取得城市溫度的MATLAB程序
- 一個定時器讓MATLAB程序定期的運行
- 一個數據收集的頻道,把獲得的數據保存在雲端
組件工作流程如下
+---+--------------------------------------------------------+n| W |n| E | +-----------------------+n| B | | Weather API |n| | | |n| | +----------+------------+n| | | n+---+--------------+-----------------------------------------+n| T | | n| H | +----------V------------+ +------------+n| I | | MATLAB APP +<---------+ TimeControl|n| N | | | | APP |n| G | +----------+------------+ +------------+n| S | | n| P | | n| E | | n| A | +----------V------------+ n| K | | Thingspeak | n| | | Channel |n| | +-----------------------+n| |n+---+--------------------------------------------------------+n
組件1:天氣API
我們選擇 OpenWeather 作為數據源, 該服務免費提供全球20萬個城市當前天氣信息。
假設要收集的是三個城市Wellesley, MA, Winston-Salem NC和江蘇南京的當前溫度。查閱API文檔可以獲得 請求資源的方式. 這裡我們選擇使用 城市代碼 的方式查詢。 所以根據其API的說明文檔,一次性獲得三個城市的天氣數據的URL請求如下:
http://api.openweathermap.org/data/2.5/group?id=4954738,4499612,1799962&APPID=YourAppIDn
其中的APPID需要註冊之後才能獲得,每次提出服務請求時都需提供該APPID,使用Postman模擬HTTP請求,驗證網站響應如下:
組件2,3 :MATLAB APP 和 thingspeakWrite
下面用MATLAB APP來程序化的獲得城市的溫度,首先在Thingspeak的Analytics中選擇MATLAB Analysis
然後選擇New,選擇Custom(No Starter Code)把下面的這段代碼拷貝到編輯欄中
APPID = 810ce1aecde3XXXXXXXd8cceb084e5d8; % 換成你自己的APPIDncityCode={4954738,4499612,1799962}; % 這裡是三個城市的代號nqueryCode = strjoin(cityCode,,);nnoptions = weboptions(Timeout,10); % 如果網頁超過10秒沒有響應就Time Outnnurl = strcat(http://api.openweathermap.org/data/2.5/group?id=,queryCode,&APPID=,APPID);nnresult = webread(url,options); % 通過webread向openweathermap發送請求nnnT=zeros(1,3);nfor iter = 1:3 % 得到的結果是一個struct n T(iter) = result.list{iter}.main.temp - 273.15; % 把開爾文單位轉成攝氏nendnn% 最後把得到的結果寫入thingspeak的頻道nthingSpeakWrite(142021,Fields,[1,2,3],Values,T,WriteKey,YourRightKey)n
這段程序首先構造HTTP請求字串,然後 利用webread函數來對openweathermap發送請求,獲得結果之後,從中其餘溫度信息,最後用thingspeakWrite把獲得的城市溫度數據保存在一個頻道中。
點擊Save and Run會運行一次上述程序,如果程序無誤,Output中的內容將不會有任何的錯誤信息。
組件4 Time Control
默認的情況下,該程序僅運行一次,如果要定期的運行這個程序,把MATLAB Analysis網頁下拉到底部,點擊TimeControl的選項設置這個定時器:
推薦閱讀: