搭建具有記錄功能的物聯雲(原型)

前排提醒:本人所有專欄文章均轉載自個人博客:

vvzero.com?

www.vvzero.com

轉載請註明作者和出處!

點擊下方查看效果

VVIOT?

iot.vvzero.com

背景

不滿足於在頁面上顯示單獨的溫濕度數據,我決定添加光線感應以及——每15分鐘添加一次實時數據並更新頁面。

資源準備

  • 我的上一篇文章所闡述的所有軟硬體
  • 光敏模塊

實現原理

服務端某進程每隔一段時間獲取一次本地數據,並將數據添加到index.html

具體操作

本地端

首先,修改Arduino的部分代碼,這個時候,我們就不需要返回一個html頁面了,只需要一串表明物理量的數字即可。另外,順便加上光敏數據,光敏模塊使用3號數字引腳。

#include <SPI.h>#include <Ethernet.h> //網路模塊頭文件#include <dht11.h> //溫濕度模塊庫文件#define SENSORPIN 2 //定義感測器引腳#define LIGHTSENSORPIN 3//定義本機MAC地址和IP,IP子網必須與區域網一致byte mac[] = { 0xDE, 0xAD, 0xBE, 0xE8, 0xDE, 0xED };IPAddress ip(192, 168, 1, 30);dht11 sensor;EthernetServer server(80);void setup() { Serial.begin(115200); //串口用於監控 Ethernet.begin(mac, ip); server.begin();}void loop() { EthernetClient client = server.available(); //當有連接傳入,即開始傳遞數據 if (client) { Serial.println("Incoming...
"); if (client.connected()) { //等待傳入數據 int count = 0; while (!client.available()) { count++; delay(100); if (count >= 10) { count = 0; break; } } //等待客戶端請求結束 while (client.available()) { char charget = client.read(); Serial.write(charget); } sensor.read(SENSORPIN); //讀取溫濕度數據 //這裡就直接返回數值即可 client.println((float)sensor.humidity, 2); client.println(sensor.temperature); client.println(digitalRead(LIGHTSENSORPIN)); } delay(1); if (client.connected()) { client.stop(); Serial.println("client disonnected"); } }}

frp客戶端幾乎不用動。

雲端

我使用C++和shell,利用curl命令獲取數據,然後把數據加到index.html頭部。

比較懶,沒注釋。

//get_data.cpp#include <iostream>#include <fstream>#include <unistd.h>#include <ctime>#include <string>using namespace std;string nowtime();void getdata();void work();void deploy();int main(){ while (1) { work(); sleep(900); } return 0;}void getdata(){ system("curl frp.vvzero.com:21321 > newdata.dat");}string nowtime(){ string value(""); time_t now = time(0); tm *ltm = localtime(&now); value = to_string(ltm->tm_hour) + : + to_string(ltm->tm_min); if (value.length()==4) { if (value[1] == :) value.insert(0,1,0); else if (value[2] == :) value.insert(3,1,0); } else if (value.length()==3) { value.insert(0,1,0); value.insert(3,1,0); } return value;}void work(){ ofstream output; ifstream index, data; getdata(); output.open("tmp_data.dat",ios::out); index.open("index.html",ios::in); data.open("newdata.dat",ios::in); string row; for (int i=0;i<10;i++) { getline(index, row); output << row << endl; } float humidity=0.0; int temperature=0; int light=0; data >> humidity; data >> temperature; data >> light; output << nowtime() << " " << (int)humidity << " " << temperature << " " << (light == 0 ? "Yes" : "No") << endl; int count=0; getline(index, row); while (row[0]!=< && count<99) { output << row << endl; getline(index, row); count++; } while (row[0]!=<) getline(index, row); output << row << endl; while (!index.eof()) { getline(index, row); if (row.length() >= 5) output << row << endl; } output.close(); index.close(); data.close(); deploy();}void deploy(){ system("rm index.html"); system("rm newdata.dat"); system("mv tmp_data.dat index.html");}

這裡實現了每隔15分鐘獲取一次數據。

然後$g++ -o GET get_data.cpp -std=c++11

注意這裡使用的是C++11標準,所以需要加上-std=c++11

在Nginx的根目錄下,先新建一個如下格式的index.html

<html><head><title>VVIOT</title></head><body>Here is Villivateur Vons laboratory!</br><a href="https://www.vvzero.com">Click to enter my blog</a><pre>Time Humidity(%) Temperature(C) Light_Detected------------------------------------------------------------</pre></body></html>

然後配置好合適的許可權,在該目錄下運行$sudo nohup ./GET &

大功告成!

下方是原文地址:

搭建具有記錄功能的物聯雲(原型)?

www.vvzero.com圖標

同時歡迎關注公眾號:裂帛碎玉的想法

推薦閱讀:

TAG:Arduino | 物聯網 | 物聯雲 |