温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片!
1. 背景与意义
随着物联网、传感器网络和边缘计算技术的快速发展,智能家居设备已从单一智能单品走向全屋联动。然而,设备数量的增长也带来了新的挑战:用户往往需要在多个 App 之间切换,手动配置复杂的自动化规则,难以根据真实生活场景(如回家、离家、睡眠、观影)实现一键联动。
智能家居用户场景管理系统正是为解决上述痛点而设计。它把「设备」与「用户生活场景」解耦,让用户以场景为粒度统一管理设备状态、触发条件和执行动作。例如,用户只需点击「回家模式」,系统即可自动打开门锁、调节灯光、启动空调并播放音乐,而无需逐台设备操作。
从工程角度看,该系统具备以下现实意义:
- 提升用户体验:以场景为入口,降低多设备操作的学习成本与操作负担。
- 统一设备接入:通过设备抽象层屏蔽不同厂商协议的差异,便于扩展新设备。
- 支撑自动化决策:基于传感器数据和用户行为日志,为后续智能推荐与联动优化提供数据基础。
- 可维护性与可扩展性:采用分层架构与模块化设计,便于后续接入语音助手、AI 推荐引擎等能力。
2. 系统总体设计
系统采用经典的分层架构,自上而下分为表现层、应用层、领域层和基础设施层,各层职责清晰、依赖单向,便于团队协作与单元测试。
flowchart TD A[表现层 Web/移动端] --> B[应用层 场景编排服务] B --> C[领域层 场景聚合根] C --> D[基础设施层 设备网关/消息队列/数据库] D --> E[智能家居设备]核心模块包括:
- 设备管理模块:负责设备注册、状态上报、指令下发与协议适配。
- 场景管理模块:负责场景的创建、编辑、启停与执行编排。
- 规则引擎模块:负责解析场景触发条件(时间、传感器、手动)并触发联动动作。
- 用户与权限模块:负责家庭成员管理、角色权限控制与场景共享。
3. 技术栈选型
考虑到智能家居场景对实时性、稳定性和生态兼容性的要求,系统技术栈选型如下:
| 层次 | 技术选型 | 选型理由 |
|---|---|---|
| 开发语言 | Java 17 | 长期支持版本,生态成熟,适合企业级后端服务 |
| 核心框架 | Spring Boot 3.x | 快速构建 RESTful 服务,内置依赖管理与自动配置 |
| ORM | MyBatis-Plus | 轻量灵活,支持自定义 SQL,便于复杂查询 |
| 数据库 | MySQL 8.0 | 稳定可靠,事务支持完善,适合业务数据存储 |
| 缓存 | Redis | 缓存设备状态与场景配置,降低数据库压力 |
| 消息队列 | RabbitMQ | 异步处理设备事件上报与场景动作下发,削峰填谷 |
| 设备通信 | MQTT | 轻量级物联网协议,适合低带宽、弱网环境 |
| 实时推送 | WebSocket | 向客户端实时推送设备状态变化与场景执行结果 |
| 接口文档 | SpringDoc OpenAPI | 自动生成接口文档,便于前后端联调 |
4. 核心代码实现
4.1 场景实体定义
场景是系统的核心聚合根,包含基本信息、触发条件和动作列表。下面给出场景实体的核心代码。
@Data @TableName("scene") public class Scene { @TableId(type = IdType.AUTO) private Long id; private String name; private String description; private Integer enabled; private LocalDateTime createTime; private LocalDateTime updateTime; }4.2 场景动作实体
每个场景包含多个动作,动作描述「对某台设备执行什么操作」。动作实体与场景实体为一对多关系。
@Data @TableName("scene_action") public class SceneAction { @TableId(type = IdType.AUTO) private Long id; private Long sceneId; private Long deviceId; private String actionType; private String actionParams; private Integer sortOrder; }4.3 场景执行服务
场景执行服务是应用层的核心入口,负责校验场景状态、解析动作参数并通过设备网关下发指令。下面给出核心实现。
@Service @Slf4j public class SceneExecuteService { private final SceneMapper sceneMapper; private final SceneActionMapper actionMapper; private final DeviceGateway deviceGateway; public SceneExecuteService(SceneMapper sceneMapper, SceneActionMapper actionMapper, DeviceGateway deviceGateway) { this.sceneMapper = sceneMapper; this.actionMapper = actionMapper; this.deviceGateway = deviceGateway; } @Transactional public boolean executeScene(Long sceneId) { Scene scene = sceneMapper.selectById(sceneId); if (scene == null || scene.getEnabled() == null || scene.getEnabled() != 1) { log.warn("场景不存在或未启用, sceneId={}", sceneId); return false; } List<SceneAction> actions = actionMapper.selectList( new LambdaQueryWrapper<SceneAction>() .eq(SceneAction::getSceneId, sceneId) .orderByAsc(SceneAction::getSortOrder)); for (SceneAction action : actions) { try { deviceGateway.sendCommand(action.getDeviceId(), action.getActionType(), action.getActionParams()); log.info("场景动作下发成功, sceneId={}, deviceId={}, action={}", sceneId, action.getDeviceId(), action.getActionType()); } catch (Exception e) { log.error("场景动作下发失败, sceneId={}, deviceId={}", sceneId, action.getDeviceId(), e); } } return true; } }4.4 设备网关抽象
设备网关是连接业务层与物理设备的桥梁。通过抽象接口屏蔽不同厂商协议的差异,便于接入新设备。
public interface DeviceGateway { void sendCommand(Long deviceId, String actionType, String params); }下面给出基于 MQTT 协议的默认实现,通过消息队列异步下发指令。
@Component @Slf4j public class MqttDeviceGateway implements DeviceGateway { private final MqttTemplate mqttTemplate; public MqttDeviceGateway(MqttTemplate mqttTemplate) { this.mqttTemplate = mqttTemplate; } @Override public void sendCommand(Long deviceId, String actionType, String params) { String topic = "device/" + deviceId + "/command"; String payload = String.format("{\"action\":\"%s\",\"params\":%s}", actionType, params); mqttTemplate.publish(topic, payload); log.info("MQTT 指令已发布, topic={}, payload={}", topic, payload); } }4.5 场景创建接口
下面给出场景管理的 RESTful 接口,支持创建场景并绑定动作列表。
@RestController @RequestMapping("/api/scenes") public class SceneController { private final SceneService sceneService; public SceneController(SceneService sceneService) { this.sceneService = sceneService; } @PostMapping public Result<Long> createScene(@RequestBody SceneCreateRequest request) { Long sceneId = sceneService.createScene(request); return Result.success(sceneId); } @PostMapping("/{sceneId}/execute") public Result<Boolean> executeScene(@PathVariable Long sceneId) { boolean success = sceneService.executeScene(sceneId); return Result.success(success); } }5. 总结与展望
本文围绕智能家居用户场景管理系统,从背景意义、总体设计、技术栈选型和核心代码四个维度进行了阐述。系统以「场景」为核心抽象,通过分层架构与设备网关解耦,实现了设备统一接入与场景一键联动,兼顾了可扩展性与可维护性。
后续可在以下方向继续演进:
- AI 场景推荐:基于用户行为日志,自动推荐常用场景组合。
- 语音联动:接入语音助手,实现「说一句话执行场景」。
- 多租户支持:面向地产或物业场景,支持多家庭、多空间的场景隔离。
- 边缘计算:将部分场景规则下沉到边缘网关,降低云端依赖与响应延迟。