演示环境搭建指南
演示环境搭建指南
本节提供设置完整物联网演示环境的逐步指南。通过本节学习,你将能够:
- 使用Docker Compose在10分钟内部署完整的物联网后端技术栈
- 验证每个组件是否正常工作
- 执行基本的MQTT发布-订阅测试
- 访问Node-RED、InfluxDB和Grafana界面
- 为客户演示准备环境
开始之前,请确保以下条件满足:
- Docker(24.0或更新版本):安装Docker
- Docker Compose(2.20或更新版本):包含在Docker Desktop中,或在Linux上单独安装
- 一台计算机,至少4 GB RAM和10 GB可用磁盘空间
- 互联网连接,用于拉取容器镜像(首次设置:约1 GB下载)
- ESP32开发板(初始测试可选,MQTT客户端工具可模拟设备)
- Fly平台(可选):也可以使用 Fly平台 部署服务器环境,替代本地Docker运行
验证Docker安装
Section titled “验证Docker安装”打开终端并执行:
docker --versiondocker compose version预期输出(版本可能有所不同):
Docker version 27.0.0, build abcdef1Docker Compose version v2.29.0如果未安装Docker,请从 docker.com 下载Docker Desktop并按照安装向导操作。
第一步:创建项目目录
Section titled “第一步:创建项目目录”为演示环境创建一个目录:
mkdir ~/iot-democd ~/iot-demo第二步:创建Docker Compose配置
Section titled “第二步:创建Docker Compose配置”在 ~/iot-demo 目录中创建一个名为 docker-compose.yml 的文件:
version: "3.8"
services: # MQTT Broker mosquitto: image: eclipse-mosquitto:2 container_name: mosquitto ports: - "1883:1883" - "8883:8883" volumes: - ./mosquitto/config:/mosquitto/config - ./mosquitto/data:/mosquitto/data - ./mosquitto/log:/mosquitto/log restart: unless-stopped
# Node-RED自动化引擎 nodered: image: nodered/node-red:4 container_name: nodered ports: - "1880:1880" volumes: - ./nodered/data:/data environment: - TZ=UTC restart: unless-stopped depends_on: - mosquitto
# InfluxDB时序数据库 influxdb: image: influxdb:2 container_name: influxdb ports: - "8086:8086" volumes: - ./influxdb/data:/var/lib/influxdb2 - ./influxdb/config:/etc/influxdb2 environment: - DOCKER_INFLUXDB_INIT_MODE=setup - DOCKER_INFLUXDB_INIT_USERNAME=admin - DOCKER_INFLUXDB_INIT_PASSWORD=admin123 - DOCKER_INFLUXDB_INIT_ORG=iot-demo - DOCKER_INFLUXDB_INIT_BUCKET=sensor-data - DOCKER_INFLUXDB_INIT_RETENTION=30d restart: unless-stopped
# Grafana可视化 grafana: image: grafana/grafana:11 container_name: grafana ports: - "3000:3000" volumes: - ./grafana/data:/var/lib/grafana - ./grafana/config:/etc/grafana environment: - GF_SECURITY_ADMIN_USER=admin - GF_SECURITY_ADMIN_PASSWORD=admin123 - GF_INSTALL_PLUGINS= restart: unless-stopped depends_on: - influxdb配置说明:
- MQTT Broker暴露在1883端口(未加密)用于本地开发。生产环境请使用8883端口配合TLS。
- InfluxDB初始化为演示组织、Bucket和凭证。生产环境应更改这些设置。
- Grafana预配置了管理员凭证。任何非演示用途请更改这些设置。
- 所有服务使用持久化卷,以便数据在容器重启后保留。
第三步:创建Mosquitto配置
Section titled “第三步:创建Mosquitto配置”创建Mosquitto配置目录和文件:
mkdir -p mosquitto/config创建 mosquitto/config/mosquitto.conf:
# IoT演示Mosquitto配置listener 1883protocol mqtt
# 允许匿名访问(仅用于演示)allow_anonymous true
# 持久化persistence truepersistence_location /mosquitto/data/
# 日志log_dest file /mosquitto/log/mosquitto.loglog_dest stdoutlog_type all
# 最大连接数max_connections 1000重要安全说明: 上述配置允许匿名访问仅用于演示目的。在任何生产或面向互联网的部署中,始终:
- 设置
allow_anonymous false - 配置用户名/密码认证
- 使用TLS加密(详见MQTT TLS安全通信章节)
创建数据目录:
mkdir -p mosquitto/data mosquitto/log第四步:启动技术栈
Section titled “第四步:启动技术栈”启动所有服务:
cd ~/iot-demodocker compose up -dDocker将拉取所有镜像(仅首次)并启动容器。这通常需要2-5分钟,具体取决于网络速度。
预期输出:
[+] Running 5/5 ✔ Container mosquitto Started ✔ Container influxdb Started ✔ Container nodered Started ✔ Container grafana Started检查所有容器的状态:
docker compose ps预期输出:
NAME IMAGE STATUS PORTSmosquitto eclipse-mosquitto:2 Up 2 minutes 0.0.0.0:1883->1883/tcp, 0.0.0.0:8883->8883/tcpnodered nodered/node-red:4 Up 2 minutes 0.0.0.0:1880->1880/tcpinfluxdb influxdb:2 Up 2 minutes 0.0.0.0:8086->8086/tcpgrafana grafana/grafana:11 Up 2 minutes 0.0.0.0:3000->3000/tcp第五步:配置InfluxDB
Section titled “第五步:配置InfluxDB”InfluxDB会根据 docker-compose.yml 中指定的凭证自动初始化。验证方式:
- 打开浏览器并访问
http://localhost:8086 - 使用用户名
admin和密码admin123登录 - 你应该看到显示
sensor-dataBucket的InfluxDB UI
如果自动设置未完成(首次初始化可能存在时序敏感问题),请手动完成:
- 点击”Get Started”
- 输入:用户名
admin,密码admin123,组织iot-demo,Bucketsensor-data - 点击”Continue”
获取API令牌(Node-RED写入数据时需要):
docker exec influxdb influx auth list --org iot-demo复制令牌字符串(一个长十六进制值)。请保存好——后续章节配置Node-RED时会用到。
第六步:访问Node-RED
Section titled “第六步:访问Node-RED”- 打开浏览器并访问
http://localhost:1880 - 你应该看到Node-RED流程编辑器界面
- 默认未配置身份验证(生产环境请启用管理员认证)
快速验证测试:
- 将一个”Inject”节点(从左侧面板)拖到工作区
- 将一个”Debug”节点拖到工作区
- 将Inject节点的输出连接到Debug节点的输入
- 点击”Deploy”按钮(右上角)
- 点击Inject节点左侧的按钮
- 检查Debug侧边栏(右侧面板)——你应该看到
timestamp消息出现
第七步:访问Grafana
Section titled “第七步:访问Grafana”- 打开浏览器并访问
http://localhost:3000 - 使用用户名
admin和密码admin123登录 - Grafana会提示更改密码——演示目的请点击”Skip”
添加InfluxDB作为数据源:
- 进入 Connections → Data Sources → Add data source
- 搜索并选择”InfluxDB”
- 配置:
- Query Language:Flux
- URL:
http://influxdb:8086(使用Docker服务名,不是localhost) - Organization:
iot-demo - Token:(粘贴第五步获取的令牌)
- Default Bucket:
sensor-data
- 点击”Save & Test”——你应该看到”Data source is working”的确认信息
第八步:测试MQTT通信
Section titled “第八步:测试MQTT通信”为验证MQTT Broker是否正常工作,使用MQTT命令行工具或MQTT Explorer。
使用mosquitto_pub/sub(命令行)
Section titled “使用mosquitto_pub/sub(命令行)”如果尚未安装MQTT客户端:
# macOSbrew install mosquitto
# Ubuntu/Debiansudo apt-get install mosquitto-clients在一个终端中订阅测试主题:
mosquitto_sub -h localhost -p 1883 -t "demo/test" -v在另一个终端中发布测试消息:
mosquitto_pub -h localhost -p 1883 -t "demo/test" -m '{"message":"Hello IoT Demo","timestamp":1712345678}'订阅者终端应显示:
demo/test {"message":"Hello IoT Demo","timestamp":1712345678}使用MQTT Explorer(图形界面)
Section titled “使用MQTT Explorer(图形界面)”MQTT Explorer 是一款免费的桌面应用程序,提供可视化界面:
- 下载并安装MQTT Explorer
- 创建新连接:
- Host:
localhost - Port:
1883 - 无需用户名/密码(匿名)
- Host:
- 点击”Connect”
- 当数据流经Broker时,你将看到所有主题的实时视图
- 你也可以直接从界面发布测试消息
第九步:在Node-RED中模拟传感器数据
Section titled “第九步:在Node-RED中模拟传感器数据”为演示没有物理硬件的数据管道,在Node-RED中创建模拟传感器流程:
- 在Node-RED中,点击标签名称旁的”+“创建新流程
- 添加以下节点:
- Inject节点(配置为每10秒重复一次)
- Function节点(生成随机传感器值)
- MQTT Out节点(发布到Broker)
配置 Inject 节点:
- Payload:
timestamp - Repeat:
interval,每10秒 - Name:
Every 10s
使用以下JavaScript代码配置 Function 节点:
// 生成模拟ESP32的随机传感器数据const sensorData = { device_id: "esp32_sim_01", temperature: Math.round((20 + Math.random() * 15) * 10) / 10, // 20-35°C humidity: Math.round((40 + Math.random() * 40) * 10) / 10, // 40-80% light: Math.round(Math.random() * 1000), // 0-1000 lux battery: Math.round((80 + Math.random() * 20) * 10) / 10, // 80-100% timestamp: Date.now()};
msg.payload = sensorData;msg.topic = "factory/zone1/environment";return msg;配置 MQTT Out 节点:
- Server:
localhost:1883(或使用Mosquitto Broker节点) - Topic:
factory/zone1/environment - QoS:
1 - Name:
Publish Sensor Data
连接:Inject → Function → MQTT Out
部署流程。你应该会在MQTT Explorer中看到数据出现在 factory/zone1/environment 主题下。
第十步:将模拟数据写入InfluxDB
Section titled “第十步:将模拟数据写入InfluxDB”要完成数据管道,添加InfluxDB存储:
- 安装InfluxDB节点面板:
- 点击汉堡菜单(右上角)→ Manage palette
- 进入”Install”标签
- 搜索
node-red-contrib-influxdb并安装
- 在流程中添加一个 InfluxDB Out 节点
- 配置InfluxDB节点:
- Server:创建新的InfluxDB服务器配置
- URL:
http://influxdb:8086 - Token:(粘贴第五步获取的InfluxDB API令牌)
- Organization:
iot-demo - Bucket:
sensor-data
- 连线:MQTT In → Function → InfluxDB Out
完整的极简流程现在看起来如下:
Inject (10s) → Function (生成数据) → MQTT Out (发布) ↓ MQTT In (订阅) → InfluxDB Out (存储)验证检查清单
Section titled “验证检查清单”完成所有步骤后,验证每个组件:
- Docker:所有4个容器都在运行(
docker compose ps) - Mosquitto:MQTT Broker接受1883端口的连接(
mosquitto_sub test) - Node-RED:流程编辑器可在
http://localhost:1880访问 - InfluxDB:Web UI可在
http://localhost:8086访问,sensor-dataBucket存在 - Grafana:可在
http://localhost:3000登录,InfluxDB数据源已配置 - 数据管道:模拟传感器数据从Inject → InfluxDB(在InfluxDB Data Explorer中可见)
停止演示环境:
cd ~/iot-demodocker compose down停止并删除所有数据(全新开始):
cd ~/iot-demodocker compose down -vrm -rf mosquitto/data mosquitto/log nodered/data influxdb/data grafana/data容器启动失败
Section titled “容器启动失败”症状:docker compose up -d 返回一个或多个容器的退出代码。
检查日志:
docker compose logs <service-name>常见原因:端口已被占用。
# 检查哪个进程使用了1883端口lsof -i :1883# 停止冲突服务或在docker-compose.yml中更改端口映射无法连接到MQTT Broker
Section titled “无法连接到MQTT Broker”症状:mosquitto_sub 返回”Connection refused”。
验证Broker是否在运行:
docker compose ps mosquitto检查Mosquitto日志:
docker compose logs mosquitto尝试使用详细输出连接:
mosquitto_sub -h localhost -p 1883 -t "test" -dNode-RED无法访问InfluxDB
Section titled “Node-RED无法访问InfluxDB”症状:InfluxDB Out节点显示”Connection error”。
确保两者在同一Docker网络上——Docker Compose自动为所有服务创建网络,因此在InfluxDB节点配置中使用服务名 influxdb(而不是 localhost)可解决此问题。
Grafana面板显示”No data”
Section titled “Grafana面板显示”No data””症状:仪表板面板显示”No data”或”Query error”。
检查:
- InfluxDB数据源是否配置了正确的URL?使用
http://influxdb:8086(而不是localhost)。 - 令牌是否正确?(使用
docker exec influxdb influx auth list获取) - Bucket中是否有数据点?在InfluxDB Data Explorer中检查。
- 查询是否使用了正确的Bucket名称?默认为
sensor-data。
演示环境硬件套件(可选)
Section titled “演示环境硬件套件(可选)”如需完整的物理硬件演示体验,推荐以下组件:
| 组件 | 推荐型号 | 约价 | 搜索词 |
|---|---|---|---|
| ESP32板 | ESP32 DevKit V1 | $5-8 | ”ESP32 WiFi Bluetooth Development Board” |
| 温度传感器 | DHT22 | $3-5 | ”DHT22 Temperature Humidity Sensor Module” |
| 光照传感器 | BH1750 | $2-4 | ”BH1750 Light Intensity Sensor Module GY-302” |
| 继电器模块 | 2路5V继电器 | $3-6 | ”5V 2-Channel Relay Module Optocoupler” |
| 面包板+导线 | 830孔面包板 | $5-8 | ”Breadboard 830 Points + 65 Jumper Wires” |
| USB线 | USB-A转Micro-USB | $2-4 | ”USB to Micro USB Data Cable for ESP32” |
| 总计 | $20-35 |
此硬件套件可演示:
- 温度和湿度监控(DHT22 → ESP32 → MQTT → Grafana)
- 基于光照的自动化(BH1750 → ESP32 → MQTT → 继电器控制)
- 简单开/关控制(Node-RED → MQTT → ESP32 → 继电器 → LED)
本节提供了完整、可重复的物联网演示环境设置:
- 部署了一个4服务的Docker技术栈(Mosquitto、Node-RED、InfluxDB、Grafana)
- 为演示用途配置了每个服务的适当设置
- 使用CLI工具和MQTT Explorer验证了MQTT通信
- 创建了从Node-RED到InfluxDB的模拟传感器数据管道
- 为客户演示准备好环境
整个设置过程只需不到10分钟,且仅需宿主机上的Docker。此环境将贯穿整个培训,支持基于项目的章节(第02-05章、第10-14章)。