用 Claude Code 搭建农业物联网监测平台,我的核心判断是:不要把 AI 当成一键生成完整项目的工具,而是把它当成一个在终端里帮你写代码的协作工程师。这个场景非常适合做成一个完整案例,因为农业物联网覆盖面很广——数据采集、后端存储、前端图表、设备控制、报警通知,每一段都可以让 AI 参与,但又需要你不断做判断。
适合谁看?如果你已经会一点 Python、JavaScript,但没真正做过物联网项目;或者你正在用 Claude Code 写工作代码,想看看怎么从零搭一个可运行的系统,这一篇可以当路线图。我会按实际落地顺序拆:先确认需求边界,再装好 Claude Code,然后用它生成后端、前端和数据模拟脚本,接着跑通数据链路,最后补充硬件接入、部署和排错经验。
项目标题里说“100个案例”,我这一篇先不贪多,就把农业物联网监测平台这一个案例做扎实。目标不是生成一堆代码文件就结束,而是让你拿到一个能启动、能访问、能上报数据、能看图表、能下指令的最小系统。下面直接从最容易被忽略的需求拆分开始。
1. 动手之前,先想清楚用 Claude Code 做什么
1.1 Claude Code 到底是什么
Claude Code 是 Anthropic 提供的命令行 AI 编程代理,它运行在终端里,可以读取项目目录、生成文件、修改代码、执行命令,也能根据报错信息自己定位问题。它和网页端聊天最大的区别是:它知道你当前项目长什么样,改动是落在真实文件里的,不是给你一段复制粘贴就结束。
很多人在安装完 Claude Code 之后,第一个反应是把它当成一个聊天窗,问“帮我写一个农业物联网平台”,然后等着它一次性输出几百行代码。实际体验下来,这种方式最容易翻车。因为没有具体的文件路径、技术栈和数据结构时,它写出来的代码要么太通用,要么绕远路。
我更建议把 Claude Code 当结对工程师来用:你来拆需求、定边界、验收结果,它负责把想法变成代码。这样才能发挥它真正的价值。
1.2 农业物联网监测平台都有哪些模块
农业物联网监测平台,典型应用场景是温室大棚、大田种植、水产养殖或者仓储环境监测。不管场景怎么变,核心模块基本一致:
- 数据采集:温湿度、土壤湿度、光照强度、CO2 浓度、pH 值等。
- 数据上报:传感器采集到的数据要定时传到服务器。
- 数据存储:历史数据能查、能导、能分析。
- 数据展示:实时看板、历史曲线、异常报警。
- 设备控制:远程开关水泵、风机、卷帘、补光灯。
如果一开始就让 AI 把全部模块一起做,项目会变得非常大。我建议先砍掉一半:不接真实硬件,先做数据上报和展示,再加入阈值报警和模拟设备控制。等全链路跑通,再考虑硬件和复杂控制逻辑。
1.3 这一篇要完成的最小闭环
我给这个案例定的目标是:从空目录开始,用 Claude Code 生成一个可运行的 Web 监测平台。平台支持传感器模拟数据上报、实时状态看板、历史数据查询和导出、温湿度阈值报警、水泵远程开关模拟。
技术栈不追求新,选最容易让 AI 生成、也最容易本地跑起来的组合:
- 后端:Python + FastAPI,数据存储用 SQLite。
- 前端:HTML + JavaScript + ECharts,不用复杂框架。
- 模拟上报:Python 脚本定时生成温湿度、土壤湿度和光照数据。
- 部署:先本地跑,再给一个 Docker 示例。
这个组合的好处是依赖少、文件清晰、排错方便。Claude Code 在生成这类项目时成功率很高,你也能直接用浏览器打开看到效果。别一上来就用微服务、消息队列、K8s,那是在给自己增加麻烦。
2. 安装 Claude Code 并把它接进 VSCode
2.1 安装前置条件
Claude Code 本质上是一个 Node.js 全局命令行工具,所以第一步是准备 Node.js 环境。建议使用 Node.js 18 或更高版本,尽量直接装 LTS 版本。安装完成后,先确认 node 和 npm 都能正常执行:
node -v npm -v如果这两个命令都正常,再安装 Claude Code:
npm install -g @anthropic-ai/claude-code安装完成后,验证一下:
claude --version能输出版本号,说明安装成功。接下来还需要登录认证,也就是要有一个可以正常使用的 Claude 账号订阅或 API Key。具体开通方式和权限范围以官方说明为准,这里不展开。首次运行 claude 命令时,终端会引导你完成登录授权。
补充一点:Claude Code 需要能正常访问 Anthropic 服务,网络连通性、账号权限、订阅状态三样都要正常。如果哪一步卡住,先确认自己的实际网络和账号状态,再继续排查。我不建议在没有确认账号状态的情况下反复重装。
2.2 安装阶段最常见的几个报错
装这个工具翻车点不多,但我见到的报错就那么几类,按出现频率排一下:
提示 claude: command not found
通常是 npm 全局目录没有加到 PATH。运行npm config get prefix,看全局目录在哪里,然后把对应的 bin 目录添加到系统 PATH 里。Windows 用户可以在系统环境变量里加,macOS/Linux 用户改 shell 配置文件。安装过程中权限不足
macOS/Linux 上容易遇到 EACCES 权限错误。不要一言不合就加 sudo,优先检查 npm 全局目录的权限,或者改用 nvm 管理 Node.js,这样全局目录在用户目录下,权限问题会少很多。Node.js 版本过低
如果安装时报 engine 不匹配,直接升级 Node.js。用 nvm 重新装一个 LTS 版本,比在系统里改来改去干净。登录授权卡住
终端会给出一个授权链接和 code,有些终端复制不方便。你可以手动打开浏览器,把链接和 code 填进去。卡住时先确认网络和账号是否正常,不要反复刷新终端。
建议你把安装步骤记成一个脚本,以后换了新机器能复现。整理脚本本身就是和 Claude Code 协作的第一课:把环境要求写清楚,让 AI 帮你补全流程。
注意:如果启动过程中报错提示某个模型名不被当前版本识别,比如 “xxx is not a model this version of Claude Code recognizes”,先别急着重装。优先检查模型名称拼写、环境变量里是否指定了自定义模型,以及当前 Claude Code 版本是否需要更新。最常见的原因是配置里填了一个当前版本不支持的模型名。
2.3 在 VSCode 里使用 Claude Code
Claude Code 不依赖 VSCode,但我个人建议在 VSCode 的集成终端里用,理由是:Claude Code 能感知当前工作目录,你和它在同一个项目目录里工作,生成的文件会直接落到正确位置,不用来回切换。
操作很简单:
- 在 VSCode 里打开一个空文件夹,作为农业物联网平台的项目目录。
- 打开终端,注意终端路径已经切到当前项目目录。
- 运行
claude命令。
如果你发现在集成终端里显示中文乱码,先检查终端编码是不是 UTF-8。Windows 上有时候 PowerShell 或者其他 shell 的编码不匹配,会出现中文乱码,影响 Claude Code 读取报错和生成注释。建议优先使用 VSCode 默认 shell,并把文件格式保持为 UTF-8。
如果你更喜欢在独立终端里用,也可以。只是要养成一个习惯:每次开始任务前,先确认当前目录是项目根目录,而不是 home 目录。否则 Claude Code 会读不到你的项目文件,生成内容也会落到错误位置。
2.4 模型配置不要乱改
Claude Code 本身已经配置了可用的模型。除非你有明确需求,否则不要随意修改模型名。很多人从网上复制一段自定义配置,填了一个当前版本不支持的模型名,然后就启动失败。这个现象在 AI 编程工具里太常见了。
遇到模型相关报错,优先级是这样的:
- 还原配置文件,把模型名改回默认。
- 查看版本更新日志,确认当前版本支持哪些模型。
- 检查环境变量,比如是否设置了
ANTHROPIC_MODEL之类的项。 - 重新启动 claude。
记住一个原则:工具能默认跑起来,就不要手动折腾模型配置。等你把项目做完,再深入研究模型参数不迟。
3. 用 Claude Code 生成农业物联网监测平台骨架
3.1 先给 Claude Code 写一份任务书
启动 Claude Code 之后,不要只说一句“帮我写农业物联网平台”。你需要把项目边界、技术栈、目录结构、功能清单一次性说清楚。我习惯用一段结构化的提示词:
我要在 /agriculture-monitor 目录下搭建一个农业物联网监测平台。 技术栈: - 后端:Python FastAPI,使用 SQLite 存储数据,端口 8000 - 前端:HTML + JavaScript + ECharts,访问根路径 / 展示仪表盘 - 数据上报:提供 POST /api/devices/{device_id}/data 接口接收传感器数据 - 数据查询:提供 GET /api/devices/{device_id}/records 接口查询历史数据 - 报警规则:温度超过 35 度或低于 5 度时,在仪表盘标记报警 - 设备控制:提供 POST /api/devices/{device_id}/control 接口下发开关指令,先用内存状态模拟 请先列出项目文件结构,再逐个生成文件。要求代码包含中文注释,启动方式用 README 写清楚。这样的任务书让 AI 有据可依。它知道接口路径、数据字段、展示要求、交付形式,生成出来的代码可用性会高很多。
这里还要说明一个经验:如果是第一次用 Claude Code,建议让 AI 先“输出计划”,不要一口气生成全部文件。等它列出文件清单,你确认无误后再让它逐个生成和修改。这样你能看到项目全貌,也能及时纠正偏差。
3.2 生成后端:FastAPI 数据接收和历史查询
后端是整条链路的中枢。Claude Code 会生成一个 FastAPI 应用,里面通常包含:
- 接收传感器数据的接口
- 查询历史数据的接口
- 保存数据的 SQLite 数据库操作
- 设备状态和报警规则逻辑
- 开启跨域请求,方便前端直接访问
一个接收数据的接口大概长这样,你可以拿它作为验收参照:
from fastapi import FastAPI, HTTPException from pydantic import BaseModel from datetime import datetime app = FastAPI() class SensorData(BaseModel): device_id: str temperature: float humidity: float soil_moisture: float light: float timestamp: str = None @app.post("/api/devices/{device_id}/data") async def receive_data(device_id: str, data: SensorData): if data.timestamp is None: data.timestamp = datetime.now().isoformat() save_to_db(device_id, data) return {"status": "ok", "received_at": data.timestamp}这段代码不是唯一的写法,但能说明一个关键点:接口要同时支持设备带时间戳和不带时间戳两种情况。真实设备经常因为校时失败而传一个空时间,后端不能因为缺字段就拒收。
代码生成后,不要急着跑,先看几个关键点:
- 数据库文件路径是否存在。
- 数据表字段是否和设备上传的数据一致。
- 时间字段是服务器时间还是设备时间。
- 查询接口是否支持按时间范围过滤。
- 返回 JSON 结构是否固定。
这些点如果前期没确认,后面前端对接时经常会出现“接口有数据,页面空白”的情况。你会发现问题不是接口坏了,而是字段名对不上,比如后端返回的是 temperature,前端读的是 temp。
我一般会让 Claude Code 生成接口测试用例,或者直接用一个脚本向后端发送两条模拟数据,确认返回结果正确,再继续做前端。
3.3 生成前端:实时看板和 ECharts 图表
前端部分,Claude Code 可以生成一个单页应用,通常由 index.html、app.js、style.css 三个文件组成。核心功能是:
- 实时显示最新一条传感器数据。
- 展示温湿度、土壤湿度、光照数值卡片。
- 用 ECharts 画历史曲线。
- 点击按钮控制水泵开关,并显示当前状态。
- 超过阈值时,数据卡片变成红色或显示告警标识。
不要追求用 Vue 脚手架搭建,对于这个规模的项目,纯 HTML 加 JavaScript 更直接。打开浏览器就能看到效果,也不需要额外编译和构建。
前端写完后,验证标准很明确:
- 浏览器访问 http://127.0.0.1:8000 能看到页面。
- 页面能请求到后端接口,网络面板没有报错。
- 图表有曲线,不是空白。
- 按钮点击后,后端有对应日志,页面状态发生变化。
如果页面空白,先按 F12 打开开发者工具,看 Console 和 Network。很多时候是接口地址写错了,或者跨域没开,甚至只是文件路径大小写不一致。
3.4 生成模拟传感器脚本
没有真实硬件不等于不能验证系统。我会让 Claude Code 生成一个 Python 脚本,模拟一个设备,每隔 5 秒向后端上报一组数据。数据字段包括:
{ "device_id": "greenhouse_01", "temperature": 28.5, "humidity": 60.2, "soil_moisture": 45.0, "light": 12000, "timestamp": "2025-01-18T10:30:00+08:00" }脚本里可以加入随机波动,让折线图看起来更真实。也可以设置偶尔超过阈值,用来验证报警功能。
脚本跑起来后,后端数据库里应该有数据落入。你可以查看 SQLite 文件,也可以用查询接口验证。这个脚本的价值不只是开发期测试,后面接入真实设备时,它还能作为数据格式参考。
4. 跑通链路:数据采集、存储、展示和控制
4.1 从最小启动顺序开始
很多人搭完项目后,习惯一上来同时启动后端、前端、模拟器,结果分不清是哪里出错。我建议按顺序来,一次只启动一个环节:
- 启动后端进程,确认端口 8000 监听正常。
- 用 curl 或浏览器访问根路径,确认页面能打开。
- 启动模拟传感器脚本,确认后端日志里有数据进入。
- 刷新页面,确认最新数据和历史曲线更新。
如果第 2 步页面打不开,问题在后端启动或文件路径,先看终端报错。如果第 3 步没有数据进来,问题在接口地址、数据格式或数据库写入,先看模拟脚本日志和后端日志。如果第 4 步页面没变化,问题在前端请求地址或字段名,先打开浏览器开发者工具。
为了验证后端接口本身没问题,可以先手动发一条数据:
curl -X POST http://127.0.0.1:8000/api/devices/greenhouse_01/data \ -H "Content-Type: application/json" \ -d '{"temperature":28.5,"humidity":60.2,"soil_moisture":45,"light":12000}'如果这条 curl 返回 ok,说明接口是通的。再去查模拟脚本的请求地址和字段,就能快速定位问题。
4.2 阈值报警规则怎么设计
农业物联网平台里,报警不是简单判断“温度超过 35 度”。更合理的规则是加上滞回区间。比如温度超过 35 度进入高温报警,低于 33 度才恢复正常。这样能避免风扇启动后温度在临界点波动,导致报警反复闪烁。
Claude Code 生成的初始代码通常只有简单阈值判断,这没问题。但我建议你在验收时主动问它:能不能把规则改成滞回区间,能不能按设备单独配置阈值,能不能把报警记录单独存一张表。这个迭代过程就是实际开发过程。
报警判断标准也很简单:
- 一眼能在页面上看到异常标记。
- 后端日志里有报警记录。
- 数据恢复正常后,状态能自动解除。
阈值配置如果是写死的,后期改起来很麻烦。你可以让 Claude Code 把阈值放到一个配置文件里,比如 config.json,或者直接做成数据库表。这样换一块新的监测田地时,不用改代码,改配置就行。
4.3 设备控制指令的状态一致性
水泵、风机、卷帘这类设备控制,最容易出现的问题是页面显示的状态和实际状态不一致。在这个模拟项目里,Claude Code 通常会在后端维护一个内存字典来保存设备开关状态。
控制流程是:前端点击按钮,发送指令到 /control 接口,后端修改内存状态,然后前端定时拉取状态回显。
这时候要多测一个点:连续快速点击多次,状态是否稳定;后端重启后,状态是否丢失。内存状态简单,但重启后就归零了。如果要持久化,可以让 Claude Code 把设备状态保存到 SQLite。不要觉得这是小事,设备控制类功能最怕状态不确定。
设备控制接口最好也支持幂等。也就是说,连续发送两次“开启”指令,结果应该还是“开启”,而不是来回翻转。真实场景里,网络抖动可能导致设备重复收到控制指令,不处理幂等就会表现异常。
4.4 数据存储和 CSV 导出
农业数据有一个特点:量大、时间密集。短期用 SQLite 没问题,但你要考虑数据会不断增长。SQLite 文件会越来越大,页面查询历史数据会越来越慢。所以在数据库设计时,建议给记录表加上时间索引,并限制默认查询条数。
CSV 导出是很多使用者的刚需,方便后续分析。生成导出功能时,注意编码问题。常见现象是用 Excel 打开 CSV 中文乱码,解决办法是导出时使用 UTF-8 with BOM 编码,或者用 GBK 编码。Claude Code 如果不了解你的使用环境,可能默认输出 UTF-8 无 BOM,你会踩到乱码坑。
导出功能验证标准:点击导出,文件下载成功,打开后表头和数据都是完整的。导出时间范围如果超过几万条记录,还要考虑是否限制数量,避免接口超时。
5. 接入真实传感器:从模拟数据到硬件上报
5.1 常见传感器硬件组合
模拟数据跑通,不代表项目结束。接入真实设备时,硬件选型很关键。常见组合是 ESP32 或 Arduino 开发板,搭配 DHT22 温湿度传感器、土壤湿度传感器、光敏电阻模块和继电器模块。这套组合材料易于获取,案例资料多,适合学习和试验。不同地区价格差异明显,实际价格以购买渠道为准。
选型原则是:
- 能快速验证功能。
- 接口文档和案例多,排错容易。
- 电压和电源适配简单。
- 数据量不是特别大,不需要工业级网关。
如果你是第一次接触,不要直接上多节点组网。先让一块板子把数据传到服务器,验证链路稳定,再扩展到多节点。
5.2 先用 HTTP 上报,再考虑 MQTT
设备上报数据的通信方式有两条路:直接发 HTTP 请求,或者用 MQTT 协议。我建议第一次先做 HTTP,原因是链路最短、最容易排错。
设备端定时向后端接口发送 JSON,刚才的 curl 就是一个很好的格式参考。在 ESP32 上用 Arduino 代码发 POST 请求,核心流程就是三步:连接网络、拼接 JSON、发送请求。第一步和第三步是大多数人出错的地方,日志里能看到连接失败或者 HTTP 返回错误码。
这个阶段的意义是先把端到端打通。之后你引入 MQTT 网关,设备走 MQTT 到 broker,后端再订阅消息落库。MQTT 适合的场景是弱网、高频、多设备。不要为了技术时髦而增加复杂度。
5.3 统一数据格式和单位
硬件接入后最大的坑,不是传感器坏,而是数据格式不统一。有的设备上报的是摄氏度,有的是华氏度;土壤湿度有的是百分数,有的是模拟量 ADC 值;光照有的用 lux,有的用百分比。
我建议在设备端就把数据统一成标准格式,上报字段固定,单位固定,时间统一使用 ISO8601 带时区。否则后面做报表和分析时,你会发现每台设备的数据解释方式都不一样,非常痛苦。
让 Claude Code 生成一个数据接入示例,包含字段转换、单位校验、时间归一化。代码不复杂,但能避免很多线上问题。比如土壤湿度传感器返回的 ADC 值 0 到 4095,需要映射到 0 到 100%,这个转换逻辑可以在设备端做,也可以在后端做。如果多种设备混用,建议统一在后端做。
5.4 硬件接入不可替代的几件事
AI 能帮你生成代码,但不能替你做这些事:
- 传感器校准:同一型号的传感器,个体偏差可能很大。
- 电源稳定性:设备异常重启、上报中断,很多时候是电源问题。
- 部署环境:温室大棚里湿度高、粉尘多,线路防护要考虑。
- 掉线重连:设备断网后要能自动重连,数据要缓存补传。
- 时区配置:服务器和设备的时区不一致,时间线会乱。
这些属于现场经验,需要你在实际部署中积累。AI 能帮你把上报代码写好,但设备和环境问题,还是要到现场去看。
注意:接入硬件时,先确认供电方式、传感器接口电压和通信协议引脚。很多硬件问题不是代码问题,而是接线和供电问题。开发板连电脑 USB 时能工作,换成独立电源后数据就断断续续,多半是电压不足或线材压降太大。
6. 部署、排错和 Claude Code 协作经验
6.1 本地部署和 Docker 化
项目在本机跑通后,如果需要长期运行或者部署到服务器,建议用 Docker 封装一遍。一个简单的 Python 后端 Dockerfile 可以这样写:
FROM python:3.11-slim WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY . . EXPOSE 8000 CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]这只是示例,实际配置要以你的项目结构和依赖版本为准。Docker 化的好处是环境一致,换一台机器也能跑。但不要为了 Docker 而 Docker,如果只在本地学习,直接 uvicorn 启动就够了。
部署到服务器时,除了应用本身,还要考虑进程守护。本地终端一关,进程可能就没了。你可以用 systemd 或者 supervisor 把 uvicorn 进程守护起来,让它异常退出后自动重启。这一步如果不做,平台很容易在运行几天后悄无声息地挂掉。
6.2 和 Claude Code 协作的正确姿势
用久了你会发现,和 Claude Code 协作不是“让它一次写对”,而是“让它快速迭代”。我建议遵循几条规则:
- 每个任务只改一个点。
- 报错时直接贴日志,不要只说“不工作了”。
- 修改前先问它打算怎么改。
- 多文件改动,要求它列改动清单。
- 某个问题上一直绕圈子,换个新会话重新描述。
举个例子,如果后端启动报错,你应该贴出完整报错信息和启动命令。Claude Code 会结合项目文件排查,比你自己猜更快。但如果你只是说“启动失败了”,它也只能靠猜。
另外,Claude Code 生成的代码一定要人工审查。数据库连接、用户输入校验、接口权限这些地方,不能完全信任 AI 的第一次输出。尤其是上传接口和控制接口,必须限制访问权限,否则任何人都能往你的平台灌数据或者操控设备。
6.3 常见问题和排查顺序
农业物联网平台跑起来后,最容易踩到的问题我整理成一张表:
| 现象 | 优先排查点 | 说明 |
|---|---|---|
| 页面打不开 | 后端进程、端口、静态文件路径 | 先看后端终端有没有报错,再访问根路径 |
| 页面有数据但不刷新 | 前端定时器、接口缓存、时间字段 | 看 Network 请求是否正常返回 |
| 模拟器上报但数据库无数据 | 接口地址、请求头、字段名 | 用 curl 直接发一条数据验证 |
| 报警不触发 | 阈值单位、数据字段、规则比较逻辑 | 看后端日志里有没有进入报警分支 |
| CSV 导出中文乱码 | 导出编码、浏览器打开方式 | 改用 UTF-8 with BOM 或 GBK 导出 |
| 控制按钮无反应 | 接口路径、状态回显、内存状态 | 先看后端有没有收到请求 |
排查顺序基本固定:先看现象,再看输入,接着看日志,最后看代码。不要上来就改代码,先确认环境、数据、参数是不是对的。
如果你发现 Claude Code 改了好几次还没解决,大概率是上下文里堆了太多历史信息。这时候我会开一个新会话,把当前文件结构和最新报错贴进去,让它重新分析。新会话的上下文更干净,定位往往更快。
6.4 什么时候该升级方案,什么时候别硬撑
这个最小平台跑通后,如果你只是在学习,当前方案已经够用。如果你要做真实生产,有几个信号说明该升级了:
- 设备数量超过几十台,SQLite 写入有压力,要换 MySQL/PostgreSQL。
- 需要多用户登录和权限,要引入认证系统。
- 上报频率很高,需要消息队列缓冲。
- 需要手机端实时报警,要接推送服务。
不过升级要克制。很多项目不是技术不行,而是需求没想清楚。先用简单方案把业务跑起来,再根据实际痛点扩展,是更稳的路线。
我个人更建议把项目拆成阶段:第一阶段模拟数据,第二阶段接一块真实板子,第三阶段加多设备和报警,第四阶段再考虑部署和监控。Claude Code 在每一阶段都能帮你写代码、查文档、改问题,但项目边界和验收标准得你来定。
农业物联网监测平台这个案例,真正难的不是生成代码,而是理解数据从传感器到页面经历了什么。只要把这条链路拆开,每个环节都用 Claude Code 快速落地,你很快就能拥有一个自己搭出来的可用平台。踩过几次坑之后你会发现,很多问题不是工具能力不够,而是前置环境和输入材料没有处理干净。