浏览代码

根据下载文件请求类型完成相应的任务

cs 10 月之前
父节点
当前提交
4c2f2cc80e

+ 8 - 1
app/src/main/java/org/las2mile/okio/OkIoClient.java

@@ -153,7 +153,14 @@ public class OkIoClient extends Thread{
 
     public void requestLogFile(){
         DownTaskHandler downTaskHandler = new DownTaskHandler();
-        LogFileMsgReq reqLogFileMsg = (LogFileMsgReq)downTaskHandler.createTask();
+        LogFileMsgReq reqLogFileMsg = (LogFileMsgReq)downTaskHandler.createTask(LogFileMsgReq.PROCEDURE_LOG);
+        peddingDownloadTasks.put(downTaskHandler.taskId,downTaskHandler);
+        send(reqLogFileMsg);
+    }
+
+    public void requestImgsFile(){
+        DownTaskHandler downTaskHandler = new DownTaskHandler();
+        LogFileMsgReq reqLogFileMsg = (LogFileMsgReq)downTaskHandler.createTask(LogFileMsgReq.PROCEDURE_IMAGE);
         peddingDownloadTasks.put(downTaskHandler.taskId,downTaskHandler);
         send(reqLogFileMsg);
     }

+ 11 - 2
app/src/main/java/org/las2mile/okio/client/DownTaskHandler.java

@@ -23,6 +23,7 @@ public class DownTaskHandler {
     Set<Integer> receivedPkts;
     RandomAccessFile mZipRaFile;
     public String mZipPath;
+    int mProcedureType;
 
     public DownTaskHandler(){
         mZipRaFile = null;
@@ -36,13 +37,15 @@ public class DownTaskHandler {
         return realTimeSecond;
     };
 
-    public BaseMsg createTask(){
+    public BaseMsg createTask(int procedureType){
         taskId = genTaskId();
         receivedPkts =  new HashSet<>();
 
         LogFileMsgReq reqLogFileMsg = new LogFileMsgReq();
         reqLogFileMsg.setLogPath("/sdcard/log.txt");
         reqLogFileMsg.taskId = taskId;
+        reqLogFileMsg.procedureType = procedureType;//告知服务器将要下载的是图片还是日志
+        mProcedureType = procedureType;//控制本地sdcard中存储zip文件的前缀img_还是log_
         return  reqLogFileMsg;
     }
 
@@ -103,7 +106,13 @@ public class DownTaskHandler {
                 if (!dir.exists()) {
                     dir.mkdir();
                 }
-                File zipF = new File(dir.getPath() + "/log_"+timeToFmtStr(taskId)+".zip");
+                String prefixType = null;
+                if(mProcedureType == LogFileMsgReq.PROCEDURE_IMAGE){
+                    prefixType = "img_";
+                } else {
+                    prefixType = "log_";
+                }
+                File zipF = new File(dir.getPath() + "/"+prefixType+timeToFmtStr(taskId)+".zip");
                 mZipPath = zipF.getAbsolutePath();//用于显示文件路径
                 mZipRaFile = new RandomAccessFile(zipF, "rw");
                 mZipRaFile.setLength(fileSize);

+ 7 - 0
app/src/main/java/org/las2mile/okio/message/req/LogFileMsgReq.java

@@ -10,8 +10,12 @@ import okio.Buffer;
  * 手机端向设备端拉取日志压缩文件的请求,设备端将返回多个LogFileMsgResp以及一个LogFileEndMsgResp
  */
 public class LogFileMsgReq extends BaseMsg {
+    public static final int PROCEDURE_IMAGE = 1;//下载图片
+    public static final int PROCEDURE_LOG = 2;//下载日志
+
     public String logPath;
     public int taskId;
+    public int procedureType;
 
     public LogFileMsgReq(){
         mCmd = REQ_REQUEST_LOGFILE;
@@ -21,6 +25,7 @@ public class LogFileMsgReq extends BaseMsg {
     public Buffer encodeData() {
         Buffer buffer = new Buffer();
         buffer.writeInt(taskId);
+        buffer.writeInt(procedureType);
         buffer.writeString(logPath, StandardCharsets.UTF_8);
         return buffer;
     }
@@ -28,6 +33,7 @@ public class LogFileMsgReq extends BaseMsg {
     @Override
     public void decodeData(Buffer data, short len) {
         taskId = data.readInt();
+        procedureType = data.readInt();
         logPath = data.readString(StandardCharsets.UTF_8);
     }
 
@@ -55,6 +61,7 @@ public class LogFileMsgReq extends BaseMsg {
                 "logPath='" + logPath + '\'' +
                 ", mCmd=" + mCmd +
                 ", taskId=" + taskId +
+                ", procedureType=" + procedureType +
                 '}';
     }
 }

+ 21 - 0
app/src/main/java/org/las2mile/okio/utils/ZipUtils.java

@@ -11,6 +11,7 @@ import java.util.zip.CRC32;
 import java.util.zip.CheckedOutputStream;
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipOutputStream;
+import java.text.DecimalFormat;
 
 public class ZipUtils {
 
@@ -75,4 +76,24 @@ public class ZipUtils {
         return b2.divide(b1, scale, BigDecimal.ROUND_DOWN).doubleValue();
     }
 
+    public static String formetFileSize(long fileS) {
+        DecimalFormat df = new DecimalFormat("#.00");
+        String fileSizeString = "";
+        String wrongSize = "0B";
+        if (fileS == 0) {
+            return wrongSize;
+        }
+        if (fileS < 1024) {
+            fileSizeString = df.format((double) fileS) + "B";
+        } else if (fileS < 1048576) {
+            fileSizeString = df.format((double) fileS / 1024) + "KB";
+        } else if (fileS < 1073741824) {
+            fileSizeString = df.format((double) fileS / 1048576) + "MB";
+        } else {
+            fileSizeString = df.format((double) fileS / 1073741824) + "GB";
+        }
+        return fileSizeString;
+    }
+
+
 }

+ 10 - 2
app/src/main/java/org/las2mile/scrcpy/MainActivity.java

@@ -57,6 +57,7 @@ import android.content.DialogInterface;
 import android.net.Uri;
 import android.provider.Settings;
 import android.graphics.Color;
+import org.las2mile.okio.utils.ZipUtils;
 
 
 public class MainActivity extends FragmentActivity implements Scrcpy.ServiceCallbacks, SensorEventListener {
@@ -151,12 +152,18 @@ public class MainActivity extends FragmentActivity implements Scrcpy.ServiceCall
     private void initDownloadBtn(){
         final Button btn_dl_status = findViewById(R.id.btn_dl_status);
         btn_dl_status.setOnClickListener(v -> {
-            Log.e("scrcpy","Asset initDownloadBtn");
             Message msg = new Message();
             msg.what = GOT_REMOTE_LOG_PROCEDURE_START;
             mainHandler.sendMessage(msg);
             scrcpy.downloadLog();
         });
+        final Button btn_dl_imgs = findViewById(R.id.btn_dl_imgs);
+        btn_dl_imgs.setOnClickListener(v -> {
+            Message msg = new Message();
+            msg.what = GOT_REMOTE_LOG_PROCEDURE_START;
+            mainHandler.sendMessage(msg);
+            scrcpy.downloadPics();
+        });
     }
 
     private final ServiceConnection serviceConnection = new ServiceConnection() {
@@ -239,8 +246,9 @@ public class MainActivity extends FragmentActivity implements Scrcpy.ServiceCall
     public void onOkIoMsg(BaseMsg baseMsg){
         if(baseMsg instanceof LogFileMsgResp){
             LogFileMsgResp logFileMsgResp = (LogFileMsgResp)baseMsg;
+            String sizeFmt = ZipUtils.formetFileSize(logFileMsgResp.fileSize);
             String percentStr = logFileMsgResp.writenPercent+"%";//Math.round((logFileMsgResp.pktNo+1)*1.0f/logFileMsgResp.pktNums * 100)+"%";
-            String str_save_log_to_local = String.format(getResources().getString(R.string.str_save_log_to_local),logFileMsgResp.zipPath,percentStr);
+            String str_save_log_to_local = String.format(getResources().getString(R.string.str_save_log_to_local),logFileMsgResp.zipPath,sizeFmt,percentStr);
             Message msg = new Message();
             msg.what = GOT_REMOTE_LOG_PROCEDURE;
             msg.obj = str_save_log_to_local;

+ 6 - 0
app/src/main/java/org/las2mile/scrcpy/Scrcpy.java

@@ -98,6 +98,12 @@ public class Scrcpy extends Service {
         }
     }
 
+    public void downloadPics(){
+        if(mOkIoClient != null){
+            mOkIoClient.requestImgsFile();
+        }
+    }
+
     public void pause() {
         videoDecoder.stop();
     }

+ 7 - 2
app/src/main/res/layout-land/surface.xml

@@ -33,7 +33,7 @@
                     android:layout_width="wrap_content"
                     android:layout_height="wrap_content"
                     android:layout_weight="1"
-                    android:text="日志保存路径"/>
+                    android:text="文件保存路径"/>
                 <TextView
                     android:id="@+id/tv_remote_log_dlst"
                     android:layout_width="wrap_content"
@@ -44,7 +44,12 @@
                 android:id="@+id/btn_dl_status"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
-                android:text="下载"/>
+                android:text="下载日志"/>
+            <Button
+                android:id="@+id/btn_dl_imgs"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="下载图片"/>
         </LinearLayout>
     </LinearLayout>
 

+ 7 - 2
app/src/main/res/layout/surface.xml

@@ -35,7 +35,7 @@
                     android:layout_width="wrap_content"
                     android:layout_height="wrap_content"
                     android:layout_weight="1"
-                    android:text="日志保存路径"/>
+                    android:text="文件保存路径"/>
                 <TextView
                     android:id="@+id/tv_remote_log_dlst"
                     android:layout_width="wrap_content"
@@ -46,7 +46,12 @@
                 android:id="@+id/btn_dl_status"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
-                android:text="下载"/>
+                android:text="下载日志"/>
+            <Button
+                android:id="@+id/btn_dl_imgs"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="下载图片"/>
         </LinearLayout>
     </LinearLayout>
 

+ 1 - 1
app/src/main/res/values/strings.xml

@@ -13,7 +13,7 @@
     <string name="switch1">Nav Bar  (check this if remote device does not have on-screen nav bar)</string>
     <string name="str_remote_dev_info">公司远程设备软件发行时间:%1$s</string>
     <string name="str_remote_log_dlst">状态:%1$s</string>
-    <string name="str_save_log_to_local">日志保存路径:%1$s,下载进度%2$s,</string>
+    <string name="str_save_log_to_local">文件保存路径:%1$s,大小:%2$s,下载进度%3$s,</string>
 
 
     <string-array name="options_resolution_keys">

+ 1 - 1
server/src/main/java/org/las2mile/okio/OkIOServer.java

@@ -84,7 +84,7 @@ public class OkIOServer extends Thread{
                                     LogFileMsgReq reqLogFileMsg = new LogFileMsgReq();
                                     reqLogFileMsg.decodeData(packet.mBaseMsgBuffer, (short) packet.mBaseMsgBuffer.size());
                                     Ln.e("server process cmd "+reqLogFileMsg.toString());
-                                    LogZipFileProcedure logZipFileProcedure =  new LogZipFileProcedure(sink);
+                                    LogZipFileProcedure logZipFileProcedure =  new LogZipFileProcedure(sink,reqLogFileMsg.procedureType);
                                     //logZipFileProcedure.taskId = reqLogFileMsg.taskId;
                                     logZipFileProcedure.createTask(reqLogFileMsg.taskId);
                                     logZipFileProcedureMap. put(logZipFileProcedure.taskId,logZipFileProcedure);

+ 7 - 0
server/src/main/java/org/las2mile/okio/message/req/LogFileMsgReq.java

@@ -10,8 +10,12 @@ import okio.Buffer;
  * 手机端向设备端拉取日志压缩文件的请求,设备端将返回多个LogFileMsgResp以及一个LogFileEndMsgResp
  */
 public class LogFileMsgReq extends BaseMsg {
+    public static final int PROCEDURE_IMAGE = 1;
+    public static final int PROCEDURE_LOG = 2;
+
     public String logPath;
     public int taskId;
+    public int procedureType;
 
     public LogFileMsgReq(){
         mCmd = REQ_REQUEST_LOGFILE;
@@ -21,6 +25,7 @@ public class LogFileMsgReq extends BaseMsg {
     public Buffer encodeData() {
         Buffer buffer = new Buffer();
         buffer.writeInt(taskId);
+        buffer.writeInt(procedureType);
         buffer.writeString(logPath, StandardCharsets.UTF_8);
         return buffer;
     }
@@ -28,6 +33,7 @@ public class LogFileMsgReq extends BaseMsg {
     @Override
     public void decodeData(Buffer data, short len) {
         taskId = data.readInt();
+        procedureType = data.readInt();
         logPath = data.readString(StandardCharsets.UTF_8);
     }
 
@@ -55,6 +61,7 @@ public class LogFileMsgReq extends BaseMsg {
                 "logPath='" + logPath + '\'' +
                 ", mCmd=" + mCmd +
                 ", taskId=" + taskId +
+                ", procedureType=" + procedureType +
                 '}';
     }
 }

+ 19 - 3
server/src/main/java/org/las2mile/okio/server/LogZipFileProcedure.java

@@ -7,6 +7,7 @@ import org.las2mile.okio.message.BaseMsg;
 import org.las2mile.okio.message.resp.LogFileEndMsgResp;
 import org.las2mile.okio.utils.ZipUtils;
 import org.las2mile.okio.message.resp.LogFileMsgResp;
+import org.las2mile.okio.message.req.LogFileMsgReq;
 
 import java.io.File;
 import java.io.FileInputStream;
@@ -23,9 +24,12 @@ public class LogZipFileProcedure {
     long fileSize;
     public int taskId;
 
+    int mFileType;//见LogFileMsgReq中的procedureType定义,控制压缩目的路径、源、zip内根目录命名
+
     BufferedSink mSink;
 
-    public LogZipFileProcedure(BufferedSink sink) throws Exception {
+    public LogZipFileProcedure(BufferedSink sink,int fileType) throws Exception {
+        mFileType =  fileType;
         mSink = sink;
         prepareLogFile();
     }
@@ -36,7 +40,19 @@ public class LogZipFileProcedure {
 
     private void prepareLogFile() throws Exception {
         int FRAME_IMAGE_DATA_SIZE = 8192;//4096 ok;//2048 ok;//1024;//4096;//128  2048
-        File logZip = ZipUtils.compressLogServer();
+        String toCompressDir;
+        String outTmpZipPath;
+        String zipInternalName;
+        if(mFileType== LogFileMsgReq.PROCEDURE_IMAGE) {//与客户端请求一致
+            toCompressDir = "/sdcard/KYNESAVE/CameraPhoto/";
+            outTmpZipPath = "/sdcard/pics.zip";
+            zipInternalName= "imgs";
+        } else {
+            toCompressDir = "/sdcard/KYNESAVE/LogServer/";
+            outTmpZipPath = "/sdcard/log.zip";
+            zipInternalName= "logs";
+        }
+        File logZip = ZipUtils.compressLogServer(toCompressDir,outTmpZipPath,zipInternalName);
         if(logZip != null && logZip.exists()){
             RandomAccessFile randomAccessFile = new RandomAccessFile(logZip,"rw");
             fileSize = randomAccessFile.length();
@@ -145,7 +161,7 @@ public class LogZipFileProcedure {
         mSink.write(dataResp);
         mSink.flush();
         try {
-            Thread.sleep(1000);//需要休眠一下,降低丢包概率
+            Thread.sleep(50/*1000*/);//需要休眠一下,降低丢包概率
         }catch (Exception e){
 
         }

+ 3 - 4
server/src/main/java/org/las2mile/okio/utils/ZipUtils.java

@@ -15,9 +15,8 @@ import java.nio.charset.StandardCharsets;
 
 public class ZipUtils {
 
-    public static File compressLogServer() {
-        String toCompressDir = "/sdcard/KYNESAVE/LogServer/";
-        File zipfile = new File("/sdcard/log.zip");
+    public static File compressLogServer(String toCompressDir,String tmpZipPath,String zipInternalName) {
+        File zipfile = new File(tmpZipPath);
 
         if (zipfile.exists()) {
             zipfile.delete();
@@ -25,7 +24,7 @@ public class ZipUtils {
 
         try {
             ZipOutputStream zipOutputStream = new ZipOutputStream(new CheckedOutputStream(new FileOutputStream(zipfile),new CRC32()));
-            zip(zipOutputStream,"log",new File(toCompressDir));
+            zip(zipOutputStream,zipInternalName/* "log"*/,new File(toCompressDir));
             zipOutputStream.flush();
             zipOutputStream.close();
         } catch (Exception e) {