點(diǎn)擊鏈接加入群聊【Node-RED與IoT開發(fā)交流】https://jq.qq.com/?_wv=1027&k=5owlJfm
新創(chuàng)立的群找颓,歡迎加入碗啄!
Node-RED Tutorial Home
介紹
建立你的第一個(gè)流
基礎(chǔ)節(jié)點(diǎn)和流
核心節(jié)點(diǎn)
例子:
使用Node-RED搭建一個(gè)天氣預(yù)報(bào)面板
基于 SIMATIC IOT2040 的 Node-RED S7 通信
總覽
這個(gè)小項(xiàng)目的目標(biāo)是通過API請求 獲取OpenWeatherMap的基礎(chǔ)天氣信息和WAQI的空氣質(zhì)量信息, 并將這些信息存入MySQL數(shù)據(jù)庫, 并從前端展示出來. 展示Node-RED在可視化編程和UI界面快速構(gòu)建方面的強(qiáng)大能力.
相關(guān)資源可在Github獲取, https://github.com/bing-zhub/WeatherNode. 如果對您有用也請賞個(gè)Star吧
數(shù)據(jù)庫設(shè)計(jì)
以Weather表為主表其余為副表, 通過外鍵關(guān)聯(lián)各個(gè)副表. 大體含義可以通過域名推測.
API Token獲取
OpenWeatherMap
- https://home.openweathermap.org/users/sign_up 注冊
- https://home.openweathermap.org/api_keys 添加項(xiàng)目
- 在2的頁面中可以查看到你獲取的Token
具體的API參數(shù)參照 https://openweathermap.org/current
WAQI
- https://aqicn.org/data-platform/token/# 注冊
- 注冊成功后便可以在當(dāng)前頁面獲取到Token
具體的API參數(shù)參照 https://aqicn.org/json-api/doc/
Node-RED編寫
如果曾看過之前的文章, 應(yīng)該知道 Node-RED每個(gè)flow是通過一個(gè)msg對象進(jìn)行傳遞數(shù)據(jù)的. 所以這里我們在init
節(jié)點(diǎn)生成一個(gè)msg對象, 來替代Node-RED本身生成的msg對象(這樣可以更加方便添加鍵值對).
msg = {
city:"",
country:"",
basic_api:"",
air_api:"",
data:{
basic:{
},
air:{
}
},
topic:"",
ids:{
location:0,
temp:0,
wind:0,
air:0,
iaqi:0
},
payload:{
urls:""
}
}
return msg;
city
/country
用來放置即將在config
節(jié)點(diǎn)中即將添加的城市和國家. data
用來存儲從API獲取的數(shù)據(jù). topic
在后續(xù)節(jié)點(diǎn)主要用于存放SQL語句. ids
用于存放,在存入副表數(shù)據(jù)過程中產(chǎn)生的副表ID, 主要用于主表外鍵關(guān)聯(lián).
從數(shù)據(jù)源獲取數(shù)據(jù)
在初始化完成后, 下面構(gòu)造API
city = "London";
country = "UK";
basic_token = "OpenWeatherMap token";
air_token = "WAQI token";
msg.city = city;
msg.country = country;
msg.basic_api = `http://api.openweathermap.org/data/2.5/weather?q=${city},${country}&appid=${basic_token}`;
msg.air_api = `https://api.waqi.info/feed/${city}/?token=${air_token}`;
msg.url = msg.basic_api;
return msg;
構(gòu)造完成后, API地址被放入了msg對象, 在下一步的Request請求便可以調(diào)用.
Request節(jié)點(diǎn)可以通過可視化配置的方式配置API地址, 也可通過msg.ur
l動態(tài)配置, 所以我們把基礎(chǔ)天氣信息的API放入msg.url
.
Request(GET)請求后, 返回的數(shù)據(jù)通過JSON
節(jié)點(diǎn), 將字符串轉(zhuǎn)為JavaScript對象, 這樣更加方便操作. 轉(zhuǎn)換好之后, 將獲得的數(shù)據(jù)放入事先為數(shù)據(jù)預(yù)留的msg.data
.
這是我們就已經(jīng)獲取到了對應(yīng)城市的基礎(chǔ)天氣.
空氣質(zhì)量信息與之類似, 不贅述.
數(shù)據(jù)庫存儲
數(shù)據(jù)源數(shù)據(jù)獲取后, 我們便可以操作msg
, 將需要的信息存儲進(jìn)入數(shù)據(jù)庫.
首先我們安裝Mysql Connector
latitude = msg.data.basic.coord.lon;
longitude = msg.data.basic.coord.lat;
sql = `insert into Location (latitude, longitude) values(${latitude}, ${longitude});`;
msg.topic = sql;
return msg;
首先獲取msg
對象中的latitude
和longitude
.
接下來構(gòu)造DML, 這里使用JavaScript的模板語法, 把獲取的latitude
和longitude
填入SQL語句.
由于Node-RED中的MySQL驅(qū)動從以msg.topic
為SQL, 所以我們要將構(gòu)造好的SQL放入msg.topic
.
之后, 從左側(cè)節(jié)點(diǎn)欄拖出MySQL, 配置數(shù)據(jù)庫, 完成后用連線將二者(function節(jié)點(diǎn)與MySQL節(jié)點(diǎn))進(jìn)行連接, 如總圖.
當(dāng)數(shù)據(jù)到來時(shí), MySQL節(jié)點(diǎn)便會執(zhí)行msg.topic
中的SQL語句, 將對應(yīng)的信息存入數(shù)據(jù)庫. 數(shù)據(jù)存儲成功后, MySQL節(jié)點(diǎn)會將SQL執(zhí)行的結(jié)果返回到msg.payload
, 其中包含插入的id
, 我們將獲取到的id
放入ids
對應(yīng)的鍵中, 以便后續(xù)使用.
其余過程相似性很大, 不再贅述.
在對主表進(jìn)行操作時(shí), 將msg.ids
中的數(shù)據(jù)獲取出來, 便可以產(chǎn)生外鍵約束, 保持?jǐn)?shù)據(jù)整體性.
可視化
未完待續(xù)...
本人水平極為有限, 存在的不足還請各位海涵. 有問題歡迎交流. 如果有時(shí)間我會寫一篇真正的關(guān)于物聯(lián)網(wǎng)的小文.