跳转到内容

演示环境搭建指南

演示环境搭建指南

本节提供设置完整物联网演示环境的逐步指南。通过本节学习,你将能够:

  • 使用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运行

打开终端并执行:

Terminal window
docker --version
docker compose version

预期输出(版本可能有所不同):

Docker version 27.0.0, build abcdef1
Docker Compose version v2.29.0

如果未安装Docker,请从 docker.com 下载Docker Desktop并按照安装向导操作。

为演示环境创建一个目录:

Terminal window
mkdir ~/iot-demo
cd ~/iot-demo

~/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配置目录和文件:

Terminal window
mkdir -p mosquitto/config

创建 mosquitto/config/mosquitto.conf

# IoT演示Mosquitto配置
listener 1883
protocol mqtt
# 允许匿名访问(仅用于演示)
allow_anonymous true
# 持久化
persistence true
persistence_location /mosquitto/data/
# 日志
log_dest file /mosquitto/log/mosquitto.log
log_dest stdout
log_type all
# 最大连接数
max_connections 1000

重要安全说明: 上述配置允许匿名访问仅用于演示目的。在任何生产或面向互联网的部署中,始终:

  • 设置 allow_anonymous false
  • 配置用户名/密码认证
  • 使用TLS加密(详见MQTT TLS安全通信章节)

创建数据目录:

Terminal window
mkdir -p mosquitto/data mosquitto/log

启动所有服务:

Terminal window
cd ~/iot-demo
docker compose up -d

Docker将拉取所有镜像(仅首次)并启动容器。这通常需要2-5分钟,具体取决于网络速度。

预期输出:

[+] Running 5/5
✔ Container mosquitto Started
✔ Container influxdb Started
✔ Container nodered Started
✔ Container grafana Started

检查所有容器的状态:

Terminal window
docker compose ps

预期输出:

NAME IMAGE STATUS PORTS
mosquitto eclipse-mosquitto:2 Up 2 minutes 0.0.0.0:1883->1883/tcp, 0.0.0.0:8883->8883/tcp
nodered nodered/node-red:4 Up 2 minutes 0.0.0.0:1880->1880/tcp
influxdb influxdb:2 Up 2 minutes 0.0.0.0:8086->8086/tcp
grafana grafana/grafana:11 Up 2 minutes 0.0.0.0:3000->3000/tcp

InfluxDB会根据 docker-compose.yml 中指定的凭证自动初始化。验证方式:

  1. 打开浏览器并访问 http://localhost:8086
  2. 使用用户名 admin 和密码 admin123 登录
  3. 你应该看到显示 sensor-data Bucket的InfluxDB UI

如果自动设置未完成(首次初始化可能存在时序敏感问题),请手动完成:

  1. 点击”Get Started”
  2. 输入:用户名 admin,密码 admin123,组织 iot-demo,Bucket sensor-data
  3. 点击”Continue”

获取API令牌(Node-RED写入数据时需要):

Terminal window
docker exec influxdb influx auth list --org iot-demo

复制令牌字符串(一个长十六进制值)。请保存好——后续章节配置Node-RED时会用到。

  1. 打开浏览器并访问 http://localhost:1880
  2. 你应该看到Node-RED流程编辑器界面
  3. 默认未配置身份验证(生产环境请启用管理员认证)

快速验证测试:

  1. 将一个”Inject”节点(从左侧面板)拖到工作区
  2. 将一个”Debug”节点拖到工作区
  3. 将Inject节点的输出连接到Debug节点的输入
  4. 点击”Deploy”按钮(右上角)
  5. 点击Inject节点左侧的按钮
  6. 检查Debug侧边栏(右侧面板)——你应该看到 timestamp 消息出现
  1. 打开浏览器并访问 http://localhost:3000
  2. 使用用户名 admin 和密码 admin123 登录
  3. Grafana会提示更改密码——演示目的请点击”Skip”

添加InfluxDB作为数据源:

  1. 进入 Connections → Data Sources → Add data source
  2. 搜索并选择”InfluxDB”
  3. 配置:
    • Query Language:Flux
    • URL:http://influxdb:8086(使用Docker服务名,不是localhost)
    • Organization:iot-demo
    • Token:(粘贴第五步获取的令牌)
    • Default Bucket:sensor-data
  4. 点击”Save & Test”——你应该看到”Data source is working”的确认信息

