随着现代农业向集约化、智能化方向发展,传统依赖人工巡检的农场管理模式已难以满足高效、精准的生产需求。基于SSM框架的智慧农业物联网监控平台应运而生,该系统通过集成传感器网络、远程控制设备和数据可视化技术,构建了一套完整的农场环境监测与自动化控制解决方案。
系统采用B/S架构,前端使用HTML5、CSS3和JavaScript构建响应式用户界面,后端基于Spring、SpringMVC和MyBatis三大框架实现业务逻辑处理。数据持久层采用MySQL数据库存储传感器读数、设备状态和操作日志等时序数据。系统支持多角色权限管理,农场主、技术员等不同用户可根据权限级别访问相应的监控和控制功能。
技术架构深度解析
Spring框架作为系统的核心容器,通过依赖注入(DI)和面向切面编程(AOP)实现了业务组件的高效管理。具体表现为使用@Service注解标记业务逻辑层组件,@Repository注解标注数据访问层组件,并通过@Autowired实现组件间的依赖关系自动装配。以下展示核心配置类代码:
@Configuration
@ComponentScan("com.agri.monitor.service")
public class AppConfig {
@Bean
public DataSource dataSource() {
DruidDataSource ds = new DruidDataSource();
ds.setUrl("jdbc:mysql://localhost:3306/farm_monitor?useUnicode=true");
ds.setUsername("root");
ds.setPassword("123456");
ds.setInitialSize(5);
ds.setMaxActive(20);
return ds;
}
}
SpringMVC作为Web层框架,采用RESTful风格设计API接口。控制器使用@RestController注解,配合@RequestMapping定义请求映射路径。以下为设备状态查询接口的实现:
@RestController
@RequestMapping("/api/device")
public class DeviceController {
@Autowired
private DeviceService deviceService;
@GetMapping("/{deviceId}/status")
public ResponseEntity<DeviceStatus> getDeviceStatus(
@PathVariable String deviceId) {
DeviceStatus status = deviceService.getRealTimeStatus(deviceId);
return ResponseEntity.ok(status);
}
}
MyBatis作为ORM框架,通过XML映射文件实现复杂SQL查询的封装。动态SQL功能有效处理了多条件查询场景,如下面的传感器数据查询示例:
<select id="selectSensorData" parameterType="SensorQuery" resultType="SensorData">
SELECT sensor_id, sensor_type, sensor_value, create_time
FROM t_sensor_data
<where>
<if test="sensorType != null">
AND sensor_type = #{sensorType}
</if>
<if test="startTime != null">
AND create_time >= #{startTime}
</if>
<if test="endTime != null">
AND create_time <= #{endTime}
</if>
</where>
ORDER BY create_time DESC
</select>
数据库设计亮点分析
系统数据库包含8张核心表,其中设备状态表(t_device_status)的设计体现了时序数据存储的优化思路。该表采用分区表设计,按时间范围分区存储设备状态记录,显著提升大数据量下的查询性能。
CREATE TABLE t_device_status (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
device_id VARCHAR(32) NOT NULL COMMENT '设备唯一标识',
device_type TINYINT NOT NULL COMMENT '设备类型:1-水泵 2-风机 3-卷帘机',
status TINYINT NOT NULL COMMENT '设备状态:0-离线 1-在线 2-故障',
voltage DECIMAL(5,2) COMMENT '电压值',
current DECIMAL(5,2) COMMENT '电流值',
temperature DECIMAL(4,1) COMMENT '设备温度',
update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX idx_device_time (device_id, update_time),
INDEX idx_status (status)
) PARTITION BY RANGE (TO_DAYS(update_time)) (
PARTITION p202401 VALUES LESS THAN (TO_DAYS('2024-02-01')),
PARTITION p202402 VALUES LESS THAN (TO_DAYS('2024-03-01'))
);
传感器数据表(t_sensor_data)的设计重点关注数据压缩和查询效率。采用列式存储的思想,将不同传感器类型的数据通过标签字段区分,减少表数量同时提高存储密度。
CREATE TABLE t_sensor_data (
data_id BIGINT AUTO_INCREMENT PRIMARY KEY,
sensor_node VARCHAR(24) NOT NULL COMMENT '传感器节点编号',
sensor_type VARCHAR(20) NOT NULL COMMENT '传感器类型:temperature/humidity/light',
data_value DECIMAL(8,3) NOT NULL COMMENT '传感器读数',
data_unit VARCHAR(10) COMMENT '数据单位',
data_quality TINYINT DEFAULT 1 COMMENT '数据质量标志',
collect_time DATETIME NOT NULL COMMENT '数据采集时间',
create_time DATETIME DEFAULT CURRENT_TIMESTAMP,
INDEX idx_node_type_time (sensor_node, sensor_type, collect_time),
INDEX idx_collect_time (collect_time)
) COMMENT='传感器数据表';
告警规则表(t_alarm_rule)支持灵活的条件配置,通过规则表达式字段实现复杂逻辑的告警条件定义。这种设计允许用户自定义多参数组合的告警阈值,满足不同作物的个性化监控需求。
CREATE TABLE t_alarm_rule (
rule_id INT AUTO_INCREMENT PRIMARY KEY,
rule_name VARCHAR(50) NOT NULL COMMENT '规则名称',
rule_expression JSON NOT NULL COMMENT '告警条件表达式',
alarm_level TINYINT NOT NULL COMMENT '告警级别:1-提示 2-警告 3-严重',
enabled BOOLEAN DEFAULT TRUE COMMENT '是否启用',
notify_users JSON COMMENT '通知用户列表',
create_by VARCHAR(32) COMMENT '创建人',
create_time DATETIME DEFAULT CURRENT_TIMESTAMP
) COMMENT='告警规则表';
核心功能实现详解
- 实时数据监控看板
系统首页集成ECharts图表库,动态展示各区域环境参数变化趋势。通过WebSocket协议实现数据的实时推送,确保监控界面能够即时反映农场状态变化。以下为WebSocket配置的核心代码:
@ServerEndpoint("/websocket/monitor")
@Component
public class MonitorWebSocket {
private static final Set<Session> sessions =
Collections.synchronizedSet(new HashSet<>());
@OnOpen
public void onOpen(Session session) {
sessions.add(session);
// 发送当前设备状态
sendInitialData(session);
}
@OnMessage
public void onMessage(String message, Session session) {
// 处理客户端指令
processClientMessage(message, session);
}
public static void broadcastData(SensorData data) {
sessions.forEach(session -> {
try {
session.getBasicRemote().sendText(
JSON.toJSONString(data));
} catch (IOException e) {
sessions.remove(session);
}
});
}
}

