Garden Remote Controller SMS IoT 控制系统技术分析
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）编程语言：JavaUI 框架：AndroidX + Material Design持久化：SharedPreferences + GsonB. 架构特点单 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. 系统架构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 --> G3. 组件说明MainActivity：核心控制器，管理 UI 和业务逻辑CommandAdapter：命令网格适配器，处理设备控制交互MessageAdapter：消息历史适配器，显示 SMS 对话记录SmsManager：系统 SMS 管理器，发送和接收短信BroadcastReceiver：短信接收器，处理设备响应四、详细设计1. 核心模块A. 命令发送模块职责：将用户操作转换为 SMS 命令并发送接口定义：void sendCommand(String command, CommandCallback callback);数据模型：class CommandItem { String name; // 命令名称 String command; // SMS 命令文本 boolean isToggle; // 是否为开关命令 boolean enabled; // 是否启用 int iconRes; // 图标资源 }B. 状态同步模块职责：解析设备响应并更新 UI 状态关键流程：接收 SMS 广播验证发送者号码解析响应内容更新设备状态刷新 UI 显示保存到历史记录C. 通知模块职责：处理传感器告警和紧急事件通知类型：PIR 运动检测门磁传感器触发激光检测紧急告警2. 关键流程A. 命令发送流程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. 数据模型// 设备状态映射 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.3B. 依赖库// 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.12. 选型对比方案优点缺点选择SMS 控制无需网络、覆盖广延迟高、成本费用✅ 选择Wi-Fi 控制延迟低、成本低依赖网络、距离限制❌蓝牙控制延迟低、配对简单距离限制、需手动❌六、安全设计1. 认证授权A. 发送者验证验证 SMS 发送者号码仅处理配置的设备号码忽略其他号码的消息B. 权限管理<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 机制更新 UIB. 原子操作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. 交互动画// 开关动画：平移 + 颜色 + 缩放 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. 部署图graph LR A[Android设备] -->|SMS| B[IoT控制设备] A -->|本地存储| C[SharedPreferences] A -->|SMS| D[传感器网络] D -->|状态| B B -->|响应| A2. 容量规划消息历史：最多 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. 调试模式// 启用详细日志 @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.md2. 核心类说明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 交互等方面的实践经验。参考资料Garden Remote Controller - GitHub Repository