为验证MQTT Broker是否正常工作,使用MQTT命令行工具或MQTT Explorer。

如果尚未安装MQTT客户端:

Terminal window
# macOS
brew install mosquitto
# Ubuntu/Debian
sudo apt-get install mosquitto-clients

在一个终端中订阅测试主题:

Terminal window
mosquitto_sub -h localhost -p 1883 -t "demo/test" -v

在另一个终端中发布测试消息:

Terminal window
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 是一款免费的桌面应用程序,提供可视化界面:

  1. 下载并安装MQTT Explorer
  2. 创建新连接:
    • Host:localhost
    • Port:1883
    • 无需用户名/密码(匿名)
  3. 点击”Connect”
  4. 当数据流经Broker时,你将看到所有主题的实时视图
  5. 你也可以直接从界面发布测试消息

第九步:在Node-RED中模拟传感器数据

Section titled “第九步:在Node-RED中模拟传感器数据”

为演示没有物理硬件的数据管道,在Node-RED中创建模拟传感器流程:

  1. 在Node-RED中,点击标签名称旁的”+“创建新流程
  2. 添加以下节点:
    • 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存储:

  1. 安装InfluxDB节点面板:
    • 点击汉堡菜单(右上角)→ Manage palette
    • 进入”Install”标签
    • 搜索 node-red-contrib-influxdb 并安装
  2. 在流程中添加一个 InfluxDB Out 节点
  3. 配置InfluxDB节点:
    • Server:创建新的InfluxDB服务器配置
    • URL:http://influxdb:8086
    • Token:(粘贴第五步获取的InfluxDB API令牌)
    • Organization:iot-demo
    • Bucket:sensor-data
  4. 连线:MQTT In → Function → InfluxDB Out

完整的极简流程现在看起来如下:

Inject (10s) → Function (生成数据) → MQTT Out (发布)
MQTT In (订阅) → InfluxDB Out (存储)

完成所有步骤后,验证每个组件:

  • Docker:所有4个容器都在运行(docker compose ps
  • Mosquitto:MQTT Broker接受1883端口的连接(mosquitto_sub test
  • Node-RED:流程编辑器可在 http://localhost:1880 访问
  • InfluxDB:Web UI可在 http://localhost:8086 访问,sensor-data Bucket存在
  • Grafana:可在 http://localhost:3000 登录,InfluxDB数据源已配置
  • 数据管道:模拟传感器数据从Inject → InfluxDB(在InfluxDB Data Explorer中可见)

停止演示环境:

Terminal window
cd ~/iot-demo
docker compose down

停止并删除所有数据(全新开始):

Terminal window
cd ~/iot-demo
docker compose down -v
rm -rf mosquitto/data mosquitto/log nodered/data influxdb/data grafana/data

症状docker compose up -d 返回一个或多个容器的退出代码。

检查日志

Terminal window
docker compose logs <service-name>

常见原因:端口已被占用。

Terminal window
# 检查哪个进程使用了1883端口
lsof -i :1883
# 停止冲突服务或在docker-compose.yml中更改端口映射

症状mosquitto_sub 返回”Connection refused”。

验证Broker是否在运行

Terminal window
docker compose ps mosquitto

检查Mosquitto日志

Terminal window
docker compose logs mosquitto

尝试使用详细输出连接

Terminal window
mosquitto_sub -h localhost -p 1883 -t "test" -d

症状:InfluxDB Out节点显示”Connection error”。

确保两者在同一Docker网络上——Docker Compose自动为所有服务创建网络,因此在InfluxDB节点配置中使用服务名 influxdb(而不是 localhost)可解决此问题。

症状:仪表板面板显示”No data”或”Query error”。

检查

  1. InfluxDB数据源是否配置了正确的URL?使用 http://influxdb:8086(而不是 localhost)。
  2. 令牌是否正确?(使用 docker exec influxdb influx auth list 获取)
  3. Bucket中是否有数据点?在InfluxDB Data Explorer中检查。
  4. 查询是否使用了正确的Bucket名称?默认为 sensor-data

如需完整的物理硬件演示体验,推荐以下组件:

组件推荐型号约价搜索词
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章)。