简介:这是一套面向Java开发者与农业数字化从业者的开源智慧农业物联网平台(v3.0.1),覆盖设备端、APP端、平台端与管理端全链路,解决中小型农业企业及个人开发者在物联网系统搭建中常见的协议缺失、模块不全、部署复杂等痛点。资源包共257个文件,含104个CSS样式文件(支撑响应式大屏、表单、时间/级联/分页等UI组件)、66个JS脚本(实现设备通信、数据渲染与交互逻辑)、16个PNG与15个JPG图像资源(用于界面图标与监控图示),以及YML配置、XML接口定义、MD文档说明等关键工程文件,整体压缩包仅11.16MB,轻量易部署。已有1262人学习下载,体现其在边缘计算与农业IoT落地场景中的实用热度。用户可直接获得完整可运行系统:包含设备采集、环境监控、农产品溯源、农技专家知识库、仓储管理及可视化大屏六大核心子系统,所有源码、前端资源与配置均无保留开放,真正实现“开箱即用”与二次开发友好。
1. 项目缘起:从“看天吃饭”到“数据种田”的跨越
干了十几年农业信息化,我见过太多“智慧农业”项目最后变成了“摆设农业”。传感器装了一堆,大屏做得花里胡哨,但真到了田间地头,要么数据不准,要么设备离线,要么系统复杂到连技术员自己都懒得用。农民兄弟最实在,他们不关心你用了多牛的算法、多炫的架构,他们只关心三件事:这东西能不能帮我省工省力?能不能帮我增产增收?坏了能不能自己鼓捣好?
正是基于这种“实用主义”的思考,我们团队在过去几年里,一直在迭代打磨一个开源的智慧农业物联网平台。最近,我们正式发布了它的 3.0.1 版本。这个版本号听起来像个小修小补,但实际上,它是一次从“能用”到“好用、敢用”的关键升级。今天,我就以一个一线开发者和使用者的双重身份,来深度拆解这个my_ai_town项目(项目地址在文末),聊聊我们是怎么把一个开源物联网平台,做得既专业又接地气的。如果你正打算涉足智慧农业,或者正在为自家农场、园区寻找一套可靠、可控的数字化管理方案,这篇近万字的实操解析,或许能给你带来一些不一样的思路。
2. 3.0.1 版本的核心定位:稳定与易用性的双重加固
在聊具体技术之前,必须先理解 3.0.1 版本的核心价值。它不是一次功能上的狂飙突进,而是一次针对生产环境稳定性和用户易用性的“系统性加固”。我们收到过很多来自早期用户的反馈,问题集中在这几个方面:传感器数据偶尔“跳变”、历史数据查询慢了、设备固件升级总失败、新用户上手配置一头雾水。所以,3.0.1 版本的迭代目标非常明确:让平台更稳,让用户用得更顺。
2.1 底层通信协议的优化与统一
在 2.x 版本中,我们为了兼容各种老旧设备,同时支持了 MQTT、CoAP、HTTP 甚至一些私有 TCP 协议。灵活性是有了,但维护成本和稳定性成了大问题。不同协议的心跳机制、重连逻辑、数据包解析各自为政,导致边缘网关的代码异常复杂,内存泄漏和连接闪断时有发生。
在 3.0.1 版本中,我们做了一个大胆的决定:将设备接入层统一收敛到 MQTT 3.1.1/5.0 协议。为什么是 MQTT?原因有四:
- 轻量级与低功耗:特别适合电池供电的农业传感器,报文头极小,能显著延长设备续航。
- 基于发布/订阅模型:设备(Publisher)只负责上报数据到指定主题(Topic),平台服务(Subscriber)按需订阅。这种松耦合设计,使得增加新的传感器类型或数据分析服务时,无需改动现有设备代码。
- 服务质量(QoS)保障:MQTT 提供 QoS 0、1、2 三级可靠性。对于土壤温湿度这种偶尔丢失一两条数据影响不大的指标,我们用 QoS 0 以节省流量;对于控制灌溉阀门开关这种关键指令,必须使用 QoS 2,确保指令有且仅有一次准确送达。
- 生态成熟:有 Mosquitto、EMQX 等众多成熟、开源且高性能的 Broker 实现可选,社区资源丰富。
我们基于 EMQX 搭建了集群化的 MQTT Broker,并为其编写了详细的部署与调优指南。针对农业现场网络不稳定的特点,我们强化了边缘网关(通常是一个运行了我们的网关软件的树莓派或工控机)的断线重连和消息缓存机制。网关会在本地缓存最多 72 小时的数据,待网络恢复后自动续传,确保数据不丢失。
注意:统一协议意味着要对原有非 MQTT 设备进行改造。我们提供了“协议转换器”微服务,可以将少量必须保留的 HTTP 等协议设备的数据,实时转换为 MQTT 消息上报,作为平滑过渡方案。
2.2 数据流与规则引擎的重构
数据上来之后,怎么处理?早期版本用的是“硬编码”逻辑:if 土壤湿度 < 30%, then 打开水泵。这种写法在规则少的时候还行,一旦规则复杂、多变,代码就会变成一团乱麻。
3.0.1 版本引入了可视化规则引擎。它的核心思想是将数据处理逻辑“配置化”,而非“代码化”。我们在管理后台提供了一个拖拽式的界面,用户可以像搭积木一样组合各种节点:
- 输入节点:订阅特定的 MQTT 主题,如
sensor/field01/soil_moisture。 - 处理节点:进行数据过滤(只处理特定范围的值)、转换(单位换算)、聚合(计算5分钟内的平均值)、JavaScript 脚本处理(自定义复杂逻辑)。
- 判断节点:设置条件,如“当平均值持续10分钟低于阈值”。
- 输出节点:触发动作,如向
cmd/field01/pump主题发布一个“开启”指令,或者发送一条告警短信/微信消息。
这套引擎基于 Node-RED 的理念进行了深度定制,但其后台执行引擎是我们用 Go 重写的,性能更高,更适合在资源有限的边缘服务器上运行。所有规则以 JSON 格式存储,可以方便地导入、导出和版本管理。
举个例子:要实现“当温室温度高于30℃且持续5分钟,则自动打开顶窗并发送告警给管理员”。
- 在界面拖入一个“MQTT输入”节点,配置主题为
sensor/greenhouse01/temperature。 - 连接一个“滑动窗口平均”节点,设置窗口时长5分钟。
- 连接一个“条件判断”节点,设置条件为
$avg > 30。 - 从这个判断节点引出两条线:
- 一条连接“MQTT输出”节点,主题为
cmd/greenhouse01/roof_window,消息体为{"action": "open"}。 - 另一条连接“告警”节点,选择微信模板,内容为“温室01温度持续过高,已自动开启顶窗,请关注”。
- 一条连接“MQTT输出”节点,主题为
这样一来,业务逻辑的修改完全不需要重启任何服务,在网页上点点鼠标就能完成。这对农技人员来说,学习成本大大降低。
3. 平台核心模块拆解:从感知到决策的全链路
一个完整的智慧农业物联网平台,绝不是一堆传感器的简单堆砌。3.0.1 版本清晰地划分了四大核心模块,构成了从物理世界感知到数字世界决策的完整闭环。
3.1 设备管理与接入层:让“哑设备”会说话
这是平台与物理世界交互的边界,也是最容易出问题的环节。我们设计了分层式的设备管理模型:
- 物理设备:指具体的传感器(温湿度、光照、土壤EC/PH值)、控制器(水泵、卷膜机、补光灯)、摄像头等。每个设备有一个唯一的硬件ID(如芯片序列号)。
- 产品模型:为每一类设备(如“某某型号的土壤三合一传感器”)定义一个产品。产品模型中规定了:
- 属性(Properties):设备上报的状态数据,如温度值、开关状态。这些是可读的。
- 服务(Services):设备能够执行的操作,如“设置灌溉时长”、“拍照”。这些是可调用的。
- 事件(Events):设备主动上报的特定信息,如“告警”、“故障”。这些是可订阅的。
- 设备影子(Device Shadow):这是核心概念。在云端为每个物理设备维护一个“影子”文档(JSON格式)。无论设备在线与否,应用都只和这个“影子”交互。比如,你下发一个“开泵”指令,指令会先快速写入设备影子(状态变为
desired: {"pump": "on"}),然后平台再尝试同步给物理设备。设备上线后,会报告自己的真实状态到影子(状态变为reported: {"pump": "on"})。影子机制完美解决了网络不稳定导致的指令丢失、状态不同步问题。
接入层我们提供了多种 SDK 和模板:
- 对于嵌入式设备:提供 C 和 MicroPython 的 SDK,代码极度精简,只需实现传感器数据读取和 MQTT 连接发布即可。
- 对于边缘网关:提供完整的 Go 语言版本网关程序,它支持串口、LoRa、4G 等多种方式连接子设备,进行协议转换后统一用 MQTT 上报。
- 对于第三方设备:提供 HTTP API 和 MQTT 主题规范,只要设备能按我们的数据格式发送数据,就能快速接入。
3.2 数据存储与可视化:把数据变成“看得见”的洞察
数据存储不是简单的“存起来”,而是要服务于不同的查询场景。我们采用了时序数据库与关系型数据库混合的方案:
- 时序数据库(TimescaleDB):存储所有传感器产生的带时间戳的数据。这类数据特点是写入量大、按时间顺序查询多、单条数据价值低。TimescaleDB 是基于 PostgreSQL 的扩展,完美支持 SQL,同时具备自动分表(按时间分区)、高效压缩和连续聚合等时序数据专用特性。查询“过去24小时温室温度的变化曲线”这种请求,速度极快。
- 关系型数据库(PostgreSQL):存储设备元信息、用户信息、业务订单、告警记录、规则配置等结构化关系数据。
可视化方面,我们深度集成了 Grafana。为什么不用自己从头开发图表?因为 Grafana 在数据可视化领域是事实上的标准,功能强大、图表丰富、社区插件多。我们做了两件事:
- 自动数据源配置:当用户在平台新增一个设备或数据流时,后台会自动在 Grafana 中创建对应的 TimescaleDB 数据源和基础仪表盘模板。
- 定制化农业仪表盘模板:我们开发了一系列开箱即用的农业专用仪表盘,如“温室环境全景监控”、“大田墒情分布热力图”、“灌溉统计报表”等。用户只需选择自己的设备,就能一键生成专属看板。
3.3 智能分析与告警中心:从“监控”到“预警”
数据可视化是“后视镜”,告诉我们发生了什么。而智能分析与告警则是“预警机”,告诉我们即将发生什么。
- 阈值告警:最基本的,可以针对任何数据点设置静态阈值告警。在 3.0.1 版本中,我们增强了告警的“降噪”能力。比如,可以设置“连续3个数据点超过阈值”才触发告警,避免因传感器瞬时干扰产生误报。
- 动态基线告警:这是更智能的方式。系统会学习每个传感器在历史同期(如过去7天同一时段)的正常波动范围,自动生成一条动态基线。当实时数据显著偏离这条基线时,即使没有超过绝对阈值,也会触发告警。这非常适合发现那些缓慢发生的异常,比如土壤盐分逐渐累积。
- 告警分级与通知路由:告警分为“提示”、“警告”、“严重”等级别。不同级别触发不同的通知渠道(平台内消息、短信、微信、钉钉)和升级策略(如严重告警10分钟未确认,自动通知上级负责人)。
- 简单的机器学习应用(Beta):我们集成了一个轻量级的时序预测模块(基于 Facebook 的 Prophet 算法),可以对未来短期的环境数据进行预测,比如预测未来2小时的温度变化趋势,为自动化控制提供前瞻性参考。
3.4 运维与部署实战:如何让它稳定跑在你的服务器上
开源项目好不好,一半看代码,一半看部署文档。我们为 3.0.1 版本提供了三种部署方式,适应不同用户的需求。
方案一:All-in-One 快速体验(Docker Compose)这是为初学者和快速验证设计的。只需一台有 Docker 的 Linux 服务器(2核4G以上),克隆代码后,一条命令docker-compose up -d,就能拉起包括数据库、MQTT Broker、规则引擎、前后端在内的所有服务。我们提供了详细的配置说明,特别是如何修改默认密码、配置域名和 HTTPS。
方案二:微服务集群部署(Kubernetes)这是为生产环境设计的。我们将各个模块拆解成了独立的微服务(设备接入服务、数据流服务、用户服务等),并提供了完整的 Kubernetes YAML 文件和 Helm Chart。你可以将服务部署在自有机房或云上(阿里云、腾讯云等)。这种架构的好处是:
- 高可用:任何单个服务实例挂掉,都不会影响整体功能。
- 弹性伸缩:在数据采集高峰期,可以自动扩容数据接入服务实例。
- 资源隔离:不同服务互不影响。
方案三:边缘-云协同部署这是针对大型农场或农业园区的典型场景。在园区本地机房部署一个“边缘节点”,运行数据接入、规则引擎和本地数据库(用于存储近期高频数据)。这个边缘节点负责实时控制和响应,网络中断也不影响本地自动化作业。同时,边缘节点将聚合后的数据(如每小时平均值)同步到“云端中心平台”,用于长期存储、大数据分析和集团级报表。我们在 3.0.1 版本中大幅优化了边缘与云之间的数据同步机制,支持断点续传和冲突解决。
踩坑实录:数据库连接池配置:初期很多用户反馈平台运行一段时间后变卡。排查发现是默认的数据库连接数设置太小,在高并发数据写入时形成瓶颈。在我们的生产部署指南中,现在会重点强调根据服务器硬件和预估的设备数量,调整 PostgreSQL 和 TimescaleDB 的
max_connections、shared_buffers等关键参数。一个经验公式:基础连接数 = 20 + (预估最大设备数 / 50)。
4. 开源生态与社区共建:项目的生命力所在
“开源”不仅仅意味着代码可以免费看到,更意味着一个共建共荣的生态。my_ai_town项目在 GitHub 上完全开放,我们坚信,只有经过更多真实场景打磨的项目,才真正具有生命力。
- 清晰的贡献指南:我们在仓库的 CONTRIBUTING.md 文件中,详细说明了如何提交 Issue、如何 Fork 代码、开发分支规范、提交信息格式以及如何发起 Pull Request。对于新手,我们标记了一些
good first issue,帮助他们快速上手。 - 模块化设计:平台采用微服务架构,代码模块清晰。如果你只想用我们的设备接入 SDK,可以直接引用那个独立的库;如果你对规则引擎感兴趣,可以单独研究那一部分代码。这种设计降低了参与贡献的门槛。
- 活跃的社区交流:我们建立了钉钉群和 GitHub Discussions 板块,用于用户和技术交流。很多实用的功能,比如“针对特定型号杀虫灯的集成”、“适配某种小众气象站的协议解析器”,都是社区用户贡献的代码。我们会认真审核并合并这些贡献,并在发布说明中致谢贡献者。
- 关于开源协议:项目采用Apache License 2.0。这是一个非常友好且商业友好的协议。简单说,你可以自由地使用、修改、分发代码,甚至用于商业闭源项目,只需保留原始版权和许可声明。这打消了很多企业用户“用了开源代码会不会有法律风险”的顾虑。
5. 从开源到落地:给你的实战建议
看了这么多,你可能摩拳擦掌想试试了。别急,在真正部署之前,我想分享几条从无数个实战项目中总结出的“血泪经验”。
第一条:想清楚你的真实需求,而不是堆砌功能。不要一上来就想着要监控所有数据。问问自己:当前生产中最头疼的问题是什么?是灌溉用水浪费严重?还是病虫害发现太晚?从一个具体的痛点切入。比如,如果目标是节水,那就先重点部署土壤墒情传感器和智能阀门,把自动灌溉这个闭环跑通、跑稳。看到实效后,再逐步扩展。我们的平台模块化设计正好支持这种“小步快跑”的模式。
第二条:硬件选型,可靠性远大于参数。农业环境高温高湿、多尘、供电不稳,是电子设备的“地狱场”。千万别图便宜买那些没有经过严格环境测试的“开发板”式传感器。选择硬件时,重点考察:
- 防护等级:至少 IP65(防尘防水),户外最好 IP67。
- 工作温湿度范围:要宽于你当地的历史极值。
- 供电方式:太阳能供电系统是否可靠?电池续航在极端天气下如何?
- 通信稳定性:在田间实际测试一下 LoRa、4G 等信号的覆盖和稳定性。 我们在项目 Wiki 里维护了一个“硬件兼容性列表”,列出了我们和社区用户实测过可靠的设备型号,供你参考。
第三条:网络是生命线,必须有冗余设计。农业现场的网络条件往往很差。我们的边缘网关设计就是为此而生。务必确保:
- 关键控制指令(如断电、开关阀)必须具备“本地离线执行”能力。即,即使网络完全中断,网关本地存储的定时任务或阈值规则依然能生效。
- 主网络(如 4G)之外,最好有备用的网络通道(如卫星通信模块,成本较高但关键时刻救命),至少也要有短信告警作为备份通知渠道。
- 所有设备(包括网关)要支持看门狗机制,死机后能自动重启。
第四条:培养自己的“数字农技员”。系统建好了,谁来用?指望一线农民伯伯去操作复杂的电脑界面是不现实的。我们建议,每个农场或合作社,至少要培养一名年轻的、懂点电脑的员工作为“数字农技员”。他的职责是:
- 日常巡检系统运行状态。
- 根据农艺师的要求,在平台上配置和调整自动化规则(比如修改灌溉触发阈值)。
- 处理简单的告警和故障(如重启网关、更换传感器电池)。
- 从系统中导出数据,辅助生产决策。 平台的管理后台我们正在持续优化,目标就是让这个“数字农技员”经过短期培训就能上手。
开源智慧农业物联网平台 3.0.1 版本,是我们将多年经验产品化、开源化的一次努力。它不完美,但足够扎实、灵活。它的价值不在于提供了多少炫酷的 AI 功能,而在于搭建了一个稳定、可扩展的数字化基座。在这个基座上,你可以根据自己的业务需求,生长出最适合你的智慧农业应用。
农业的数字化是一场马拉松,不是百米冲刺。它需要耐心,需要务实,更需要像我们这样的开发者、企业和用户一起,从一个个具体的痛点出发,用技术一点点地去改善。如果你对这个项目感兴趣,欢迎访问 GitHub 仓库(https://github.com/mewamew/my_ai_town)获取代码、文档和部署脚本。如果你在使用的过程中遇到了问题,或者有更好的想法,也欢迎提交 Issue 或加入我们的社区一起讨论。路还长,咱们一起慢慢走。
本文还有配套的精品资源,点击获取