From 6c0204325ff48f51779e9fa0e922c5d6355c4d78 Mon Sep 17 00:00:00 2001 From: Zhanghu Date: Fri, 13 Mar 2026 09:07:26 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E9=97=B9=E9=92=9F=E6=B2=A1?= =?UTF-8?q?=E6=9C=89=E5=BE=AA=E7=8E=AF=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app_dashboard/changelog.md | 10 +-- app_dashboard/src/main/AndroidManifest.xml | 2 - .../dashboard/alarm/PowerAlarmManager.java | 4 ++ .../receiver/CommandBroadcastReceiver.java | 64 +++++++++++++++++++ .../dashboard/serial/SerialPortDetector.java | 11 +--- 5 files changed, 76 insertions(+), 15 deletions(-) diff --git a/app_dashboard/changelog.md b/app_dashboard/changelog.md index 3df06bc..c37cf3f 100644 --- a/app_dashboard/changelog.md +++ b/app_dashboard/changelog.md @@ -9,15 +9,17 @@ author: 2. $ {VERSION_CODE} (去掉空格),会自动替换实际修订号,比如 1.1.4.$ {VERSION_CODE} --> -### [1.0.6.$ {VERSION_CODE}] - 2026.3.X +### [1.1.0.${VERSION_CODE}] - 2026.3.13 #### 文件下载 -* [dashboardclient_1.0.6.apk](dashboardclient_1.0.6.apk) +* [dashboardclient_1.1.0.apk](dashboardclient_1.1.0.apk) #### 更新记录 -* 设置界面增加电源开关测试 -* App 启动时默认不发送开机指令 +* WebView 启用 LocalStorage,支持新版前端 +* 优化定时开关机逻辑,增加不控制和本地控制 +* 命令发送3次,避免命令丢失 +* 支持老款网关检测 ### [1.0.5.26] - 2026.3.5 diff --git a/app_dashboard/src/main/AndroidManifest.xml b/app_dashboard/src/main/AndroidManifest.xml index c90cdea..a6ab014 100644 --- a/app_dashboard/src/main/AndroidManifest.xml +++ b/app_dashboard/src/main/AndroidManifest.xml @@ -29,7 +29,6 @@ android:exported="true"> - @@ -55,5 +54,4 @@ - \ No newline at end of file diff --git a/app_dashboard/src/main/java/cn/ykbox/dashboard/alarm/PowerAlarmManager.java b/app_dashboard/src/main/java/cn/ykbox/dashboard/alarm/PowerAlarmManager.java index 50dd8aa..505cae4 100644 --- a/app_dashboard/src/main/java/cn/ykbox/dashboard/alarm/PowerAlarmManager.java +++ b/app_dashboard/src/main/java/cn/ykbox/dashboard/alarm/PowerAlarmManager.java @@ -276,6 +276,10 @@ public class PowerAlarmManager { Intent intent = new Intent(context, CommandBroadcastReceiver.class); intent.setAction(CommandBroadcastReceiver.ACTION_SEND_COMMAND); intent.putExtra(CommandBroadcastReceiver.EXTRA_COMMAND_HEX, cmdHex); + // 传递时间信息和 alarmId,用于重新设置下一个闹钟 + intent.putExtra(CommandBroadcastReceiver.EXTRA_HOUR, hour); + intent.putExtra(CommandBroadcastReceiver.EXTRA_MINUTE, minute); + intent.putExtra(CommandBroadcastReceiver.EXTRA_ALARM_ID, alarmId); PendingIntent pendingIntent = PendingIntent.getBroadcast( context, alarmId, intent, diff --git a/app_dashboard/src/main/java/cn/ykbox/dashboard/receiver/CommandBroadcastReceiver.java b/app_dashboard/src/main/java/cn/ykbox/dashboard/receiver/CommandBroadcastReceiver.java index eeff483..a5e0024 100644 --- a/app_dashboard/src/main/java/cn/ykbox/dashboard/receiver/CommandBroadcastReceiver.java +++ b/app_dashboard/src/main/java/cn/ykbox/dashboard/receiver/CommandBroadcastReceiver.java @@ -1,11 +1,18 @@ package cn.ykbox.dashboard.receiver; +import android.app.AlarmManager; +import android.app.PendingIntent; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; +import android.os.Build; +import android.os.Handler; +import android.os.Looper; import android.text.TextUtils; import android.util.Log; +import java.util.Calendar; + import cn.ykbox.dashboard.perferences.PreferenceConfiguration; import cn.ykbox.dashboard.serial.SerialPortDetector; @@ -13,6 +20,9 @@ public class CommandBroadcastReceiver extends BroadcastReceiver { private static final String TAG = "CommandReceiver"; public static final String ACTION_SEND_COMMAND = "cn.ykbox.dashboard.ACTION_SEND_COMMAND"; public static final String EXTRA_COMMAND_HEX = "EXTRA_COMMAND_HEX"; + public static final String EXTRA_HOUR = "EXTRA_HOUR"; + public static final String EXTRA_MINUTE = "EXTRA_MINUTE"; + public static final String EXTRA_ALARM_ID = "EXTRA_ALARM_ID"; @Override public void onReceive(Context context, Intent intent) { @@ -30,7 +40,61 @@ public class CommandBroadcastReceiver extends BroadcastReceiver { if (!success) { Log.e(TAG, "Failed to send command via broadcast receiver."); } + + // 重新设置明天的闹钟(实现每天循环) + Integer hour = intent.getIntExtra(EXTRA_HOUR, -1); + Integer minute = intent.getIntExtra(EXTRA_MINUTE, -1); + int alarmId = intent.getIntExtra(EXTRA_ALARM_ID, 0); + + if (hour >= 0 && minute >= 0) { + scheduleNextAlarm(context, alarmId, hexCommand, hour, minute); + } } } } + + /** + * 调度下一个闹钟(明天同一时间) + */ + private void scheduleNextAlarm(Context context, int alarmId, String cmdHex, int hour, int minute) { + new Handler(Looper.getMainLooper()).post(() -> { + AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); + + Intent intent = new Intent(context, CommandBroadcastReceiver.class); + intent.setAction(ACTION_SEND_COMMAND); + intent.putExtra(EXTRA_COMMAND_HEX, cmdHex); + intent.putExtra(EXTRA_HOUR, hour); + intent.putExtra(EXTRA_MINUTE, minute); + intent.putExtra(EXTRA_ALARM_ID, alarmId); + + PendingIntent pendingIntent = PendingIntent.getBroadcast( + context, alarmId, intent, + PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE + ); + + // 计算明天的触发时间 + Calendar calendar = Calendar.getInstance(); + calendar.add(Calendar.DAY_OF_YEAR, 1); + calendar.set(Calendar.HOUR_OF_DAY, hour); + calendar.set(Calendar.MINUTE, minute); + calendar.set(Calendar.SECOND, 0); + + // 使用精确的一次性闹钟 + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + alarmManager.setExactAndAllowWhileIdle( + AlarmManager.RTC_WAKEUP, + calendar.getTimeInMillis(), pendingIntent); + } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { + alarmManager.setExact( + AlarmManager.RTC_WAKEUP, + calendar.getTimeInMillis(), pendingIntent); + } else { + alarmManager.set( + AlarmManager.RTC_WAKEUP, + calendar.getTimeInMillis(), pendingIntent); + } + + Log.d(TAG, "Next alarm scheduled for " + hour + ":" + minute + " tomorrow (ID: " + alarmId + ")"); + }); + } } diff --git a/app_dashboard/src/main/java/cn/ykbox/dashboard/serial/SerialPortDetector.java b/app_dashboard/src/main/java/cn/ykbox/dashboard/serial/SerialPortDetector.java index 6d7ea35..b691b35 100644 --- a/app_dashboard/src/main/java/cn/ykbox/dashboard/serial/SerialPortDetector.java +++ b/app_dashboard/src/main/java/cn/ykbox/dashboard/serial/SerialPortDetector.java @@ -20,7 +20,7 @@ public class SerialPortDetector { public static final String TEST_CMD_ON = "ACEAB400ED"; // 打开设备 // 响应超时时间(毫秒) - private static final long RESPONSE_TIMEOUT = 4000; + private static final long RESPONSE_TIMEOUT = 6000; private DetectionCallback callback; private Handler mainHandler; @@ -190,14 +190,6 @@ public class SerialPortDetector { notifyDetectionProgress(portPath, i + 1, devicePaths.length); Log.d(TAG, "Testing port: " + portPath + " at " + baudRate + " baud"); - - // 老设备没有反馈,如果测试成功,很快就进入下个测试,导致用户看不清串口路径,这里添加延时 - try { - Thread.sleep(2000); - } catch (InterruptedException e) { - Log.e(TAG, "Sleep interrupted", e); - } - if (testSerialPort(portPath, baudRate, ensurePowerOn)) { Log.i(TAG, "Serial port detected successfully: " + portPath); notifyDetectionSuccess(portPath); @@ -228,6 +220,7 @@ public class SerialPortDetector { Log.d(TAG, "Ensuring device power on by sending both commands"); boolean cmd1Success = sendCommandAndWaitResponse(serialHelper, TEST_CMD_OFF); + Thread.sleep(1000); boolean cmd2Success = sendCommandAndWaitResponse(serialHelper, TEST_CMD_ON); // 只要有一个命令收到有效响应就认为串口可用