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. 系统架构

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 命令并发送

接口定义:

void sendCommand(String command, CommandCallback callback);

数据模型:

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. 命令发送流程

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.3

B. 依赖库

// 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. 权限管理

<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. 原子操作

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 -->|响应| 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. 调试模式

// 启用详细日志
@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
最后修改:2026 年 01 月 17 日
如果觉得我的文章对你有用,请随意赞赏