Browse Source

1. 完善发送文件逻辑

王育民 5 years ago
parent
commit
3fd64dec5b

+ 3 - 3
app/src/main/java/cn/minbb/serial/activities/MainActivity.java

@@ -19,7 +19,6 @@ import cn.minbb.serialport.SerialPortManager;
 import cn.minbb.serialport.listener.OnDataProgressListener;
 import cn.minbb.serialport.listener.OnOpenSerialPortListener;
 import cn.minbb.serialport.listener.OnSerialPortDataListener;
-import cn.minbb.serialport.utils.ByteUtil;
 
 public class MainActivity extends AppCompatActivity {
 
@@ -86,12 +85,12 @@ public class MainActivity extends AppCompatActivity {
         });
     }
 
-    private void setText(String data, int size) {
+    private void setText(String data, double size) {
         String string = "data = " + data + ": " + size + "\n" + textView.getText();
         textView.setText(string);
     }
 
-    public void onClick(View view) {
+    public void onClick(View view) throws Exception {
         switch (view.getId()) {
             case R.id.open_serial_port:
                 if (serialPortManager.openDefaultSerialPort()) {
@@ -129,6 +128,7 @@ public class MainActivity extends AppCompatActivity {
             case R.id.send_file:
                 File file = new File(Environment.getExternalStorageDirectory(), "Documents/image.jpg");
                 Toast.makeText(getApplicationContext(), file.toString(), Toast.LENGTH_SHORT).show();
+                serialPortManager.sendFile(file, (progress, index, total, bytes) -> runOnUiThread(() -> setText("发送文件进度", progress)));
                 break;
         }
     }

+ 1 - 1
serialport/src/main/java/cn/minbb/serialport/SerialPortManager.java

@@ -385,7 +385,7 @@ public class SerialPortManager extends SerialPort implements Serializable, Clone
         serialPortStatus = SerialPortStatus.OPEN;
         if (null != mOnSerialPortDataListener) {
             mOnSerialPortDataListener.onDataReceived(dataBytes, new String(dataBytes));
-            LogUtil.setAppendFile(Arrays.toString(dataBytes));
+            LogUtil.setAppendFile("Notify:" + new String(dataBytes) + Arrays.toString(dataBytes));
             dataBytes = new byte[0];
         } else {
             LogUtil.setAppendFile("串口数据监听器未定义");

+ 27 - 7
serialport/src/main/java/cn/minbb/serialport/impl/SendDataFileImpl.java

@@ -5,26 +5,46 @@ import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileOutputStream;
 import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
+import java.util.Arrays;
 
 import cn.minbb.serialport.handler.SendDataHandler;
 import cn.minbb.serialport.listener.OnDataProgressListener;
+import cn.minbb.serialport.utils.LogUtil;
 
 public class SendDataFileImpl implements SendDataHandler<File> {
 
     @Override
     public void send(FileInputStream fileInputStream, FileOutputStream fileOutputStream, OnDataProgressListener onDataProgressListener, File file) throws IOException {
         FileInputStream fis = new FileInputStream(file);
-        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
         int len;
         byte[] buffer = new byte[64];
         while ((len = fis.read(buffer)) != -1) {
-            baos.write(buffer, 0, len);
+            byteArrayOutputStream.write(buffer, 0, len);
         }
-        byte[] byteArray = baos.toByteArray();
+        byte[] byteArray = byteArrayOutputStream.toByteArray();
         fis.close();
-        baos.close();
-        List<byte[]> list = new ArrayList<>();
+        byteArrayOutputStream.close();
+        int length = byteArray.length;
+        int blockSize = 64, group = length / blockSize + 1;
+        int tailSize = length % blockSize;
+        for (int index = 1; index <= group; index++) {
+            byte[] byteBuffer = new byte[blockSize];
+            if (index < group) {
+                System.arraycopy(byteArray, (index - 1) * blockSize, byteBuffer, 0, blockSize);
+            } else {
+                // 最后一组 - 可能是非完整
+                byteBuffer = new byte[tailSize];
+                System.arraycopy(byteArray, (index - 1) * blockSize, byteBuffer, 0, tailSize);
+            }
+            if (byteBuffer.length != 0) {
+                // 发送数据包
+                fileOutputStream.write(byteBuffer);
+                LogUtil.setAppendFile("发送文件第" + index + "组,共" + group + "组" + Arrays.toString(byteBuffer));
+                if (null != onDataProgressListener) {
+                    onDataProgressListener.onProgress(index / (float) group, index, group, byteBuffer);
+                }
+            }
+        }
     }
 }