1. 项目概述与核心思路最近在捣鼓一些物联网小玩意儿发现了一个性价比高得离谱的玩意儿——ESP8266 WLAN模块。这东西在本地电子商店卖不到10欧元网上更是便宜。它一边通过内置的贴片天线连接Wi-Fi另一边则是一个简单的TTL串口。我买了一个回来随手就把它插在了面包板上的Arduino旁边。这个组合瞬间让我有了一个想法能不能用一堆便宜的Arduino加上这个Wi-Fi模块再配上一个树莓派搭建一个属于自己的、可扩展的无线传感器网络呢这个网络的目标很明确让分布在各处的传感器数据能通过一个统一的、低成本的方式汇聚起来并且能够被外部的系统比如家里的自动化中枢或者实验室的数据采集系统方便地访问。这个想法背后的驱动力很简单极致的成本控制和灵活的部署。传统的工业传感器网络方案要么协议封闭要么网关设备昂贵。而Arduino生态有海量的传感器库和活跃的社区ESP8266提供了廉价的网络接入能力树莓派则是一个完美的、可编程的中央协调器和协议转换器。三者结合就能用极低的预算每个节点可能就几十块钱搭建起一个功能强大、完全由自己掌控的传感网络。无论是想监测家里的温湿度、光照还是想在实验室里监控多个设备的电压、电流或者开关状态这个架构都能胜任。它特别适合那些喜欢动手、对成本敏感同时又希望系统有一定可靠性和可扩展性的创客、学生或者小型研发团队。2. 硬件选型与核心组件解析2.1 主角登场ESP8266模块的深入剖析ESP8266之所以成为这个项目的核心绝不仅仅是因为它便宜。我们需要深入理解它的几种常见形态和关键特性。模块形态与选择市面上最常见的ESP8266模块是ESP-01它体型小巧引脚较少通常8个适合对空间要求极高的场景。但对于传感器节点来说我强烈推荐使用ESP-12E/F系列模块例如NodeMCU开发板使用的就是ESP-12E。原因如下更多的GPIO引脚ESP-12E/F提供了11个可用的GPIO这意味着你可以直接连接更多的传感器如DHT11温湿度、土壤湿度、光照强度传感器等而无需额外的IO扩展芯片简化了电路设计。更好的天线性能ESP-12F集成了陶瓷天线并且有金属屏蔽罩其信号稳定性和抗干扰能力通常优于ESP-01的PCB天线这对于部署在角落或隔墙的传感器节点至关重要。易于开发像NodeMCU这样的开发板直接集成了USB转串口芯片和稳压电路通过Micro-USB线即可供电和编程极大地降低了入门和调试门槛。关键电气特性与连接ESP8266的工作电压是3.3V而大多数Arduino如Uno的逻辑电平是5V。直接连接会导致ESP8266损坏必须进行电平转换。有几种方案使用现成的NodeMCU这是最省事的方法。NodeMCU本身就是一个基于ESP8266的完整开发板你可以直接用Lua或Arduino IDE为其编程完全取代Arduino作为主控成本可能比“Arduino Uno ESP-01 电平转换模块”的组合更低性能更强。分体方案Arduino ESP-01如果坚持使用Arduino作为主控例如需要利用其特定的库或ADC精度则必须使用电平转换模块如TXS0108E或简单的电阻分压电路仅适用于TX线从Arduino 5V TX到ESP8266 3.3V RX。同时务必确保两者共地。注意无论哪种方案ESP8266的峰值电流可能达到200mA以上务必为其提供独立、稳定、充足的3.3V电源。使用Arduino板上那个孱弱的3.3V线性稳压器给ESP8266供电是导致系统不稳定、频繁重启的常见原因。2.2 传感与控制核心Arduino的定位与升级在这个架构中Arduino的角色非常清晰专业的传感器接口与数据预处理单元。ESP8266负责通信而Arduino则负责与物理世界交互。为什么不是直接用ESP8266接传感器对于简单的数字或I2C传感器直接用NodeMCUESP8266是完全可行的。但在以下场景独立的Arduino或更强大的微控制器优势明显模拟传感器ESP8266只有一个ADC引脚且精度一般而Arduino Uno有6个10位ADC。如果你需要同时采集多个模拟量如多个位置的电压、光照强度Arduino是更好的选择。复杂的定时与中断某些传感器需要精确的时序或快速响应外部中断Arduino的架构和丰富的库在这方面非常成熟。现有的代码与生态你可能已经有大量为Arduino编写的传感器驱动代码迁移到ESP8266平台可能需要调整。性价比之选ATmega328P裸片原文作者提到了一个非常棒的点使用刷写了Arduino Bootloader的ATmega328P裸片。这能将单个节点的核心控制器成本降至极低十几元人民币。你需要做的只是购买ATmega328P-PUDIP封装芯片。用另一个Arduino作为编程器通过“Arduino as ISP”示例程序给裸片烧录Bootloader。然后就可以像使用Arduino Uno一样通过FTDI USB转串口模块如CP2102、CH340来给这个“最小系统”上传程序了。这个最小系统只需要芯片、一个16MHz晶振、两个22pF电容、一个10k上拉电阻和一个复位按钮成本极低。2.3 网络中枢与网关树莓派的战略价值树莓派在这里扮演着“私有云网关”和“协议桥梁”的双重角色这是本项目设计精妙之处。1. 创建私有Wi-Fi网络AP模式这是解决安全与简化配置的关键。让每个ArduinoESP8266节点去连接复杂的企业或家庭Wi-Fi尤其是需要网页认证的既困难又不安全。而让树莓派开启一个专用的、简单的Wi-Fi热点例如SSID叫“SensorNet”所有传感器节点都连接这个热点。这样隔离与安全传感器网络与主网络隔离即使传感器节点有漏洞也不会威胁到家庭主要设备。固定内网IP你可以在树莓派作为DHCP服务器上根据ESP8266的MAC地址为其分配固定的IP如192.168.4.x方便管理。简化节点配置节点程序里只需要写死连接“SensorNet”和其密码无需处理复杂的网络切换。2. 端口转发与协议转换网关核心功能树莓派运行一个自定义的Python或Node.js等服务程序。这个程序的核心工作是监听监听某个TCP端口例如8080。转发当外部请求到达树莓派的8080端口时根据请求中的标识例如包含目标传感器ID的HTTP URL或TCP报文头将请求转发到对应传感器节点的内网IP和端口例如192.168.4.101:80。聚合与缓存更高级的玩法是让树莓派上的服务主动定时轮询所有传感器节点将数据缓存到本地数据库如SQLite或InfluxDB外部请求直接访问树莓派上的数据库API避免频繁打扰低功耗的传感器节点。3. 对外提供标准接口树莓派可以将传感器数据封装成标准的协议如RESTful API、MQTT或原文作者提到的EPICS IOC。这样任何上层的监控软件如Grafana、Home Assistant或工业控制系统都可以通过标准方式与这个异构的传感器网络交互而无需关心底层是Arduino还是ESP8266。3. 系统架构设计与通信协议3.1 整体网络拓扑解析让我们把这个系统的数据流画清楚这有助于理解每个部分的责任。[外部互联网/家庭局域网] | | (标准协议HTTP/MQTT/EPICS) | [树莓派网关] (IP: 192.168.1.100) | 运行Python网关服务 私有Wi-Fi热点 | 功能端口转发、协议转换、数据聚合 | | (私有Wi-Fi网络: SSIDSensorNet) |---[传感器节点1] (ArduinoESP8266, IP: 192.168.4.101) | |-- 传感器A (如DHT22) | |-- 传感器B (如土壤湿度) | |---[传感器节点2] (NodeMCU, IP: 192.168.4.102) | |-- 传感器C (如PIR人体感应) | |---[控制节点1] (ArduinoESP8266, IP: 192.168.4.103) |-- 执行器A (如继电器控制灯光)在这个拓扑中树莓派是唯一的对外出口和指挥中心。所有内部节点192.168.4.x只与树莓派通信形成一个星型网络管理起来非常清晰。3.2 节点与网关间的通信协议设计传感器节点和树莓派网关之间需要一种轻量、高效的通信方式。这里有几个常见选择1. HTTP GET/POST最易实现在Arduino端使用ESP8266的库如ESP8266WiFi和ESP8266WebServer搭建一个简单的Web服务器。例如节点监听80端口当收到GET /sensor/temperature请求时读取温度传感器值并返回一个JSON{temp: 23.5, unit: C}。优点简单通用易于在树莓派上用Python的requests库进行轮询。缺点HTTP开销相对较大不适合极低功耗的频繁上报需要节点始终运行服务器消耗资源。2. TCP/UDP自定义报文在Arduino和树莓派上编写简单的Socket程序。节点可以定时或在数据变化时主动向树莓派的某个端口发送一条结构化的二进制或文本报文。例如NODE01,TEMP,23.5,HUMI,65。优点极其灵活报文可以设计得非常精简效率高。缺点需要自己定义报文格式和解析逻辑调试稍复杂。3. MQTT推荐用于异步、多对多场景让所有传感器节点和树莓派都作为MQTT客户端连接到一个运行在树莓派上的MQTT代理Broker如Mosquitto。节点将数据发布Publish到如sensor/node01/temperature的主题Topic树莓派或其他订阅Subscribe了该主题的设备就能收到数据。优点解耦彻底扩展性极强。新增节点或订阅者无需修改现有程序。支持“保留消息”和“遗嘱消息”便于状态管理。缺点需要在节点和树莓派上都引入MQTT客户端库对于资源极其紧张的ArduinoESP-01组合可能有点压力。我的选择与建议对于初学者可以从HTTP轮询开始最容易理解和调试。当节点数量增多或对实时性要求提高时过渡到MQTT是更优雅的方案。树莓派上运行Mosquitto和一個订阅MQTT主题并写入数据库的Python脚本架构非常清晰。3.3 数据流与安全考量数据从传感器到最终用户手中的路径如下采集Arduino通过数字/模拟接口读取传感器数据。封装将数据按照约定的协议如JSON字符串准备好。发送通过串口指令控制ESP8266将封装好的数据发送到树莓派的私有Wi-Fi网络。接收与转发树莓派上的网关服务接收到数据。协议转换网关服务将数据从内部协议转换为对外的标准API如HTTP REST接口。存储/展示外部应用通过访问树莓派的API获取数据用于显示、存储或控制。安全是一个不容忽视的问题尤其是在涉及家庭自动化或实验室监控时。我们的架构在物理层通过私有Wi-Fi实现了隔离。在应用层可以采取以下措施节点认证在HTTP或MQTT协议中加入简单的令牌Token认证。节点发送数据时需携带一个预共享的密钥。API密钥树莓派对外的REST API要求调用方提供API Key。HTTPS/MQTTS对于安全性要求更高的场景可以在树莓派上配置SSL证书启用HTTPS或MQTTS对通信链路进行加密。但这会增加树莓派和客户端如果支持的处理负担。4. 软件实现从节点到网关的代码实战4.1 传感器节点端编程以Arduino ESP8266为例这里我们以实现一个HTTP服务器节点为例它同时读取一个DHT11温湿度传感器。1. 硬件连接Arduino Uno - ESP-01 (需电平转换)Arduino TX (Pin 1) - 电平转换器 - ESP8266 RXArduino RX (Pin 0) - 电平转换器 - ESP8266 TXGND - GNDArduino 3.3V -不推荐直接连接请使用外部3.3V电源给ESP8266供电。DHT11传感器 - ArduinoVCC - 5VGND - GNDDATA - Digital Pin 22. Arduino代码详解#include SoftwareSerial.h #include DHT.h // 定义软串口连接ESP8266。避免占用硬串口用于调试。 SoftwareSerial esp8266(10, 11); // RX, TX (连接ESP8266的TX, RX) // 定义DHT传感器 #define DHTPIN 2 #define DHTTYPE DHT11 DHT dht(DHTPIN, DHTTYPE); // 网络配置 const char* ssid SensorNet; // 树莓派热点的SSID const char* password your_password; // 热点密码 const char* host 192.168.4.1; // 树莓派作为热点的IP通常是.1 const int httpPort 8080; // 树莓派上网关服务的端口 // 节点ID用于区分不同节点 String nodeId NODE01; void setup() { Serial.begin(115200); // 用于调试输出到电脑 esp8266.begin(115200); // 与ESP8266通信的波特率 dht.begin(); Serial.println(Initializing...); // 1. 重启ESP8266以确保状态干净 sendCommand(ATRST, 2000); // 2. 设置为Station模式客户端模式 sendCommand(ATCWMODE1, 1000); // 3. 连接到指定的Wi-Fi String cmd ATCWJAP\ String(ssid) \,\ String(password) \; sendCommand(cmd, 5000); // 连接可能需要较长时间 // 4. 获取本地IP地址确认连接成功 sendCommand(ATCIFSR, 1000); // 5. 启用多连接模式为后续可能的服务器模式做准备但本例我们主动上报 sendCommand(ATCIPMUX0, 1000); Serial.println(Setup complete.); } void loop() { // 读取传感器数据 float humidity dht.readHumidity(); float temperature dht.readTemperature(); // 检查读取是否成功 if (isnan(humidity) || isnan(temperature)) { Serial.println(Failed to read from DHT sensor!); delay(2000); return; } // 构造要发送的JSON数据 String data {\node_id\:\ nodeId \,\temp\: String(temperature) ,\humi\: String(humidity) }; // 通过ESP8266发送HTTP POST请求到树莓派网关 sendDataToGateway(data); // 每10秒发送一次数据 delay(10000); } // 发送AT指令并打印响应用于调试 String sendCommand(String command, int timeout) { String response ; esp8266.println(command); long int time millis(); while ((millis() - time) timeout) { while (esp8266.available()) { char c esp8266.read(); response c; } } Serial.print(Command: ); Serial.println(command); Serial.print(Response: ); Serial.println(response); return response; } // 发送数据到网关 void sendDataToGateway(String data) { // 1. 建立TCP连接到树莓派网关 String cmd ATCIPSTART\TCP\,\ String(host) \, String(httpPort); sendCommand(cmd, 2000); // 2. 准备HTTP POST请求报文 String postRequest POST /api/sensor_data HTTP/1.1\r\n; postRequest Host: String(host) : String(httpPort) \r\n; postRequest Content-Type: application/json\r\n; postRequest Content-Length: String(data.length()) \r\n; postRequest Connection: close\r\n\r\n; postRequest data; // 3. 发送数据长度指令 cmd ATCIPSEND String(postRequest.length()); sendCommand(cmd, 1000); // 4. 发送实际数据 esp8266.print(postRequest); delay(100); // 等待发送完成 sendCommand(ATCIPCLOSE, 500); // 关闭连接 Serial.println(Data sent: data); }这段代码实现了节点定时读取传感器数据并通过ESP8266以HTTP POST请求的方式将JSON格式的数据主动上报到树莓派网关的/api/sensor_data接口。4.2 树莓派网关服务编程Python实现树莓派上需要运行一个服务它主要做两件事1. 提供Wi-Fi热点2. 运行一个Web服务器接收节点数据并处理。1. 配置树莓派为Wi-Fi热点可以使用hostapd和dnsmasq服务。这是一个标准操作网上教程很多。配置好后树莓派将创建一个名为“SensorNet”的网络。2. 编写Python网关服务我们使用轻量级的Flask框架来创建接收API。# gateway_service.py from flask import Flask, request, jsonify import sqlite3 import datetime import threading import time app Flask(__name__) DATABASE /home/pi/sensor_data.db # 初始化数据库 def init_db(): conn sqlite3.connect(DATABASE) c conn.cursor() # 创建表存储节点ID、温度、湿度、时间戳 c.execute(CREATE TABLE IF NOT EXISTS sensor_data (id INTEGER PRIMARY KEY AUTOINCREMENT, node_id TEXT NOT NULL, temperature REAL, humidity REAL, timestamp DATETIME DEFAULT CURRENT_TIMESTAMP)) conn.commit() conn.close() # API端点接收传感器节点上报的数据 app.route(/api/sensor_data, methods[POST]) def receive_sensor_data(): if not request.is_json: return jsonify({error: Request must be JSON}), 400 data request.get_json() node_id data.get(node_id) temp data.get(temp) humi data.get(humi) if not all([node_id, temp is not None, humi is not None]): return jsonify({error: Missing fields}), 400 # 将数据存入SQLite数据库 conn sqlite3.connect(DATABASE) c conn.cursor() c.execute(INSERT INTO sensor_data (node_id, temperature, humidity) VALUES (?, ?, ?), (node_id, temp, humi)) conn.commit() conn.close() print(f[{datetime.datetime.now()}] Received from {node_id}: Temp{temp}C, Humi{humi}%) return jsonify({status: success, node_id: node_id}), 200 # API端点对外提供查询最新数据的接口 app.route(/api/current_data, methods[GET]) def get_current_data(): node_id request.args.get(node_id, NODE01) # 默认查询NODE01 conn sqlite3.connect(DATABASE) c conn.cursor() # 获取该节点最新的一条记录 c.execute(SELECT node_id, temperature, humidity, timestamp FROM sensor_data WHERE node_id? ORDER BY timestamp DESC LIMIT 1, (node_id,)) row c.fetchone() conn.close() if row: data { node_id: row[0], temperature: row[1], humidity: row[2], timestamp: row[3] } return jsonify(data) else: return jsonify({error: No data found}), 404 if __name__ __main__: init_db() # 在树莓派私有网络IP如192.168.4.1的8080端口上运行服务 # 注意需要在树莓派防火墙上开放此端口如 sudo ufw allow 8080 app.run(host192.168.4.1, port8080, debugFalse, threadedTrue)这个服务提供了两个APIPOST /api/sensor_data: 供传感器节点上报数据。GET /api/current_data?node_idXXX: 供外部系统如手机App、网页查询某个节点的最新数据。3. 让服务开机自启可以使用systemd创建一个服务单元文件确保树莓派启动后自动运行这个Python脚本。4.3 低功耗优化策略实战原文作者提到了ESP8266功耗高的问题这对于电池供电的传感器节点至关重要。以下是几种行之有效的优化方案1. 深度睡眠Deep Sleep这是最有效的省电方式。ESP8266在深度睡眠模式下电流可降至20μA左右。实现方法将ESP8266的GPIO16引脚与RST引脚连接。在代码中使用ESP.deepSleep(sleep_time_in_us)让模块进入深度睡眠。到达设定时间后GPIO16的拉低会触发RST使模块重启。工作流程节点上电 - 连接Wi-Fi - 读取传感器 - 发送数据 - 进入深度睡眠例如10分钟- 自动唤醒并重复。注意事项深度睡眠期间整个系统包括Arduino会断电重启。因此需要将传感器电源也由ESP8266的某个GPIO控制在读取前上电睡眠前断电。或者选择在深度睡眠时功耗也极低的传感器。2. 使用Arduino管理电源让Arduino作为主控通过MOSFET或三极管开关电路来控制ESP8266和传感器的电源。大部分时间只有Arduino处于极低功耗的休眠状态使用LowPower库定时唤醒后才给ESP8266和传感器上电完成数据采集和发送后再切断它们的电源。3. 电源方案旧手机充电器正如作者所说这是最稳定可靠的方案适合有固定电源的位置。电池太阳能板对于户外节点可以使用18650锂电池3.7V配合小功率太阳能板如6V 2W和充电管理模块如TP4056。ESP8266和Arduino都需要3.3V工作所以需要一个高效的DC-DC降压模块如MP1584EN将电池电压稳定到3.3V。超级电容对于需要瞬时较大电流如Wi-Fi发射但平均功耗很低的场景可以用超级电容作为缓冲。太阳能板持续为超级电容涓流充电发送数据时由超级电容提供峰值电流。这需要精心的电路设计。一个典型的低功耗节点代码框架基于NodeMCU/ESP8266独裁模式#include ESP8266WiFi.h #include DHT.h #define DHTPIN 2 DHT dht(DHTPIN, DHT11); const char* ssid SensorNet; const char* password your_password; const char* host 192.168.4.1; const int httpPort 8080; void setup() { Serial.begin(115200); dht.begin(); // 连接Wi-Fi WiFi.begin(ssid, password); while (WiFi.status() ! WL_CONNECTED) { delay(500); } // 读取并发送数据 float h dht.readHumidity(); float t dht.readTemperature(); sendDataToServer(t, h); // 进入深度睡眠睡眠20分钟20 * 60 * 1e6 微秒 // 注意GPIO16需连接RST引脚 ESP.deepSleep(20 * 60 * 1000000); } void loop() { // Deep Sleep模式下代码不会运行到这里 } void sendDataToServer(float temp, float humi) { // ... (HTTP客户端发送代码类似前文但使用WiFiClient库) ... }5. 部署、调试与问题排查实录5.1 硬件组装与部署要点焊接与连接对于长期部署强烈建议将Arduino最小系统或NodeMCU、ESP8266模块如果分体、电平转换模块和传感器接口焊接在万用板或定制PCB上并用热熔胶或3D打印外壳固定。面包板只适合原型验证。天线放置确保ESP8266的天线部分模块上划出的区域不要被金属外壳完全包裹或紧贴墙壁尽量朝向树莓派网关的方向。电源滤波在ESP8266的电源引脚附近并联一个100μF的电解电容和一个0.1μF的陶瓷电容可以有效抑制其发射Wi-Fi信号时产生的电源尖峰噪声防止系统复位。部署测试先将节点放在网关旁边测试通信然后逐步移到目标位置观察信号强度RSSI。树莓派上可以用iwconfig命令查看连接的客户端信号质量。如果信号弱如低于-70dBm考虑调整节点或网关天线位置或增加中继节点。5.2 软件调试与日志记录节点端调试充分利用Arduino的串口监视器。在代码中大量使用Serial.print()输出关键状态如Wi-Fi连接状态、接收到的AT指令响应、传感器读数、HTTP响应码等。网关端调试Flask服务开启debugTrue模式仅限测试可以查看详细的请求日志。使用sudo tail -f /var/log/syslog查看系统日志。在Python代码中将接收到的数据和时间戳打印到控制台或写入单独的日志文件。网络诊断在树莓派上使用ping 192.168.4.101测试是否能到达节点。使用curl命令模拟节点发送请求curl -X POST http://192.168.4.101/data -H Content-Type: application/json -d {temp:25}直接在树莓派上测试节点服务是否正常。使用mosquitto_sub和mosquitto_pub命令测试MQTT服务。5.3 常见问题与解决方案速查表问题现象可能原因排查步骤与解决方案ESP8266无法连接Wi-Fi1. SSID/密码错误。2. 电源不稳定。3. 路由器/热点频道不支持。4. 距离太远或信号差。1. 检查代码中的SSID和密码注意大小写和特殊字符。2. 用万用表测量ESP8266的VCC引脚电压在发射时应稳定在3.3V以上。使用外部电源。3. 将树莓派热点设置为2.4GHz频道设为1、6或11。4. 拉近距离或调整天线。AT指令无响应或乱码1. 波特率不匹配。2. TX/RX接反。3. 未共地。4. 需要发送换行符。1. 确保Serial.begin()和esp8266.begin()的波特率一致常见为115200或9600。2. 检查连接Arduino的TX应接ESP8266的RX反之亦然。3. 确认Arduino的GND和ESP8266的GND已连接。4. 发送AT指令时使用println()而非print()。节点能连Wi-Fi但无法连接服务器1. 树莓派网关服务未运行或端口错误。2. 防火墙阻止了端口。3. 节点代码中的服务器IP或端口错误。1. 在树莓派上运行sudo netstat -tlnp查看8080端口是否被Python进程监听。2. 运行sudo ufw allow 8080开放端口。3. 检查节点代码中的host和httpPort变量。数据发送不稳定偶尔丢失1. 网络拥堵或干扰。2. 服务器处理超时。3. 电源在发送瞬间跌落。1. 更换Wi-Fi频道避开拥挤的频道。2. 在节点代码中增加重试机制例如发送失败后延迟几秒重试。3. 加强电源滤波加大电容并确保电源功率充足。深度睡眠后无法唤醒1. GPIO16与RST引脚未连接或虚焊。2. 睡眠时间设置过长超出深度睡眠定时器上限约3.5小时。3. 电源在睡眠期间无法维持。1. 用万用表检查GPIO16和RST引脚之间的连通性。2. 如果需要更长间隔可以在Arduino端用定时中断唤醒再由Arduino控制ESP8266上电。3. 检查电池电量或电源连接。树莓派热点不稳定设备频繁断开1. 树莓派供电不足。2. 散热不良导致CPU降频。3.hostapd配置问题。1. 使用官方推荐的5V/3A电源适配器。2. 为树莓派加装散热片或风扇。3. 检查/etc/hostapd/hostapd.conf配置确保channel、hw_mode设置正确。可尝试固定频道。5.4 扩展与进阶思路这个基础框架有巨大的扩展潜力更多传感器接入MQ系列气体传感器、超声波测距、振动传感器、水浸传感器等。执行器控制在节点上连接继电器模块通过网关下发指令实现远程开关灯、风扇、窗帘等。边缘计算在Arduino端对传感器数据进行简单的预处理如滤波、阈值判断只上报异常数据或聚合数据减少网络流量和网关压力。使用LoRa进行远距离回传对于距离网关几百米甚至几公里的节点可以用ArduinoLoRa模块代替ESP8266进行远距离通信再通过一个LoRa网关也可以是另一个带LoRa的树莓派将数据汇入主网络。容器化部署在树莓派上使用Docker来运行网关服务、数据库如InfluxDB、可视化工具如Grafana使得服务管理和迁移更加方便。搭建这样一个网络最享受的过程不是它最终能稳定运行而是在调试过程中你不得不去深入理解从硬件链路、网络协议到软件服务的每一个环节。当第一个节点的数据成功出现在你手机上的图表里时那种成就感是无可替代的。它不再是一个黑盒产品而是一个从零件开始由你亲手赋予生命的系统。