简介这份资源是一套面向智慧农业与智慧养猪方向的Android应用源码工程适合具备Java与Android基础的开发者、物联网课程设计学生及农业信息化项目实践者参考。项目围绕养猪场日常管理场景涵盖数据采集、设备联动与业务展示等模块可用于二次开发或毕业设计选题。压缩包共179个文件约20.14MB其中38个Java源文件承载核心业务逻辑59个XML文件负责界面布局与配置34个PNG与2个JPG、1个WebP构成图标与界面素材25个SO库支撑底层能力另有Gradle构建脚本、JAR依赖及少量日志与属性文件工程结构完整。目前已有316人学习下载具备一定参考热度。读者可从中获取一套可直接导入Android Studio的完整工程理解智慧养猪App的模块划分、界面组织与依赖配置方式并借助现有代码快速搭建原型、排查构建问题节省从零搭建的时间成本。1. 智慧化养猪App加Java一套能落地的猪场管理系统该长什么样猪场老板老周去年找我喝酒说他那三百头母猪的场子还在用纸质档案配种发情鉴定靠饲养员拿粉笔在墙上画圈。我问他为什么不试试智慧化养猪App他说试过两个一个只能记流水账另一个数据全在别人服务器上断网就抓瞎。这其实是行业里最典型的诉求不是要一个花哨的App而是要一套能自己掌控、能离线跑、能对接现有耳标和称重设备的Java后端系统。智慧化养猪App加Java这个组合核心就是用Java做服务端把猪只档案、饲喂记录、发情预警、疫苗计划、环境监控这些模块串起来前端可以是Android原生也可以是uni-app跨端。适合谁中小规模猪场的技术负责人、想接农业物联网项目的Java开发者、以及做课程设计需要真实场景的学生。下面我从数据模型一路讲到部署踩坑把能复现的路径拆开。2. 猪只档案与繁殖事件的数据模型怎么设计2.1 为什么不能直接用一张表存所有猪只信息很多新手拿到需求第一反应是建一张pig表字段从出生日期一路加到出栏体重。我一开始也这么干结果配种记录一多表里全是重复的母猪耳号查询一次发情周期要扫几万行。正确的做法是按事件溯源思路拆成三张核心表pig_base存静态档案breeding_event存配种、妊检、流产、分娩这些时间点feed_record存饲喂量和饲料类型。这样一头母猪的完整繁殖周期就是breeding_event里按时间排序的一串记录计算空怀天数、妊娠天数、胎次都变成聚合查询。-- 猪只基础档案表 CREATE TABLE pig_base ( id BIGINT PRIMARY KEY AUTO_INCREMENT, ear_tag VARCHAR(32) NOT NULL UNIQUE COMMENT 耳标号全场唯一, breed VARCHAR(32) COMMENT 品种大白、长白、杜洛克等, birth_date DATE COMMENT 出生日期, parity INT DEFAULT 0 COMMENT 胎次, status TINYINT DEFAULT 1 COMMENT 1在群 2淘汰 3死亡, pen_id BIGINT COMMENT 所在栏舍, created_at DATETIME DEFAULT CURRENT_TIMESTAMP ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; -- 繁殖事件表一条记录代表一次事件 CREATE TABLE breeding_event ( id BIGINT PRIMARY KEY AUTO_INCREMENT, pig_id BIGINT NOT NULL, event_type TINYINT NOT NULL COMMENT 1发情 2配种 3妊检 4流产 5分娩 6断奶, event_date DATE NOT NULL, boar_id BIGINT COMMENT 配种公猪id发情和妊检时为空, method TINYINT COMMENT 1自然交配 2人工授精, remark VARCHAR(255), INDEX idx_pig_date (pig_id, event_date) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;逻辑说明pig_base的ear_tag加唯一索引因为耳标是物理世界和数字世界的锚点重复了后面全乱。breeding_event用event_type区分事件类型而不是建多张表是为了查询一头猪的完整历史时不用union。参数上event_date用DATE不用DATETIME因为养猪场的时间粒度就是天配种时间精确到小时没有业务意义反而增加录入负担。idx_pig_date这个联合索引是必须的发情预警查询会频繁按pig_id过滤再按日期排序。2.2 用Java实体类映射表结构时要注意的字段类型Spring Boot项目里我一般用MyBatis-Plus实体类字段和表字段的映射有几个血泪坑。event_type这种枚举值数据库存TINYINTJava里用Integer接收别用enum直接映射否则新增事件类型要改代码重新发版。birth_date用LocalDate别用java.util.Date后者时区问题在计算日龄时会差一天。下面是一个能直接抄的实体类片段。Data TableName(breeding_event) public class BreedingEvent { TableId(type IdType.AUTO) private Long id; private Long pigId; // 用Integer而不是enum方便扩展事件类型 private Integer eventType; // LocalDate避免时区导致的日龄计算偏差 private LocalDate eventDate; private Long boarId; private Integer method; private String remark; }逻辑说明TableName和TableId是MyBatis-Plus的注解IdType.AUTO对应数据库自增。参数上pigId和boarId都用Long因为猪只数量增长后int可能不够虽然实际猪场很难到21亿头但统一用Long省得以后改。eventType用Integer在Service层用常量类定义EVENT_ESTRUS1这种比enum灵活。这里有个容易翻车的地方如果用了Lombok的Data记得IDE装插件否则编译报错找不到getter。2.3 发情预警的查询逻辑与索引优化发情预警的核心是找出“上次配种后18到24天之间、且没有妊检记录的母猪”。这个查询如果写不好几百头猪就能让接口响应超过3秒。我一般用一条SQL搞定避免在Java里循环查库。-- 查询需要发情检查的母猪上次配种后18-24天且之后没有妊检或流产记录 SELECT p.ear_tag, p.id, MAX(b.event_date) AS last_breed_date, DATEDIFF(CURDATE(), MAX(b.event_date)) AS days_since_breed FROM pig_base p JOIN breeding_event b ON p.id b.pig_id AND b.event_type 2 WHERE p.status 1 AND NOT EXISTS ( SELECT 1 FROM breeding_event e2 WHERE e2.pig_id p.id AND e2.event_type IN (3, 4) AND e2.event_date b.event_date ) GROUP BY p.id, p.ear_tag HAVING days_since_breed BETWEEN 18 AND 24;逻辑说明NOT EXISTS子查询排除已经妊检或流产的猪HAVING过滤天数区间。参数上18和24是行业经验值猪的发情周期平均21天提前3天和推后3天是观察窗口。这个查询在breeding_event表数据量到十万级时idx_pig_date索引能明显加速但NOT EXISTS里的event_type IN (3,4)如果选择性不高可以考虑加一个联合索引(pig_id, event_type, event_date)。我实测过三百头母猪、两年数据量下这条SQL在普通云服务器上跑200毫秒以内。3. 用Java实现饲喂计划与设备数据接入3.1 饲喂计划为什么不能写死在代码里很多课程设计案例把饲喂量直接写在Java常量里比如if (pig.getParity() 1) return 2.5;。这种写法在真实猪场活不过一周因为不同季节、不同品种、不同膘情的饲喂曲线都不一样。我一般把饲喂计划做成配置表按胎次、阶段、季节三个维度查。CREATE TABLE feed_plan ( id BIGINT PRIMARY KEY AUTO_INCREMENT, parity_min INT COMMENT 胎次下限, parity_max INT COMMENT 胎次上限, stage TINYINT COMMENT 1妊娠前期 2妊娠后期 3哺乳期 4空怀期, season TINYINT COMMENT 1春夏 2秋冬, daily_amount DECIMAL(5,2) COMMENT 日饲喂量kg, feed_type VARCHAR(32) COMMENT 饲料型号 ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;逻辑说明parity_min和parity_max定义胎次区间比如1到2胎一个区间3到5胎一个区间。stage对应繁殖阶段season区分冷热天因为夏季采食量普遍下降10%到15%。参数上daily_amount用DECIMAL(5,2)最大999.99公斤足够单头猪用。查询时按当前猪的胎次和阶段匹配取parity_min parity parity_max的那条记录。3.2 对接称重设备串口读数和HTTP上报的Java实现猪场常见的称重设备是带RS232串口的电子秤Java读串口需要jSerialComm库。我一般写一个独立的采集服务读到的重量通过HTTP上报给主应用这样采集服务崩了不影响主业务。// 串口读取电子秤数据每500ms读一次 SerialPort port SerialPort.getCommPort(COM3); port.setBaudRate(9600); port.setNumDataBits(8); port.setNumStopBits(1); port.setParity(SerialPort.NO_PARITY); if (port.openPort()) { byte[] buffer new byte[1024]; while (true) { int numRead port.readBytes(buffer, buffer.length); if (numRead 0) { String raw new String(buffer, 0, numRead).trim(); // 电子秤协议一般是 ST,GS, 123.45kg 这种格式 if (raw.contains(kg)) { double weight parseWeight(raw); // 上报到主应用 restTemplate.postForObject( http://localhost:8080/api/weight, new WeightDTO(earTag, weight), String.class ); } } Thread.sleep(500); } }逻辑说明jSerialComm的getCommPort参数是串口号Windows下是COM3这种Linux下是/dev/ttyUSB0。setBaudRate(9600)是电子秤最常见的波特率但不同厂家可能用4800或19200接不上时先查设备手册。参数上Thread.sleep(500)控制采集频率太快了电子秤来不及刷新太慢了可能漏掉猪只上秤的瞬间。parseWeight方法要按实际协议写我遇到过有的秤返回123.45有的返回123.45kg正则要兼容。这里有个坑串口打开后如果不关闭程序退出时端口会被占用下次启动报Port busy所以要在finally里调port.closePort()。3.3 环境监控数据用时序数据库还是MySQL猪舍温度、湿度、氨气浓度这些数据采集频率一般是每分钟一次。一个万头猪场有几十个传感器一年就是几千万条记录。我一开始用MySQL存查询一周的温湿度曲线要十几秒。后来换成TDengine或者InfluxDB同样的查询200毫秒出结果。但如果项目规模小比如就几百头猪、几个传感器MySQL加分区表也够用。方案写入速度查询一周曲线运维成本适用规模MySQL单表慢需分表5-15秒低传感器10个MySQL分区表中等2-5秒中传感器10-50个TDengine快500毫秒中传感器50个InfluxDB快500毫秒中传感器50个逻辑说明如果选MySQL按周分区PARTITION BY RANGE (TO_DAYS(collect_time))。如果选TDengine建表时用CREATE TABLE env_data USING sensors TAGS (pen_id)超级表按栏舍打标签。参数上采集频率建议不低于1分钟再密就是浪费存储猪舍环境变化没那么快。4. 避坑与排查智慧化养猪App开发中常见的五个翻车点4.1 耳标号重复导致数据串栏现象报表里同一头母猪出现在两个栏舍或者配种记录挂到了错误的猪上。原因耳标是人工录入的饲养员可能把015录成O15或者两头猪耳标脱落重新打时没更新系统。解决在pig_base表加唯一索引只是第一步录入接口要做格式校验统一转大写、去空格、字母O和数字0的混淆提示。更稳妥的做法是加一个rfid_tag字段用电子耳标做物理绑定人工录入只作为备用。4.2 断网时App直接白屏现象猪场在偏远地区4G信号不稳定饲养员打开App看不到猪只列表。原因前端所有数据都从服务端拉没有本地缓存。解决用uni-app的话把猪只列表和饲喂计划缓存在uni.setStorageSync里打开页面先读缓存再异步刷新。Java后端提供增量同步接口按updated_at时间戳拉取变更数据。注意缓存要设过期时间比如24小时过期后强制联网刷新。4.3 配种日期算错导致妊检漏检现象系统提示某头母猪该妊检了但饲养员说早就检过了。原因配种事件录入了两次或者配种日期录成了发情日期。解决在breeding_event表加唯一约束(pig_id, event_type, event_date)防止同一天同一事件重复录入。Service层在保存配种事件时检查该猪最近7天内是否已有配种记录有则提示确认。另外发情和配种要分开录不能图省事只录一个。4.4 Java服务内存溢出导致半夜宕机现象早上发现App连不上登录服务器看Java进程没了日志里OutOfMemoryError。原因发情预警查询把全表猪只和事件都加载到内存里做计算数据量一大就崩。解决所有计算下推到SQLJava里只接收结果集。如果必须用Java计算用分页查询每页500条。启动参数加-Xmx512m -Xms256m并配置-XX:HeapDumpOnOutOfMemoryError下次崩了能分析。监控用Spring Boot Actuator的/actuator/health配合定时任务每5分钟检查一次。4.5 前端打包后接口404现象开发环境一切正常打包成App安装后所有请求失败。原因开发时接口地址写的是localhost:8080打包后手机访问不到开发机。解决在uni-app里用环境变量区分process.env.NODE_ENV development时用本地地址生产环境用服务器域名。Java后端要配置CORS允许App的域名跨域。如果用了Nginx检查proxy_pass有没有配错/api前缀有没有被截掉。5. 用Docker Compose把Java后端和MySQL一键跑起来最后一章说一个我反复用的部署技巧用Docker Compose把Spring Boot应用、MySQL、Redis打包成一个文件换台服务器改个IP就能跑。猪场现场往往没有专业的运维给一个docker-compose.yml比写十页部署文档管用。version: 3.8 services: mysql: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: pigfarm2024 MYSQL_DATABASE: smart_pig volumes: - ./mysql-data:/var/lib/mysql - ./init.sql:/docker-entrypoint-initdb.d/init.sql ports: - 3306:3306 command: --character-set-serverutf8mb4 --collation-serverutf8mb4_unicode_ci redis: image: redis:7-alpine ports: - 6379:6379 app: build: . ports: - 8080:8080 depends_on: - mysql - redis environment: SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/smart_pig?useSSLfalseserverTimezoneAsia/Shanghai SPRING_DATASOURCE_USERNAME: root SPRING_DATASOURCE_PASSWORD: pigfarm2024 SPRING_REDIS_HOST: redis restart: always逻辑说明mysql服务挂载init.sql容器第一次启动时自动建表省去手动导入。app服务的SPRING_DATASOURCE_URL里主机名写mysql而不是localhost因为容器间通信用服务名。restart: always保证服务器重启后应用自动拉起。参数上--character-set-serverutf8mb4必须加否则猪只备注里的生僻字会乱码。useSSLfalse是因为内网环境没必要开SSL开了反而增加连接耗时。验证方法在服务器上执行docker-compose up -d然后docker-compose logs -f app看启动日志出现Started PigApplication in X seconds就成功了。用curl http://localhost:8080/actuator/health返回{status:UP}说明健康检查通过。如果MySQL连不上先docker-compose logs mysql看是不是初始化脚本报错最常见的是init.sql里建表语句有语法错误。我自己的习惯是每接一个新猪场项目先把这个Compose文件跑通再根据现场设备改采集服务的串口号和协议。这套东西不完美但能让一个Java开发者在一周内搭出可演示的智慧化养猪App后端。希望帮到你。本文还有配套的精品资源点击获取
企业数字化 ERP 产品动态
相关推荐
Apache Ant 1.9.16 离线构建指南:老项目编译打包实战 简介:Apache Ant 1.9.16 二进制发行版,面向 Java 项目开发者与构建工程师,用于以 XML 描述构建流程,自动化完成编译、打包、测试与部署,替代手工重复操作。压缩包共 1617 个文件,约 8.33MB,以 1… · 2026/9/26 5:40:16
PPT中嵌入VR全景图:从Google相机素材到霹雳设计助手交互展示 很多人在做汇报或者作品集的时候会遇到一个很实在的问题:手里有一张用Google相机或者其他设备拍好的全景图片,想在PPT里直接放出来,让观众能用鼠标拖着看,就像戴上VR眼镜一样在场景里转,可普通插入图片的方式只能得到一… · 2026/9/26 5:40:16
Agent-native架构实战:从AI增强到智能体原生的关键设计 1. 从"AI增强"到"Agent原生":架构姿态的根本转变先聊一个我最近深有体会的现象。过去两年我参与了好几个AI项目,团队里最常出现的分歧不是算法选型,而是产品架构师和算法工程师之间关于"AI应该放在系统哪个位置&quo… · 2026/9/26 5:40:10
如何考察北京地区生产厂家的彩箱与瓦楞纸箱资质 在北京地区筛选瓦楞纸箱与彩箱生产厂家时,核心在于考察其生产体系的完整性、定制响应的灵活性以及质检标准的稳定性。具备从设计到生产一站式服务能力的企业,通常能针对不同预算提供平衡质感与成本的方案,而非单纯依赖低价竞争或仅承接超大订… · 2026/9/26 6:14:58
ARDM深度解析:Redis可视化客户端的协议感知与生产级设计 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 6:14:52
STM32CubeProgrammer 烧录全攻略:ST-Link、串口与USB下载实战 STM32 开发这几年,工具链的变化其实挺大的。早些年大家烧程序基本就是 Keil MDK 里点一下 Download 按钮,或者用 J-Link 的 J-Flash 单独操作,再老一点用 ST-Link Utility。后来 ST 官方把 ST-Link Utility 停更了,全面转向STM32C… · 2026/9/26 6:14:52
risky-changes 技能剖析:为什么单元测试全绿,改动仍是坏主意? risky-changes 技能剖析:为什么单元测试全绿,改动仍是坏主意? 【免费下载链接】skills access to david ondrejs personal agent skills 项目地址: https://gitcode.com/gh_mirrors/skills46/skills
在 skills(David Ondre… · 2026/9/26 6:14:52
扣子(Coze)实战:从零搭建能干活的Agent工作流 1. 这不是“又一篇Agent教程”,而是我踩了37次坑后整理的实操路线图你搜“Agent入门”时,看到的大多是概念堆砌、框架罗列、API调用示例——讲清楚了“怎么调”,却没人告诉你“为什么这么调”;演示了“能跑通”,但没说… · 2026/9/26 6:14:52
Claude Code模板体系实战:从零搭建可复用的AI协作模板库 最近终于有空把 claude-code-templates 这套模板体系从头到尾重写了一遍。玩 claude-code 也有一阵子了,刚开始我跟大多数人一样,把它当成智能问答终端用,遇到问题直接开问,结果就是每次会话都像跟一个新同事合作:它不… · 2026/9/26 6:14:52
数据库课后习题答案别硬背:当测试用例集刷,效率翻倍 简介:万常选版《数据库原理与设计》课后习题答案资源,覆盖第2至6章及第9章,适合正在学习关系模型、数据库建模、关系数据理论与模式求精的本科生、自学者作为复习与自测材料。压缩包共7个文件,含3个doc参考答案、2个sql示例脚本、… · 2026/9/26 0:00:21
OpenClaw 替代品?Hermes Agent 踩坑实录:macOS 飞书接入 TaoToken 配置 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 0:00:40
向下兼容与向上兼容:接口设计中的兼容性策略与工程实践 一次版本升级事故,是很多团队绕不过去的坎。线上环境里,服务端明明已经上线了新版接口,老的移动端还在照着旧文档传参数。请求一到网关,校验直接拒绝,用户操作失败,客服群炸了锅,开发群里开始互… · 2026/9/26 0:00:46