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 --> 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.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.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 机制更新 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 -->|响应| 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 交互等方面的实践经验。