Loading... # Garden Remote Controller SMS IoT 控制系统技术分析 # 一、背景与目标 ## 1. 项目背景 ### A. 业务场景 Garden Remote Controller 是一个基于 Android 的 IoT 设备远程控制应用,通过 SMS 短信实现设备管理和监控。该应用解决了传统 IoT 控制方案对网络连接依赖的问题,在无网络或网络不稳定的场景下提供可靠的远程控制能力。 ### B. 痛点分析 传统 IoT 控制方案依赖稳定的网络连接,在以下场景存在局限性: - 农村或偏远地区网络覆盖不足 - 家庭自动化系统断网时失去控制能力 - 安全系统在故障时无法远程操作 - 网络设备故障导致整个系统瘫痪 ## 2. 设计目标 ### A. 功能目标 - 通过 SMS 实现设备开关控制 - 传感器状态实时监控和告警 - 定时任务自动化管理 - 设备状态持久化存储 ### B. 非功能目标 - 无需网络连接即可工作 - iOS 风格的现代化用户界面 - 实时响应和状态同步 - 线程安全和数据一致性 # 二、现状分析 ## 1. 现有系统 ### A. 技术栈 - 开发平台:Android API 24-35(Android 7.0 至 Android 15) - 编程语言:Java - UI 框架:AndroidX + Material Design - 持久化:SharedPreferences + Gson ### B. 架构特点 - 单 Activity 架构,Fragment 管理不同功能模块 - BroadcastReceiver 处理 SMS 收发 - RecyclerView 实现命令网格和消息历史 - ConcurrentHashMap 保证线程安全 ## 2. 功能模块 ### A. 设备控制 - 传感器开关(Sensors on/off) - LED 灯控制(Led1-Led4) - 水泵控制(Water on/off) - 风扇控制(Fan on/off) - 报警定时器(Alarm1-Alarm3) ### B. 状态监控 - 实时设备状态显示 - 自动刷新(每 5 分钟) - 手动刷新功能 - 状态持久化 ### C. 智能通知 - PIR 运动检测告警 - 门磁传感器告警 - 激光检测紧急告警 - 自定义声音和震动 # 三、总体设计 ## 1. 设计原则 - 离线优先:完全基于 SMS,无需网络 - 用户友好:iOS 风格的流畅交互 - 状态一致:保证 UI 与设备状态同步 - 线程安全:并发操作的数据保护 ## 2. 系统架构 ```mermaid graph TB subgraph 用户界面层 A[MainActivity] B[CommandAdapter] C[MessageAdapter] end subgraph 业务逻辑层 D[SMS管理器] E[状态同步器] F[响应解析器] end subgraph 数据层 G[SharedPreferences] H[ConcurrentHashMap] end subgraph 系统服务 I[SmsManager] J[BroadcastReceiver] end A --> B A --> C A --> D B --> E C --> F D --> I D --> J E --> H F --> H E --> G F --> G ```  ## 3. 组件说明 - MainActivity:核心控制器,管理 UI 和业务逻辑 - CommandAdapter:命令网格适配器,处理设备控制交互 - MessageAdapter:消息历史适配器,显示 SMS 对话记录 - SmsManager:系统 SMS 管理器,发送和接收短信 - BroadcastReceiver:短信接收器,处理设备响应 # 四、详细设计 ## 1. 核心模块 ### A. 命令发送模块 职责:将用户操作转换为 SMS 命令并发送 接口定义: ```java void sendCommand(String command, CommandCallback callback); ``` 数据模型: ```java class CommandItem { String name; // 命令名称 String command; // SMS 命令文本 boolean isToggle; // 是否为开关命令 boolean enabled; // 是否启用 int iconRes; // 图标资源 } ``` ### B. 状态同步模块 职责:解析设备响应并更新 UI 状态 关键流程: 1. 接收 SMS 广播 2. 验证发送者号码 3. 解析响应内容 4. 更新设备状态 5. 刷新 UI 显示 6. 保存到历史记录 ### C. 通知模块 职责:处理传感器告警和紧急事件 通知类型: - PIR 运动检测 - 门磁传感器触发 - 激光检测紧急告警 ## 2. 关键流程 ### A. 命令发送流程 ```mermaid sequenceDiagram participant U as 用户 participant UI as MainActivity participant S as SmsManager participant D as IoT设备 participant R as BroadcastReceiver participant P as SharedPreferences U->>UI: 点击命令开关 UI->>UI: 显示加载状态 UI->>UI: 切换开关动画 UI->>S: sendTextMessage() S->>D: SMS命令 D-->>R: SMS响应 R->>R: 验证发送者 R->>UI: 解析响应 UI->>UI: 更新设备状态 UI->>P: 保存状态 UI->>UI: 隐藏加载状态 ```  ### B. 异常处理 #### 超时处理 - 默认超时时间:30 秒 - 超时后恢复加载状态 - 记录失败日志 #### 重复消息过滤 - 2 秒时间窗口去重 - 使用 AtomicBoolean 标记处理状态 - 防止 UI 重复更新 ## 3. 数据存储 ### A. 存储选型 - SharedPreferences:轻量级键值对存储 - Gson:JSON 序列化/反序列化 ### B. 数据模型 ```java // 设备状态映射 Map<String, Boolean> deviceStates; // 报警信息映射 Map<String, String> alarmInfo; // 消息历史列表 List<MessageItem> messageList; ``` ### C. 缓存策略 - 设备状态:实时更新到 ConcurrentHashMap - 消息历史:最多保存 100 条 - 自动刷新:每 5 分钟请求一次状态 # 五、技术选型 ## 1. 技术栈 ### A. Android 框架 - minSdk:24(Android 7.0) - targetSdk:35(Android 15) - AGP 版本:8.12.3 ### B. 依赖库 ```gradle // AndroidX 核心库 androidx.appcompat:appcompat:1.7.0 androidx.recyclerview:recyclerview:1.3.2 androidx.cardview:cardview:1.0.0 // Material Design com.google.android.material:material:1.12.0 // JSON 序列化 com.google.code.gson:gson:2.10.1 ``` ## 2. 选型对比 | 方案 | 优点 | 缺点 | 选择 | |------|------|------|------| | SMS 控制 | 无需网络、覆盖广 | 延迟高、成本费用 | ✅ 选择 | | Wi-Fi 控制 | 延迟低、成本低 | 依赖网络、距离限制 | ❌ | | 蓝牙控制 | 延迟低、配对简单 | 距离限制、需手动 | ❌ | # 六、安全设计 ## 1. 认证授权 ### A. 发送者验证 - 验证 SMS 发送者号码 - 仅处理配置的设备号码 - 忽略其他号码的消息 ### B. 权限管理 ```xml <uses-permission android:name="android.permission.SEND_SMS" /> <uses-permission android:name="android.permission.RECEIVE_SMS" /> <uses-permission android:name="android.permission.READ_SMS" /> <uses-permission android:name="android.permission.VIBRATE" /> <uses-permission android:name="android.permission.POST_NOTIFICATIONS" /> <uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="android.permission.DISABLE_KEYGUARD" /> ``` ## 2. 数据保护 ### A. 线程安全 - ConcurrentHashMap 存储设备状态 - Synchronized 块保护列表操作 - Handler 机制更新 UI ### B. 原子操作 ```java private final AtomicBoolean isProcessing = new AtomicBoolean(false); public void onReceive(Context context, Intent intent) { if (!isProcessing.compareAndSet(false, true)) { return; // 防止重复处理 } try { // 处理消息 } finally { isProcessing.set(false); } } ``` ## 3. 防护措施 - 重复消息过滤(2 秒阈值) - 超时防止 UI 卡死 - 异常捕获防止崩溃 # 七、UI/UX 设计 ## 1. 设计风格 ### A. iOS 风格美学 - 扁平化设计 - 圆角卡片 - 流畅动画 - 暗黑模式支持 ### B. 交互动画 ```java // 开关动画:平移 + 颜色 + 缩放 translationAnim.setDuration(300); translationAnim.setInterpolator(new OvershootInterpolator(1.2f)); // 点击反馈:缩小 + 回弹 view.animate() .scaleX(0.96f).scaleY(0.96f) .setDuration(100) .withEndAction(() -> { view.animate() .scaleX(1.0f).scaleY(1.0f) .setDuration(200); }); ``` ## 2. 布局结构 ### A. 三列网格布局 - 高效空间利用 - 横竖屏自适应 - 滚动支持 ### B. 状态卡片 - iOS 风格状态显示 - 实时更新动画 - 颜色区分状态 # 八、监控告警 ## 1. 监控指标 ### A. 设备状态 - 传感器开关状态 - LED 灯状态 - 水泵、风扇状态 - 报警定时器状态 ### B. 通信状态 - SMS 发送状态 - 响应接收状态 - 超时检测 ## 2. 告警规则 ### A. 运动检测 - PIR 传感器触发 - 立即通知用户 - 可选声音和震动 ### B. 紧急告警 - 激光检测触发 - 唤醒屏幕 - 高优先级通知 # 九、部署架构 ## 1. 部署图 ```mermaid graph LR A[Android设备] -->|SMS| B[IoT控制设备] A -->|本地存储| C[SharedPreferences] A -->|SMS| D[传感器网络] D -->|状态| B B -->|响应| A ```  ## 2. 容量规划 - 消息历史:最多 100 条 - 设备命令:支持自定义扩展 - 定时器:3 个可编程定时器 ## 3. 高可用设计 - 自动刷新机制 - 超时重试 - 状态持久化 - 离线工作 # 十、扩展性设计 ## 1. 功能扩展 ### A. 已实现功能 - 自定义命令添加 - 快速命令预设 - 备份恢复 - 命令启用/禁用 ### B. 规划中功能 - 多设备支持 - 命令模板 - 定时任务 - 基于位置的自动化 - Web 仪表板集成 - 蓝牙备用通道 - 语音命令 - 小部件支持 ## 2. 集成能力 ### A. 短信协议 ``` 命令格式: Status # 请求完整状态 Sensors on # 启用传感器 Led1 off # 关闭 LED 1 Alarm1 14:30,10 # 设置 14:30 的闹钟,持续 10 分钟 Water on # 开启水泵 ``` ### B. 响应格式 ``` 12:34:56 07/01/2026 Monday >Sensors: ON >Alarms: ON >L1: ON A14:30 D10 >L2: OFF >Water: OFF >Fan: ON ``` # 十一、性能优化 ## 1. UI 优化 - RecyclerView 复用机制 - 动画硬件加速 - 异步加载状态 ## 2. 数据优化 - ConcurrentHashMap 减少锁竞争 - JSON 序列化优化 - 消息历史限制 ## 3. 内存优化 - 及时释放资源 - WeakReference 引用 - 避免内存泄漏 # 十二、测试策略 ## 1. 单元测试 - 命令解析逻辑 - 响应格式验证 - 状态同步测试 ## 2. 集成测试 - SMS 收发测试 - 多设备兼容性 - 网络异常处理 ## 3. UI 测试 - 交互流畅性 - 动画效果 - 状态更新 # 十三、故障排查 ## 1. 常见问题 ### A. 设备无响应 - 检查电话号码配置 - 验证设备电源和信号 - 确认 SMS 权限已授权 ### B. 命令不生效 - 检查消息格式兼容性 - 验证设备支持的命令集 - 查看 SMS 发送日志 ### C. 重复消息 - 应用自动实现 2 秒去重 - 检查设备是否重复发送 - 调整去重阈值 ## 2. 调试模式 ```java // 启用详细日志 @Override public void onReceive(Context context, Intent intent) { Log.d("SMSReceiver", "Received SMS from: " + getOriginatingAddress()); Log.d("SMSReceiver", "Message body: " + getMessageBody()); } ``` # 十四、最佳实践 ## 1. 开发建议 - 遵循 Android 编码规范 - 使用有意义的变量名 - 为复杂逻辑添加注释 - 在多个 Android 版本上测试 ## 2. 安全建议 - 加密存储敏感数据 - 验证所有输入 - 使用 HTTPS 网络请求(如需要) - 定期更新依赖库 ## 3. 性能建议 - 使用 RecyclerView 替代 ListView - 避免主线程阻塞 - 优化布局层次 - 使用 ProGuard 混淆 # 十五、项目结构 ## 1. 目录组织 ``` sms-control/ ├── app/ │ ├── src/ │ │ ├── main/ │ │ │ ├── java/com/smscontrol/ │ │ │ │ ├── MainActivity.java │ │ │ │ ├── CommandAdapter.java │ │ │ │ ├── MessageAdapter.java │ │ │ │ ├── CommandItem.java │ │ │ │ └── MessageItem.java │ │ │ ├── res/ │ │ │ │ ├── layout/ │ │ │ │ ├── values/ │ │ │ │ └── drawable/ │ │ │ └── AndroidManifest.xml │ │ └── test/ │ ├── build.gradle │ └── proguard-rules.pro └── README.md ``` ## 2. 核心类说明 - MainActivity:应用主入口,管理所有功能 - CommandAdapter:命令网格适配器 - MessageAdapter:消息历史适配器 - CommandItem:命令数据模型 - MessageItem:消息数据模型 # 十六、技术亮点 ## 1. 离线优先设计 - 完全基于 SMS,无需网络连接 - 适用于无网络或网络不稳定的场景 - 可靠的远程控制能力 ## 2. iOS 风格 UI - 流畅的动画效果 - 直观的状态展示 - 优秀的用户体验 ## 3. 线程安全保证 - ConcurrentHashMap 存储设备状态 - AtomicBoolean 防止重复处理 - Synchronized 块保护关键操作 ## 4. 状态持久化 - SharedPreferences 保存配置 - JSON 序列化复杂数据 - 自动备份恢复 # 十七、应用场景 ## 1. 家庭自动化 - 远程控制灯光、电器 - 传感器状态监控 - 定时任务自动化 ## 2. 安全系统 - 门磁传感器监控 - PIR 运动检测 - 紧急告警通知 ## 3. 园艺管理 - 水泵自动控制 - 环境传感器监控 - 定时灌溉任务 ## 4. 农业应用 - 温室设备控制 - 环境参数监控 - 远程故障诊断 # 十八、未来展望 ## 1. 技术演进 - 支持更多通信协议(LoRa、NB-IoT) - AI 辅助的自动化决策 - 边缘计算能力 ## 2. 功能扩展 - 多设备统一管理 - 场景化自动化 - 数据分析和可视化 ## 3. 生态建设 - 开放 API 接口 - 第三方插件支持 - 社区贡献机制 # 十九、总结 Garden Remote Controller 是一个设计精良的 IoT 远程控制应用,通过 SMS 实现了无需网络的设备控制能力。项目在架构设计、UI/UX、线程安全等方面都有良好的实践,特别适合在无网络或网络不稳定的场景下使用。 项目的核心价值在于: - 解决了传统 IoT 方案对网络的依赖 - 提供了直观易用的控制界面 - 实现了可靠的状态同步机制 - 保证了线程安全和数据一致性 对于类似的 IoT 控制项目,该项目提供了很好的参考价值,特别是在离线优先设计、状态管理、UI 交互等方面的实践经验。 *** ## 参考资料 1. [Garden Remote Controller - GitHub Repository](https://github.com/Awrsha/Garden-Remote-Controller) 最后修改:2026 年 01 月 17 日 © 允许规范转载 赞 如果觉得我的文章对你有用,请随意赞赏