4G物联网遥控终端
一、项目说明 本项目是一套基于 阿里云IoT平台云产品流转 的物联网远程控制解决方案。Android APP 和 Air780EP 4G模组作为 同一产品下的两个不同设备 注册在阿里云平台上,通过云产品流转规则实现双向消息路由,无需额外搭建中转服务器。 Air780EP 端:运行在 RTOS 实时操作系统 上的 LuatOS Lua 固件,负责GPIO控制、LBS基站定位、数据采集与上报 Android APP 端:Java 开发的控制终端,负责设备状态显示、远程控制指令下发、历史数据查询 通信链路:APP ←→ 阿里云IoT(云产品流转)←→ Air780EP,全程经过阿里云平台鉴权和路由 应用场景 远程设备开关控制(如灯光、电机、继电器等) 4G设备位置追踪(LBS基站定位) 设备租赁/计费管理(到期自动停机) 无人值守设备远程运维 核心特性 双路GPIO远程控制(开关A / 开关B) LBS基站定位,每60秒上报经纬度,APP端可跳转高德地图查看位置 设备到期管理:设定截止时间后到期自动关闭设备,续期后自动恢复 断网保护:断网超过300秒自动停止设备,恢复网络后自动续期 多用户体系:管理员 + 普通用户,管理员可管理所有设备和用户 历史数据查询:SQLite本地存储所有设备参数变化记录,支持时间范围筛选 设备离线计时:断网期间软件模拟时间递进,保证到期判断准确性 二、阿里云架构 2.1 设备关系 在阿里云IoT平台上,Android APP 和 Air780EP 属于 同一个产品下的两个不同设备 2.2 云产品流转机制 通过阿里云 云产品流转 功能实现设备间消息转发: Android APP (设备A) Air780EP (设备B) │ │ │── 发布到 property/set ──>│ │ │ │ │ │ ┌─────┴─────┐ │ │ │ 阿里云IoT │ │ │ │ 云产品流转 │ │ │ └─────┬─────┘ │ │ │ │ │ │── 转发到 ──>│── 接收 property/set │ │ │── 执行GPIO控制 │ │ │── 上报 property/post │ │ │ │ ┌─────┴─────┐ │ │ │ 阿里云IoT │ │ │ │ 云产品流转 │ │ │ └─────┬─────┘ │ │ │ │ │<── 转发到 ───────────────│ │ │── 接收 property/post │ │ │── 更新UI/存入SQLite │ │ 云产品流转配置要点: 阿里云IoT控制台 → 产品详情 → 云产品流转 配置数据流转规则: 数据源:设备A(APP)发布的 property/set 主题 数据目的:设备B(Air780EP)订阅的 property/set 主题 反向同理:设备B的 property/post 流转到设备A 两个设备共享同一个产品,通过产品内流转实现消息互通 无需额外搭建服务器,阿里云平台内部完成消息路由 2.3 与直连方式的区别 对比项 本项目方式(云产品流转) 直连方式 设备关系 同产品不同设备,云平台转发 不同产品,各自独立连接 消息路由 阿里云内部流转,低延迟 需要额外中转服务器 配置复杂度 阿里云控制台配置流转规则 需开发中转服务 扩展性 添加设备只需配置新流转规则 需修改中转逻辑 安全性 阿里云平台统一鉴权 需自行实现鉴权 三、项目结构 安卓-阿里云-AIR780/ │ ├── Air780EP_Aliyun_LBS/ # Air780EP 4G模组固件 (LuatOS/RTOS) │ ├── main.lua # 主程序入口 │ │ ├── LBS基站定位任务(每60秒) │ │ ├── 设备到期检测(每6秒) │ │ ├── 断网监测与离线计时(每1秒) │ │ ├── 网络时间获取与fskv持久化 │ │ ├── 数据上报主循环(每5秒) │ │ └── GPIO控制与状态管理 │ │ │ ├── aliyun.lua # 阿里云IoT SDK库 │ │ ├── MQTT连接管理(自动重连20秒间隔) │ │ ├── 一机一密 / 一型一密认证 │ │ ├── 消息发布/订阅 │ │ └── OTA固件升级(libfota) │ │ │ ├── testEvt.lua # MQTT消息接收处理 │ │ ├── Switch_A / Switch_B 开关控制 │ │ ├── Upload_count 上传次数设置 │ │ ├── Device_Get_New_T 时间获取次数 │ │ └── Devicestoptime_ 截止时间设定 │ │ │ ├── testYjym.lua # 一机一密认证配置 │ │ ├── ProductKey / DeviceName / DeviceSecret │ │ └── 区域:cn-shanghai,非SSL │ │ │ ├── testPm.lua # 电源管理 │ │ └── 连接成功后进入低功耗模式(LIGHT),关闭USB │ │ │ └── netready.lua # 网络初始化 │ └── SIM卡自动切换(simid 2),等待IP_READY │ └── Remote_Control/ # Android 控制端APP └── app/src/main/java/com/example/remote_control/ │ ├── 【用户认证模块】 │ ├── LoginActivity.java # 登录界面 │ │ ├── 用户名/密码验证(6-12位可见ASCII) │ │ ├── 管理员账户硬编码验证 │ │ ├── 记住密码 / 自动登录 │ │ └── 密码可见性切换 │ │ │ └── RegisterActivity.java # 注册界面 │ ├── 注册码验证(registerlzy) │ ├── 用户名唯一性检查 │ ├── 密码一致性验证 │ └── 输入过滤(仅可见ASCII) │ ├── 【主界面模块】 │ ├── MainActivity.java # 普通用户主界面 │ │ ├── 设备控制入口 │ │ ├── 添加设备 │ │ ├── 数据查询 │ │ └── 退出登录 │ │ │ └── MainActivityAdmin.java # 管理员主界面 │ ├── 设备控制(跳转设备管理) │ ├── 添加设备(含用户分配) │ ├── 数据查询(无归属限制) │ ├── 用户管理 │ └── 退出登录 │ ├── 【设备管理模块】 │ ├── DeviceControlActivity.java # 设备控制列表(普通用户) │ │ ├── 按当前用户过滤设备 │ │ ├── 按添加时间倒序排列 │ │ └── 点击设备发起MQTT连接 │ │ │ ├── DeviceManagerActivity.java # 设备管理(管理员) │ │ ├── 设备列表展示 │ │ ├── 设备详情编辑(归属用户、设备名) │ │ ├── 设备连接 │ │ └── 设备删除 │ │ │ └── AliyunDeviceConnect.java # 设备连接流程 │ ├── 15秒连接超时检测 │ ├── 连接成功后自动请求数据 │ ├── 进度对话框显示 │ └── 连接回调接口 │ ├── 【MQTT通信模块】 │ ├── AliyunOperate.java # MQTT核心操作(单例) │ │ ├── MQTT连接/断开/重连 │ │ ├── 消息发布/订阅 │ │ ├── 消息解析与UI更新 │ │ ├── 数据插入SQLite │ │ └── ScheduledExecutorService自动重连(10秒) │ │ │ ├── AliyunIoTSignUtil.java # HMAC-SHA1签名工具 │ │ ├── 参数字典序排序 │ │ ├── 规范化请求字符串拼接 │ │ └── HMAC-SHA1加密 │ │ │ └── AliyunDataService.java # 后台MQTT服务 │ ├── START_STICKY保活策略 │ ├── Service绑定/解绑 │ └── 资源清理 │ ├── 【数据展示模块】 │ ├── AliyunDataDisp.java # 设备数据显示/控制界面 │ │ ├── 11项数据实时显示 │ │ ├── 开关A/B切换控制 │ │ ├── 手动数据请求 │ │ ├── 时间同步请求 │ │ ├── 截止时间设定(日期+时间+秒) │ │ ├── 高德地图跳转 │ │ └── 历史查询入口 │ │ │ ├── AliyunData_Tx.java # UI数据绑定单例 │ │ └── 11个TextView引用 + MyHelper实例 │ │ │ └── SecondPickerDialog.java # 秒数选择器Dialog │ └── NumberPicker 0-59秒选择 │ ├── 【数据查询模块】 │ └── HistoryQuery.java # 历史数据查询 │ ├── 设备ID + 数据类型 + 时间范围筛选 │ ├── 8种数据类型查询 │ ├── 长按复制数据(500ms阈值) │ ├── 管理员无归属限制 │ └── 触摸事件有效性验证 │ ├── 【用户管理模块】 │ └── UserManagementActivity.java # 用户管理(管理员专用) │ ├── 用户列表(倒序显示) │ ├── 添加/编辑用户 │ ├── 长按删除用户 │ └── 管理员账户保护 │ └── 【数据库模块】 └── MyHelper.java # SQLite数据库 ├── 数据库:DeviceData.db ├── 表:Device_Data └── 字段:_id, deviceId, parameterName, parameter, parameterGetTime 四、Air780EP 运行环境 4.1 RTOS 与 LuatOS Air780EP 模组运行在 RTOS(实时操作系统) 上,具体为合宙自研的 LuatOS 框架,基于底层 RTOS 内核构建。应用层使用 Lua 脚本开发,由 LuatOS 框架解释执行。 ┌─────────────────────────────────────────┐ │ Lua 应用层 │ │ main.lua / testEvt.lua / testYjym.lua │ ├─────────────────────────────────────────┤ │ LuatOS 框架层 │ │ sys / aliyun / gpio / uart / fskv │ │ lbsLoc / mobile / json / zbuff │ ├─────────────────────────────────────────┤ │ RTOS 内核层 │ │ 任务调度 / 定时器 / 信号量 / 消息队列 │ ├─────────────────────────────────────────┤ │ 硬件驱动层 │ │ 4G基带 / UART / GPIO / SPI / I2C │ ├─────────────────────────────────────────┤ │ Air780EP 硬件 │ │ ASR1606 主芯片 + 4G射频 + 外设 │ └─────────────────────────────────────────┘ 4.2 RTOS 特性 RTOS特性 本项目应用 说明 多任务并行 sys.taskInit 创建多个任务 LBS定位任务、主循环任务、网络监测任务并行运行 定时器 sys.timerLoopStart 1秒/6秒/5秒周期任务,基于RTOS硬件定时器 信号量/消息 sys.waitUntil / sys.wait 任务间同步,如等待"IP_READY"信号 协程调度 sys.wait() 非阻塞等待 Lua协程让出CPU,RTOS调度其他任务 看门狗 wdt.init(9000) RTOS级硬件看门狗,防止程序死锁 低功耗管理 testPm.lua RTOS支持LIGHT休眠模式,降低功耗 Flash存储 fskv RTOS提供的Key-Value持久化存储接口 4.3 与传统单片机开发的区别 对比项 Air780EP (RTOS/LuatOS) 传统单片机 (如ESP8266 Arduino) 开发语言 Lua脚本 C/C++ 任务模型 多任务RTOS,协程调度 单任务loop轮询 并发处理 多任务并行,sys.wait非阻塞 需手动管理状态机 网络栈 4G蜂窝网络,原生TCP/IP WiFi,需外部模块 固件更新 OTA远程升级(libfota) 需本地烧录 内存管理 RTOS自动管理,Lua GC 手动管理 启动速度 Lua解释执行,毫秒级启动 编译执行 4.4 LuatOS 主要模块使用 模块 用途 本项目调用 sys 任务管理、定时器、消息 taskInit, timerLoopStart, waitUntil, wait, run aliyun 阿里云IoT SDK connect, subscribe, publish, on gpio GPIO控制 setup, set, get uart 串口通信 setup, write fskv Flash键值存储 init, get, set lbsLoc LBS基站定位 request mobile 蜂窝网络管理 status, reqCellInfo, setAuto json JSON编解码 encode, decode zbuff 字节缓冲区 create, seek, write wdt 看门狗 init, feed 五、技术参数总表 5.1 Air780EP 4G模组固件参数 参数类别 参数名 值/说明 模组型号 Air780EP 合宙4G Cat.1模组 运行系统 RTOS 实时操作系统 开发框架 LuatOS Lua脚本开发,基于RTOS内核 主芯片 ASR1606 固件版本 1.0.2 PROJECT = "aliyundemo_lbsLoc" 调试串口 UART1 波特率 921600 GPIO配置 BOOT_PIN = 0 GPIO0,上拉输出,默认低电平 LED__PIN = 27 GPIO27,上拉输出,默认低电平 看门狗 WDT 超时9000ms,喂狗间隔3000ms MQTT协议 非SSL 端口1883 MQTT区域 cn-shanghai 阿里云华东2 MQTT保活 300秒 keepalive MQTT重连 20秒间隔 aliyun.lua内置 SIM卡 simid 2 自动切换,需插SIM卡 网络模式 mobile.setAuto 6秒注册,60秒搜网超时 定位方式 LBS基站定位 非GPS 定位周期 60秒 lbsLoc.request(getLocCb) 定位超时 3秒 CELL_INFO_UPDATE等待 数据上报周期 5秒 主循环sys.wait(5000) 上报次数限制 每天10次 每6小时刷新+3次 到期检测周期 6秒 timerLoopStart 6000ms 断网检测周期 1秒 timerLoopStart 1000ms 断网容忍时间 300秒(5分钟) 超时后停止设备 时间同步 每6小时 get_New_time=5次 持久化存储 fskv Flash Key-Value存储 时区 UTC+8 所有时间按北京时间处理 时间基准偏移 28800秒 UTC与北京时间差值 5.2 Android APP参数 参数类别 参数名 值/说明 开发语言 Java Android SDK 数据库 SQLite DeviceData.db,版本1 数据存储 SharedPreferences UserPrefs + Aliyun_Triplet MQTT客户端 Eclipse Paho org.eclipse.paho.client.mqttv3 MQTT连接 TCP 1883端口,非SSL MQTT区域 cn-shanghai 华东2 MQTT保活 300秒 MqttConnectOptions MQTT超时 10秒 connectionTimeout 自动重连 10秒间隔 ScheduledExecutorService 连接超时 15秒 AliyunDeviceConnect 签名算法 HMAC-SHA1 AliyunIoTSignUtil 管理员账户 lzyadmin / lzy0424 硬编码,不保存登录态 注册码 registerlzy 预设,注册时校验 用户名规则 6-12位 仅可见ASCII字符 密码规则 6-12位 仅可见ASCII字符 设备物理ID 10位数字 自增,如0000000001 长按阈值 500ms HistoryQuery数据复制 最大移动距离 10px 长按判定容差 地图 高德地图 androidamap:// URI Scheme 时区 Asia/Shanghai UTC+8 5.3 阿里云IoT通信参数 参数类别 参数名 值/说明 认证方式 一机一密 ProductKey + DeviceName + DeviceSecret 连接地址 tcp://{productKey}.iot-as-mqtt.cn-shanghai.aliyuncs.com:1883 Client ID {productKey}.{deviceName}|securemode=2,signmethod=hmacsha1| 用户名 {deviceName}&{productKey} 密码 HMAC-SHA1签名值 参数按字典序拼接后加密 订阅主题 /sys/{productKey}/{deviceName}/thing/event/property/post 设备上报 发布主题 /sys/{productKey}/{deviceName}/thing/event/property/set APP控制 自定义主题 /hy5iV6QRUu4/868327073962407/user/control_2 testEvt.lua订阅 消息路由 云产品流转 同产品不同设备间消息转发 5.4 数据交互参数表 参数标识 数据类型 方向 范围/格式 说明 Switch_A int 双向 0/1 开关A(LED_PIN 27)状态 Switch_B int 双向 0/1 开关B(BOOT_PIN 0)状态 Upload_count int 双向 0~50 剩余上传次数,APP设置时传1 Device_Get_New_T int 双向 0~50 获取时间次数,APP设置时传1 Devicestoptime_ long 双向 毫秒时间戳 设备截止时间 Longitude_Z string 上行 整数3位+小数7位 经度(LBS定位) Latitude_Z string 上行 整数3位+小数7位 纬度(LBS定位) Location_Time string 上行 毫秒时间戳 定位时间 Air780EP_Sys_Time string 上行 毫秒时间戳 设备系统时间 Device_Sign_now int 上行 0/1 设备使能状态(1=正常,0=到期/停机) 5.5 SharedPreferences存储结构 UserPrefs(用户数据): Key 类型 说明 {username} String 用户名=密码(key-value存储) remember boolean 是否记住密码 autoLogin boolean 是否自动登录 username String 当前保存的用户名 password String 当前保存的密码 Aliyun_Triplet(设备数据): Key 类型 说明 AliyunDeviceName_{name} String 设备显示名称 productKey_{name} String 阿里云ProductKey deviceName_{name} String 阿里云DeviceName deviceSecret_{name} String 阿里云DeviceSecret BelongingUser_{name} String 设备归属用户名 DevicePhysicalID_{name} String 设备物理ID(10位) AddTime_{name} long 设备添加时间戳(毫秒) 5.6 SQLite数据库结构 数据库名: DeviceData.db,版本1 表名: Device_Data 列名 类型 说明 _id INTEGER 自增主键 deviceId TEXT 设备物理ID parameterName TEXT 参数名(Longitude/Latitude/Switch1/Switch2/LocationTime/DeviceTime/Deadline/DeviceStatus) parameter TEXT 参数值 parameterGetTime TEXT 获取时间(yyyy-MM-dd HH:mm:ss) 5.7 fskv持久化存储(Air780EP端) Key 类型 说明 Fskv_Init boolean 首次初始化标志 Dis_time int 断网累计时间(秒) aliyun_Up int 剩余上传次数 get_New_time_ int 剩余获取时间次数 Sys_Ena int 系统使能状态 L_GPIO_27 int LED_PIN状态 B_GPIO_00 int BOOT_PIN状态 time_year/mon/day/hour/min/sec int 当前时间 time_year_S/mon_S/day_S/hour_S/min_S/sec_S int 截止时间 get_timeY/M/D/H int 下次获取时间触发点 Comp_timeY/M/D int 下次每日重置触发点 更多详情及代码信息请点击项目文件夹查看