- 设备远程控制模块
系统提供精确的设备控制功能,支持手动立即执行和定时任务两种控制模式。控制指令经过多重校验确保操作安全,包括设备状态检查、权限验证和操作冲突检测。
@Service
public class DeviceControlService {
public ControlResult executeControl(ControlCommand command) {
// 1. 验证设备状态
DeviceStatus status = deviceDao.selectStatus(command.getDeviceId());
if (!status.isOnline()) {
return ControlResult.error("设备离线,无法执行控制");
}
// 2. 检查操作权限
if (!permissionService.checkControlPermission(
command.getUserId(), command.getDeviceId())) {
return ControlResult.error("无设备控制权限");
}
// 3. 发送控制指令到物联网网关
MqttMessage message = buildControlMessage(command);
mqttTemplate.send("device/control", message);
// 4. 记录操作日志
logControlOperation(command);
return ControlResult.success("控制指令已发送");
}
}

- 智能告警与通知系统
告警引擎基于规则库实时分析传感器数据,当检测到异常情况时自动触发多通道通知。系统支持短信、邮件和站内信三种通知方式,确保管理人员能够及时获知农场异常。
@Component
public class AlarmEngine {
@Autowired
private List<AlarmRule> alarmRules;
@EventListener
public void processSensorData(SensorDataEvent event) {
SensorData data = event.getSensorData();
alarmRules.stream()
.filter(rule -> rule.isEnabled())
.forEach(rule -> {
if (rule.evaluate(data)) {
Alarm alarm = createAlarm(rule, data);
alarmService.saveAlarm(alarm);
notificationService.notifyUsers(alarm);
}
});
}
private Alarm createAlarm(AlarmRule rule, SensorData data) {
Alarm alarm = new Alarm();
alarm.setRuleId(rule.getRuleId());
alarm.setAlarmLevel(rule.getAlarmLevel());
alarm.setAlarmContent(buildAlarmContent(rule, data));
alarm.setTriggerData(JSON.toJSONString(data));
return alarm;
}
}

- 数据统计分析功能
系统内置多维度数据分析模块,支持按时间范围、区域、作物类型等条件统计环境参数。数据分析结果以图表形式展示,辅助农场主制定科学的生产决策。
@Service
public class DataAnalysisService {
public EnvironmentReport generateReport(ReportQuery query) {
EnvironmentReport report = new EnvironmentReport();
// 统计温度数据
List<StatisticData> tempStats = sensorDao.statisticTemperature(
query.getStartTime(), query.getEndTime(), query.getAreaId());
report.setTemperatureStats(tempStats);
// 统计湿度数据
List<StatisticData> humidityStats = sensorDao.statisticHumidity(
query.getStartTime(), query.getEndTime(), query.getAreaId());
report.setHumidityStats(humidityStats);
// 计算环境适宜度指数
double suitabilityIndex = calculateSuitabilityIndex(
tempStats, humidityStats);
report.setSuitabilityIndex(suitabilityIndex);
return report;
}
}

