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实时推送用了SSEServer-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 idsensorDataMap typeSensorData result columnraw_data propertyvalue typeHandlercom.iot.core.SensorDataHandler/ /resultMap // 实现自定义解析逻辑 public class SensorDataHandler extends BaseTypeHandlerFloat { 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的路由守卫形成完整权限体系。项目源码中还有很多有意思的设计比如用状态模式实现设备故障恢复策略、用策略模式支持多厂商协议适配等。不过最让我满意的还是那个自动生成报表的模板引擎用FreemarkerPOI实现支持导出带趋势图的Excel文件下次有机会再细聊。