背景
没什么背景,纯粹想玩。
需求分析
能够在指定web页面上查看我实验室的温湿度。
软硬件资源准备
- Arduino Uno (用于处理传感器数据并控制网络扩展板)  
- W5100网络扩展板(实际上任何兼容Arduino的网络模块均可)  
- 同一局域网的frp client主机一台(用于内网穿透) 
- DHT11温湿度模块(或者其他传感器)  
- 公网frp主机(用于搭建物联云及内网穿透) 
- 公网Nginx主机(可与frp共用) 
- 路由器(网关) 
具体操作
传感器端搭建
将W5100网络扩展板插在Arduino Uno上,然后将DHT11模块连接至Arduino,信号线接至数字2号口。
以下是本人的成品图。
 
将网络模块连接至路由器。
刷入以下代码。
| 12
 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服务器:
添加以下配置:
| 12
 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中添加如下配置:
| 12
 3
 4
 5
 6
 7
 8
 9
 
 | server {listen 80;
 
 server_name iot.vvzero.com;
 
 location / {
 proxy_pass http://frp.vvzero.com:22222;
 }
 }
 
 | 
即可。