实体模型设计精要
系统实体模型采用领域驱动设计(DDD)思想,核心实体包括设备(Device)、传感器(Sensor)、监控区域(MonitorArea)等。设备实体采用聚合根设计模式,封装了设备状态管理和控制指令验证等业务逻辑。
@Entity
@Table(name = "t_device")
public class Device {
@Id
private String deviceId;
private String deviceName;
private DeviceType deviceType;
private String areaId;
private String manufacturer;
private String model;
private LocalDateTime installTime;
@Transient
private DeviceStatus currentStatus;
public boolean canAcceptControl(ControlType controlType) {
// 验证设备是否可接受指定类型的控制指令
return deviceType.supportedControls()
.contains(controlType);
}
public void updateStatus(DeviceStatus newStatus) {
this.currentStatus = newStatus;
this.lastUpdateTime = LocalDateTime.now();
}
}
传感器实体包含数据校验逻辑,确保采集数据的有效性和合理性。采用策略模式实现不同类型传感器的数据验证规则。
public class Sensor {
private String sensorId;
private SensorType sensorType;
private String deviceId;
private BigDecimal minValidValue;
private BigDecimal maxValidValue;
public ValidationResult validateData(BigDecimal value) {
if (value.compareTo(minValidValue) < 0 ||
value.compareTo(maxValidValue) > 0) {
return ValidationResult.error("数据超出有效范围");
}
return ValidationResult.success();
}
}
性能优化实践
数据库查询优化方面,针对大数据量的传感器数据表,采用时间分区和复合索引策略。查询接口实现分页加载,避免一次性加载大量数据导致的内存溢出。
public PageResult<SensorData> querySensorData(SensorQuery query) {
// 计算总记录数
long total = sensorDao.countByQuery(query);
// 查询当前页数据
List<SensorData> dataList = sensorDao.selectByQuery(query);
return new PageResult<>(query.getPageNum(),
query.getPageSize(), total, dataList);
}
缓存策略上,使用Redis缓存频繁访问的设备状态和配置信息。通过注解方式实现缓存逻辑的透明化处理。
@Service
public class DeviceConfigService {
@Cacheable(value = "deviceConfig", key = "#deviceId")
public DeviceConfig getDeviceConfig(String deviceId) {
return deviceDao.selectConfig(deviceId);
}
@CacheEvict(value = "deviceConfig", key = "#config.deviceId")
public void updateDeviceConfig(DeviceConfig config) {
deviceDao.updateConfig(config);
}
}
系统安全机制
安全框架采用Spring Security,实现基于角色的访问控制(RBAC)。接口级别的方法安全注解确保敏感操作的身份验证和权限检查。
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/api/device/**").hasRole("OPERATOR")
.antMatchers("/api/config/**").hasRole("ADMIN")
.anyRequest().authenticated()
.and()
.formLogin()
.and()
.csrf().disable();
}
}
数据传输安全方面,敏感接口全部采用HTTPS协议通信。关键业务操作记录详细审计日志,满足农业物联网系统的安全合规要求。
未来优化方向
人工智能预测模型集成 计划引入机器学习算法,基于历史环境数据构建作物生长预测模型。实现病虫害预警、产量预估等智能功能,进一步提升系统的决策支持能力。技术实现上可采用TensorFlow Serving部署预测模型,通过gRPC接口与业务系统集成。
边缘计算能力扩展 针对网络条件较差的农场环境,开发边缘计算网关。在设备端实现数据预处理和简单控制逻辑,降低云端负载并提高系统可靠性。可采用嵌入式Linux设备运行轻量级规则引擎。
多租户架构升级 支持SaaS化部署模式,实现不同农场数据的完全隔离。通过数据库分片和动态数据源路由技术,构建高可扩展的多租户架构。
移动端应用开发 开发原生移动App,提供更便捷的移动监控体验。利用React Native框架实现跨平台开发,集成推送通知、扫码绑定设备等移动端特有功能。
区块链溯源功能 引入区块链技术记录农产品从种植到销售的全流程数据,构建可信的农产品溯源体系。采用Hyperledger Fabric框架构建联盟链,确保溯源数据的不可篡改性。
智慧农业物联网监控平台通过现代软件工程技术与传统农业的深度融合,实现了农场管理的数字化、智能化转型。系统具备高可用性、可扩展性和安全性,为现代农业发展提供了强有力的技术支撑。随着物联网、人工智能等技术的持续演进,平台将在精准农业、智慧农场建设领域发挥更加重要的作用。