核心概念:它如何工作?
我们要理解这个系统的架构,它通常由三部分组成:

-
本地端:
- Arduino: 连接传感器(如温湿度、光照)或执行器(如继电器、LED),它负责读取数据或控制设备。
- XBee 模块: 作为无线收发器,负责将 Arduino 处理好的数据打包,通过无线电波发送出去。
-
网关/中间件:
- 这是连接无线世界和互联网世界的关键桥梁,它需要一个能同时与 XBee 和互联网 通信的设备。
- 常用网关设备: 树莓派、ESP8266/ESP32、另一块 Arduino + Ethernet Shield/Wi-Fi Shield。
- 网关作用:
- 通过 串口 与 XBee 通信,接收来自 Arduino 的数据。
- 通过 以太网 或 Wi-Fi 将数据发送到互联网上的服务器(如 MQTT Broker、HTTP 服务器)。
- 也可以接收来自互联网的指令,并通过 XBee 发送给 Arduino。
-
云端/互联网服务:
- MQTT Broker: 这是最推荐的方式,它是一个轻量级的发布/订阅消息服务器,你的网关作为“发布者”(Publisher)把数据发布到某个“主题”(Topic)上,其他设备或应用程序(如手机App、网页)可以“订阅”(Subscribe)这个主题来实时获取数据。
- HTTP 服务器: 网关可以直接向一个公网 API 地址发送一个 HTTP 请求(POST),将数据上传到你的服务器或云平台(如 ThingSpeak, Blynk, Ubidots)。
- WebSocket / TCP Socket: 更底层的通信方式,可以实现双向实时通信。
数据流向图:

[传感器] -> [Arduino] --(串口)--> [XBee模块] --(无线Zigbee)--> [XBee模块] <--(串口)--> [网关(如树莓派)] --(Wi-Fi/以太网)--> [互联网(MQTT/HTTP服务器)]
^
|
[手机App/网页/数据库] <--(订阅/请求)--
硬件准备
本地端硬件
- Arduino 板: Arduino Uno, Nano, Mega 等均可。
- XBee 模块: 建议使用 XBee S2C 或 XBee 3 系列,它们功能更强大,支持更多网络模式。
- XBee 适配器: 用于在电脑上配置 XBee 模块,推荐 XBee Explorer USB 或 XBee Explorer Regulated。
- 传感器: DHT11/DHT22 (温湿度)、光敏电阻、土壤湿度传感器等。
- 杜邦线、面包板。
网关端硬件 (选择一种)
- 方案 A (推荐,功能强大): 树莓派,它有完整的操作系统,可以轻松运行 Python 脚本来处理串口和网络通信。
- 方案 B (低成本,集成度高): ESP8266 (NodeMCU) 或 ESP32,它本身就是一块带 Wi-Fi 的微控制器,可以直接充当网关,无需额外的电脑或树莓派。
- 方案 C (传统): 另一块 Arduino + 以太网 Shield (如 W5100) 或 Wi-Fi Shield (如 ESP8266 Shield)。
软件配置与步骤
步骤 1: 配置 XBee 模块 (关键步骤)
你需要两个 XBee 模块,一个给 Arduino 端,一个给网关端。
- 安装 XCTU 软件: 这是 Digi 官方提供的免费配置工具,用于配置 XBee 参数。
- 连接 XBee: 将一个 XBee 模块插入 XBee 适配器,连接到电脑。
- 发现和配置:
- 在 XCTU 中添加该 XBee 模块。
- 配置本地端 XBee (连接 Arduino):
- CE (Coordinator Enable): 设置为
0(作为终端设备 End Device)。 - DH (Destination Address High) 和 DL (Destination Address Low): 设置为网关端 XBee 的 MAC 地址,这样它就知道数据该发给谁。
- MY (My Address): 设置一个唯一的 16 位地址。
- AP (Association Indication): 设置为
2(当关联成功时,从 DOUT 引脚输出数据)。 - BD (Baud Rate): 设置为
9600(或与 Arduino 串口波特率一致)。
- CE (Coordinator Enable): 设置为
- 配置网关端 XBee (连接网关):
- CE (Coordinator Enable): 设置为
1(作为协调器 Coordinator)。 - MY (My Address): 设置一个与本地端不同的 16 位地址。
- BD (Baud Rate): 设置为
9600(或与网关串口波特率一致)。 - 其他参数可以保持默认或根据需要调整。
- CE (Coordinator Enable): 设置为
- 将配置写入 XBee: 点击 "Write" 按钮将设置保存到两个模块中。
步骤 2: 编写 Arduino 端代码
这个代码非常简单,Arduino 只负责读取传感器并通过串口发送数据。
// Arduino 端代码
#include <DHT.h>
// 定义引脚和传感器类型
#define DHTPIN 2
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
void setup() {
// 启动串口,波特率必须与 XBee 配置的 BD 一致
Serial.begin(9600);
dht.begin();
Serial.println("Arduino XBee Sensor Ready");
}
void loop() {
// 读取传感器数据
float humidity = dht.readHumidity();
float temperature = dht.readTemperature();
// 检查读取是否成功
if (isnan(humidity) || isnan(temperature)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
// 计算热指数
float heatIndex = dht.computeHeatIndex(temperature, humidity, false);
// 将数据格式化为字符串,用逗号分隔
// "TEMP:25.00,HUM:50.00"
String dataString = "TEMP:" + String(temperature) + ",HUM:" + String(humidity);
// 通过串口发送数据
// XBee 会自动接收这个数据并发送给配置好的目标地址
Serial.println(dataString);
// 发送间隔,不要太频繁
delay(5000);
}
步骤 3: 编写网关端代码 (以树莓派为例)
树莓派将使用 Python 来读取串口数据,并通过 MQTT 协议发送到云端。
-
准备树莓派:
(图片来源网络,侵删)- 安装 Raspberry Pi OS。
- 启用 SSH 和 VNC。
- 连接网线或 Wi-Fi。
- 连接 XBee 模块到树莓派的 USB 转串口模块 (如 CP2102),通常对应
/dev/ttyUSB0。
-
安装必要的 Python 库:
sudo apt-get update sudo apt-get install python3-pip pip3 install paho-mqtt pyserial
-
编写 Python 网关脚本 (
gateway.py):
import serial
import paho.mqtt.client as mqtt
import time
# --- 配置 ---
XBEE_PORT = '/dev/ttyUSB0' # 根据实际情况修改
XBEE_BAUDRATE = 9600
MQTT_BROKER = "broker.hivemq.com" # 一个公共的 MQTT Broker
MQTT_PORT = 1883
MQTT_TOPIC = "myiot/project1/data" # 你的数据主题
# --- 初始化 ---
ser = serial.Serial(XBEE_PORT, XBEE_BAUDRATE)
print(f"Connected to XBee on {XBEE_PORT}")
# --- MQTT 回调函数 ---
def on_connect(client, userdata, flags, rc):
if rc == 0:
print("Connected to MQTT Broker!")
else:
print(f"Failed to connect, return code {rc}\n")
def on_publish(client, userdata, mid):
print(f"Message {mid} published.")
# --- 主程序 ---
try 