背景
没什么背景,纯粹想玩。
需求分析
能够在指定web页面上查看我实验室的温湿度。
软硬件资源准备
Arduino Uno (用于处理传感器数据并控制网络扩展板)
W5100网络扩展板(实际上任何兼容Arduino的网络模块均可)
同一局域网的frp client主机一台(用于内网穿透)
DHT11温湿度模块(或者其他传感器)
公网frp主机(用于搭建物联云及内网穿透)
公网Nginx主机(可与frp共用)
路由器(网关)
具体操作
传感器端搭建
将W5100网络扩展板插在Arduino Uno上,然后将DHT11模块连接至Arduino,信号线接至数字2号口。
以下是本人的成品图。
将网络模块连接至路由器。
刷入以下代码。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
| #include <SPI.h> #include <Ethernet.h> #include <dht11.h>
#define SENSORPIN 2
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xE8, 0xFE, 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...\n"); if (client.connected()) {
while (client.available()) { char charget = client.read(); Serial.write(charget); } sensor.read(SENSORPIN);
client.println("HTTP/1.1 200 OK"); client.println("Content-Type: text/html"); client.println("Connection: close"); client.println(); client.println("<!DOCTYPE HTML>"); client.println("<html>"); client.println("Here is Villivateur Von's laboratory!"); client.println("<br />"); client.println("<br />"); client.println("<br />"); client.println("Humidity (%): "); client.println("<br />"); client.println((float)sensor.humidity, 2); client.println("<br />"); client.println("<br />"); client.println("Temperature (C): "); client.println("<br />"); client.println((float)sensor.temperature, 2); client.println("<br />"); client.println("</html>"); } delay(1); client.stop(); Serial.println("client disonnected"); } }
|
部分库文件可能不属于Arduino标准库,可能需要手动下载。(淘宝卖家会提供)
同一局域网访问http://192.168.1.30
,即可看到如下页面:
frp客户端设置
在同一内网内启动一个frp客户端,连接至已有的frp服务器:
添加以下配置:
1 2 3 4 5 6 7
|
[ardu_uno] type = tcp local_port = 80 local_ip = 192.168.1.30 remote_port = 22222
|
$nohup ./frpc &
此时,已经可以通过<公网ip>:22222
访问。
更多:配置专有域名(云平台)
在公网服务器Nginx中添加如下配置:
1 2 3 4 5 6 7 8 9
| server { listen 80;
server_name iot.vvzero.com;
location / { proxy_pass http://frp.vvzero.com:22222; } }
|
即可。