Java物联网项目源码 使用技术:JAVA [ springmvc / spring / my...
历史数据,报表导出功能;历史数据,报表导出功能;3. 系统统计:创建项目总数、接入设备数、传感数据点、触发器数、子账户用户数、设备故障率、当前设备离线数、今日报警数/已处理数。3. 系统统计:创建项目总数、接入设备数、传感数据点、触发器数、子账户用户数、设备故障率、当前设备离线数、今日报警数/已处理数。4.系统管理:用户列表、服务统计、项目列表、设备列表、设备仓库、图标管理、数据字典、系统参数。4
Java物联网项目源码 使用技术:JAVA [ springmvc / spring / mybatis ] 、Mysql 、Html 、Jquery 、css 协议和优势:TCP/IP、HTTP、MQTT 通讯协议。 系统包括:后台服务,传感器解析服务、web展示; 目前web系统支持功能: 数据实时采集和远程控制;报警信息管理和报表导出;自动控制,触发管理; 历史数据,报表导出功能;子账户和场景授权管理; 场景信息管理;网关信息管理;传感器信息管理。 后台功能介绍: 一、平台概况 1. 项目信息 2. 设备地图 3. 系统统计:创建项目总数、接入设备数、传感数据点、触发器数、子账户用户数、设备故障率、当前设备离线数、今日报警数/已处理数 二、实时监控 1. 设备监控:设备号检索、设置参数 2. 列表监控:设备状态是否连接或离线,设备详情、远程调试 3. 组态监控 4. 视频监控 三、报警信息 1.未读报警:包括报警名称、报警详情、报警级别、处理标志、时间、操作等 2.全部报警:包括报警名称、报警详情、报警级别、处理标志、时间、操作等 四、历史数据:1.设备历史数据 2.设备历史分析 3.设备历史触发 五、用户信息:1.子账户管理 2.个人信息 3.修改密码 六、项目管理 1.设备管理:设备信息、视频信息 2.组态管理:组态列表、组件管理 3.触发器管理:触发器列表、报警联系人 4.系统管理:用户列表、服务统计、项目列表、设备列表、设备仓库、图标管理、数据字典、系统参数
最近在折腾一个Java物联网项目,用上了Spring全家桶和MQTT协议,踩坑无数后终于搞定了传感器数据从采集到展示的完整链路。分享几个有意思的实现细节,特别是TCP长连接管理和实时数据推送给前端的骚操作。

传感器通信层用Netty处理TCP长连接,这里有个心跳检测的魔改版:
@ChannelHandler.Sharable
public class SensorHeartbeatHandler extends IdleStateHandler {
// 30秒无读写触发空闲事件
public SensorHeartbeatHandler() {
super(30, 0, 0, TimeUnit.SECONDS);
}
@Override
protected void channelIdle(ChannelHandlerContext ctx, IdleStateEvent evt) {
// 超过3次心跳丢失主动断连
if (++lostHeartbeatCount > 3) {
ctx.channel().close();
DeviceManager.markOffline(ctx.channel().id().toString());
} else {
ctx.writeAndFlush(Unpooled.copiedBuffer("PING", CharsetUtil.UTF_8));
}
}
}
这个自定义心跳机制比原生TCP KeepAlive灵活得多,在遇到运营商NAT超时问题时,能自动重连而不影响业务数据流。DeviceManager会同步更新MySQL设备状态,为Web端的实时监控提供数据支撑。
报警处理用了Spring Event机制实现解耦。当传感器数据超过阈值时:
@Service
public class AlarmPublisher {
@Autowired
private ApplicationEventPublisher eventPublisher;
public void checkThreshold(SensorData data) {
if (data.getValue() > data.getThreshold()) {
AlarmEvent event = new AlarmEvent(this, data.getDeviceId(),
"数值超限:"+data.getValue(), Level.URGENT);
eventPublisher.publishEvent(event);
}
}
}
// 邮件和短信通知分开处理
@Component
public class AlarmNotifier {
@Async // 异步处理避免阻塞主线程
@EventListener
public void handleAlarm(AlarmEvent event) {
// 根据报警级别选择通知方式
if(event.getLevel() == Level.URGENT) {
smsService.send(event.getContacts());
}
emailService.send(event.toEmailContent());
// 存入报警表并更新未读计数
alarmMapper.insert(event.toAlarmRecord());
redisTemplate.opsForValue().increment("unread_alarm_count");
}
}
这种事件驱动架构让报警处理流程可扩展,后来加微信推送功能时只需新增监听器,完全不用动原有代码。

Java物联网项目源码 使用技术:JAVA [ springmvc / spring / mybatis ] 、Mysql 、Html 、Jquery 、css 协议和优势:TCP/IP、HTTP、MQTT 通讯协议。 系统包括:后台服务,传感器解析服务、web展示; 目前web系统支持功能: 数据实时采集和远程控制;报警信息管理和报表导出;自动控制,触发管理; 历史数据,报表导出功能;子账户和场景授权管理; 场景信息管理;网关信息管理;传感器信息管理。 后台功能介绍: 一、平台概况 1. 项目信息 2. 设备地图 3. 系统统计:创建项目总数、接入设备数、传感数据点、触发器数、子账户用户数、设备故障率、当前设备离线数、今日报警数/已处理数 二、实时监控 1. 设备监控:设备号检索、设置参数 2. 列表监控:设备状态是否连接或离线,设备详情、远程调试 3. 组态监控 4. 视频监控 三、报警信息 1.未读报警:包括报警名称、报警详情、报警级别、处理标志、时间、操作等 2.全部报警:包括报警名称、报警详情、报警级别、处理标志、时间、操作等 四、历史数据:1.设备历史数据 2.设备历史分析 3.设备历史触发 五、用户信息:1.子账户管理 2.个人信息 3.修改密码 六、项目管理 1.设备管理:设备信息、视频信息 2.组态管理:组态列表、组件管理 3.触发器管理:触发器列表、报警联系人 4.系统管理:用户列表、服务统计、项目列表、设备列表、设备仓库、图标管理、数据字典、系统参数
Web实时推送用了SSE(Server-Sent Events),比Websocket更轻量:
// 前端订阅
const eventSource = new EventSource('/monitor/realtime');
eventSource.onmessage = e => {
const data = JSON.parse(e.data);
updateDashboard(data); // 更新DOM元素
};
// 后端Spring MVC实现
@GetMapping(path = "/realtime", produces = "text/event-stream")
public SseEmitter streamData() {
SseEmitter emitter = new SseEmitter(180_000L); // 3分钟超时
DeviceMonitor.addEmitter(emitter); // 注册到全局管理器
emitter.onCompletion(() -> DeviceMonitor.removeEmitter(emitter));
return emitter;
}
// 当有设备数据更新时广播
public void broadcast(SensorData data) {
sseEmitters.forEach(emitter -> {
try {
emitter.send(SseEmitter.event()
.id(String.valueOf(System.currentTimeMillis()))
.data(JSON.toJSONString(data)));
} catch (IOException e) {
emitter.complete(); // 自动清理失效连接
}
});
}
这个方案在300+设备同时在线时CPU占用不到15%,比轮询方式节省了80%的带宽。配合ETag缓存机制,历史数据查询速度也很顶。

项目里最骚的是用Mybatis的TypeHandler处理传感器自定义协议:
<resultMap id="sensorDataMap" type="SensorData">
<result column="raw_data" property="value"
typeHandler="com.iot.core.SensorDataHandler"/>
</resultMap>
// 实现自定义解析逻辑
public class SensorDataHandler extends BaseTypeHandler<Float> {
@Override
public void setNonNullParameter(PreparedStatement ps, int i,
Float value, JdbcType jdbcType) {
// 将浮点数转为16进制字符串存储
ps.setString(i, Float.toHexString(value));
}
@Override
public Float getNullableResult(ResultSet rs, String columnName)
throws SQLException {
// 解析带校验位的传感器数据
String hex = rs.getString(columnName);
return parseWithChecksum(hex);
}
}
这样在DAO层直接操作Java对象,底层自动完成协议转换。后来换LORA协议传感器时,只需修改TypeHandler实现,业务代码完全不受影响。
整个项目在设备授权管理上用了RBAC+场景绑定的组合方案,通过AOP实现接口权限控制:
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface DeviceAccess {
String[] scenes() default {};
int minRoleLevel() default 1;
}
// 切面处理
@Around("@annotation(access)")
public Object checkAccess(ProceedingJoinPoint joinPoint, DeviceAccess access) {
User currentUser = SecurityContext.getUser();
if(currentUser.getRoleLevel() < access.minRoleLevel()) {
throw new PermissionException("角色权限不足");
}
Object[] args = joinPoint.getArgs();
String deviceId = (String) args[0];
if(!deviceService.checkSceneBinding(deviceId, currentUser.getId(), access.scenes())){
throw new PermissionException("未绑定该设备场景");
}
return joinPoint.proceed();
}
这种声明式权限控制让网关管理、触发器设置等接口的安全校验变得清晰,配合前端Vue的路由守卫,形成完整权限体系。

项目源码中还有很多有意思的设计,比如用状态模式实现设备故障恢复策略、用策略模式支持多厂商协议适配等。不过最让我满意的还是那个自动生成报表的模板引擎,用Freemarker+POI实现,支持导出带趋势图的Excel文件,下次有机会再细聊。
更多推荐
所有评论(0)