From 06bf59d2a317c5a6ae0484f589d75b12b8190f75 Mon Sep 17 00:00:00 2001 From: dxl <64101226@qq.com> Date: Fri, 17 Apr 2020 11:18:55 +0800 Subject: [PATCH] pm3 flasher communication recovery. --- .../cn/rrg/rdv/activities/main/AppMain.java | 3 ++ .../main/PM3FlasherMainActivity.java | 34 ++++++++++++++--- .../models/UniversalBulkPN53XRawModel.java | 7 ++-- communication/src/main/AndroidManifest.xml | 2 +- .../cn/dxl/com/LocalComBridgeAdapter.java | 37 +++++++++---------- .../main/java/cn/rrg/com/AbsBluetoothSpp.java | 5 +-- ...ansferRaw.java => AbsUsbBulkTransfer.java} | 8 ++-- .../main/java/cn/rrg/com/UsbAcr122Raw.java | 2 +- ...BulkTransfer.java => UsbBulkTransfer.java} | 6 +-- .../java/cn/rrg/com/UsbSerialControl.java | 8 +--- .../utils/ContextContentProvider.java | 2 +- pm3flasher/src/main/cpp/client/flash.c | 4 +- .../src/main/cpp/client/uart/uart_posix.c | 2 + .../pm3flasher/Proxmark3Flasher.java | 3 ++ 14 files changed, 71 insertions(+), 52 deletions(-) rename communication/src/main/java/cn/rrg/com/{UsbBulkTransferRaw.java => AbsUsbBulkTransfer.java} (97%) rename communication/src/main/java/cn/rrg/com/{UniversalBulkTransfer.java => UsbBulkTransfer.java} (68%) rename communication/src/main/java/cn/{dxl => rrg}/utils/ContextContentProvider.java (98%) diff --git a/app_main/src/main/java/cn/rrg/rdv/activities/main/AppMain.java b/app_main/src/main/java/cn/rrg/rdv/activities/main/AppMain.java index a6e45e0f..bf10f3b7 100644 --- a/app_main/src/main/java/cn/rrg/rdv/activities/main/AppMain.java +++ b/app_main/src/main/java/cn/rrg/rdv/activities/main/AppMain.java @@ -1,5 +1,6 @@ package cn.rrg.rdv.activities.main; +import android.content.Intent; import android.os.Bundle; import android.view.MenuItem; @@ -43,6 +44,8 @@ public class AppMain extends BaseActivity { initActions(); gotoFragment(appMainDevicesFragment); + + startActivity(new Intent(this, PM3FlasherMainActivity.class)); } private void initViews() { diff --git a/app_main/src/main/java/cn/rrg/rdv/activities/main/PM3FlasherMainActivity.java b/app_main/src/main/java/cn/rrg/rdv/activities/main/PM3FlasherMainActivity.java index 6f50c60d..579b5809 100644 --- a/app_main/src/main/java/cn/rrg/rdv/activities/main/PM3FlasherMainActivity.java +++ b/app_main/src/main/java/cn/rrg/rdv/activities/main/PM3FlasherMainActivity.java @@ -43,10 +43,7 @@ public class PM3FlasherMainActivity extends BaseActivity implements DevCallback< control.register(this); // start communication forward! - LocalComBridgeAdapter.getInstance() - .setInputStream(control.getInput()) - .setOutputStream(control.getOutput()) - .startServer(); + LocalComBridgeAdapter.getInstance().startServer(); initViews(); initActions(); @@ -70,6 +67,9 @@ public class PM3FlasherMainActivity extends BaseActivity implements DevCallback< public void onClick(View v) { mode = MODE.BOOT; if (control.connect(null)) { + LocalComBridgeAdapter.getInstance() + .setInputStream(control.getInput()) + .setOutputStream(control.getOutput()); flashDefaultFW(); } else { ToastUtil.show(context, getString(R.string.tips_device_no_found), false); @@ -86,6 +86,8 @@ public class PM3FlasherMainActivity extends BaseActivity implements DevCallback< public void run() { if (!flasher.isStart(Target.CLIENT)) { if (!flasher.start(Target.CLIENT)) { + ToastUtil.show(context, "Client open failed!", false); + dismissWorkingDialog(); return; } } @@ -117,12 +119,24 @@ public class PM3FlasherMainActivity extends BaseActivity implements DevCallback< } else { if (!flasher.start(Target.BOOT)) { ToastUtil.show(context, getString(R.string.tips_pm3_enter_failed), false); + dismissWorkingDialog(); } + // 记得关闭客户端 + flasher.close(Target.CLIENT); } } }).start(); } + private void dismissWorkingDialog() { + runOnUiThread(new Runnable() { + @Override + public void run() { + mDialogWorkingState.dismiss(); + } + }); + } + private void finishFlash() { flasher.close(Target.BOOT); flasher.close(Target.CLIENT); @@ -150,12 +164,20 @@ public class PM3FlasherMainActivity extends BaseActivity implements DevCallback< @Override public void onAttach(String dev) { // 自动连接设备! - control.connect(dev); - flashDefaultFW(); + if (control.connect(dev)) { + // 更新流引用! + LocalComBridgeAdapter.getInstance() + .setInputStream(control.getInput()) + .setOutputStream(control.getOutput()); + flashDefaultFW(); + } else { + ToastUtil.show(context, "Device connect failed!", false); + } } @Override public void onDetach(String dev) { + } @Override diff --git a/app_main/src/main/java/cn/rrg/rdv/models/UniversalBulkPN53XRawModel.java b/app_main/src/main/java/cn/rrg/rdv/models/UniversalBulkPN53XRawModel.java index 4133e392..dfbeef35 100644 --- a/app_main/src/main/java/cn/rrg/rdv/models/UniversalBulkPN53XRawModel.java +++ b/app_main/src/main/java/cn/rrg/rdv/models/UniversalBulkPN53XRawModel.java @@ -9,8 +9,7 @@ import cn.dxl.common.util.AppUtil; import cn.rrg.com.DevCallback; import cn.dxl.com.DeviceChecker; import cn.rrg.com.DriverInterface; -import cn.rrg.com.UniversalBulkTransfer; -import cn.rrg.com.UsbBulkTransferRaw; +import cn.rrg.com.UsbBulkTransfer; import cn.rrg.devices.PN53X; import cn.rrg.rdv.callback.ConnectCallback; import cn.rrg.rdv.javabean.DevBean; @@ -27,7 +26,7 @@ public class UniversalBulkPN53XRawModel extends AbstractDeviceModel getDriverInterface() { - return UniversalBulkTransfer.getTransfer(); + return UsbBulkTransfer.getTransfer(); } @Override @@ -68,7 +67,7 @@ public class UniversalBulkPN53XRawModel extends AbstractDeviceModel diff --git a/communication/src/main/java/cn/dxl/com/LocalComBridgeAdapter.java b/communication/src/main/java/cn/dxl/com/LocalComBridgeAdapter.java index 17331f51..ab2a0091 100644 --- a/communication/src/main/java/cn/dxl/com/LocalComBridgeAdapter.java +++ b/communication/src/main/java/cn/dxl/com/LocalComBridgeAdapter.java @@ -25,7 +25,7 @@ public final class LocalComBridgeAdapter implements Serializable { * */ // The namespace of the LocalServerSocket - public static final String NAMESPACE = "LocalComBridgeAdapter"; + public static final String NAMESPACE = "DXL.COM.ASL"; // The tag of the log. private final String LOG_TAG = "LocalComBridgeAdapter"; // 本地套接字服务! @@ -33,13 +33,13 @@ public final class LocalComBridgeAdapter implements Serializable { // 单例! private static LocalComBridgeAdapter instance; // 设备输入流! - private InputStream mInputStreamFromDevice; + private volatile InputStream mInputStreamFromDevice; // 设备输出流! - private OutputStream mOutputStreamFromDevice; + private volatile OutputStream mOutputStreamFromDevice; // 客户端输入流 - private InputStream mInputStreamFromSocket; + private volatile InputStream mInputStreamFromSocket; // 客户端输出流 - private OutputStream mOutputStreamFromSocket; + private volatile OutputStream mOutputStreamFromSocket; // 是否已经连接! private volatile boolean isHasClient = false; // 是否关闭监听! @@ -69,6 +69,7 @@ public final class LocalComBridgeAdapter implements Serializable { while (listenAccept) { try { if (serverSocket != null) { + Log.d(LOG_TAG, "服务套接字堵塞等待连接中!"); socket = serverSocket.accept(); if (isHasClient) { isHasClient = false; @@ -157,8 +158,8 @@ public final class LocalComBridgeAdapter implements Serializable { mOutputStreamFromSocket.write(Arrays.copyOf(buffer, len)); mOutputStreamFromSocket.flush(); } - } catch (Exception e) { - e.printStackTrace(); + } catch (Exception ignored) { + // Empty } } } @@ -173,6 +174,13 @@ public final class LocalComBridgeAdapter implements Serializable { } public static LocalComBridgeAdapter getInstance() { + synchronized (LocalComBridgeAdapter.class) { + /* + * It is a single instance tools + * you can't instantiation than for once. + * */ + if (instance == null) instance = new LocalComBridgeAdapter(); + } return instance; } @@ -208,7 +216,7 @@ public final class LocalComBridgeAdapter implements Serializable { e.printStackTrace(); Log.e(LOG_TAG, "If you see an error message like \"Address already in use\", check that you call the stopServer function"); } - Log.d(LOG_TAG, "ComBridgeAdapter start!"); + Log.w(LOG_TAG, "LocalComBridgeAdapter start!"); } } return this; @@ -225,7 +233,7 @@ public final class LocalComBridgeAdapter implements Serializable { } serverSocket = null; } - Log.d(LOG_TAG, "ComBridgeAdapter server stop!"); + Log.w(LOG_TAG, "LocalComBridgeAdapter server stop!"); } } @@ -233,7 +241,6 @@ public final class LocalComBridgeAdapter implements Serializable { synchronized (LOCK) { isHasClient = false; try { - if (socket != null) { socket.shutdownInput(); socket.shutdownOutput(); @@ -243,15 +250,7 @@ public final class LocalComBridgeAdapter implements Serializable { } catch (IOException e) { e.printStackTrace(); } - Log.d(LOG_TAG, "ComBridgeAdapter client stop!"); + Log.d(LOG_TAG, "LocalComBridgeAdapter client stop!"); } } - - static { - /* - * It is a single instance tools - * you can't instantiation than for once. - * */ - instance = new LocalComBridgeAdapter(); - } } \ No newline at end of file diff --git a/communication/src/main/java/cn/rrg/com/AbsBluetoothSpp.java b/communication/src/main/java/cn/rrg/com/AbsBluetoothSpp.java index d2e14692..f18d169c 100644 --- a/communication/src/main/java/cn/rrg/com/AbsBluetoothSpp.java +++ b/communication/src/main/java/cn/rrg/com/AbsBluetoothSpp.java @@ -8,16 +8,13 @@ import android.content.BroadcastReceiver; import android.content.Intent; import android.content.Context; import android.content.IntentFilter; -import android.net.LocalSocket; -import android.util.Log; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; -import java.lang.reflect.Field; import java.util.UUID; -import cn.dxl.utils.ContextContentProvider; +import cn.rrg.utils.ContextContentProvider; /** * Created by DXL on 2019/8/1. diff --git a/communication/src/main/java/cn/rrg/com/UsbBulkTransferRaw.java b/communication/src/main/java/cn/rrg/com/AbsUsbBulkTransfer.java similarity index 97% rename from communication/src/main/java/cn/rrg/com/UsbBulkTransferRaw.java rename to communication/src/main/java/cn/rrg/com/AbsUsbBulkTransfer.java index f75e4bad..90cdfd16 100644 --- a/communication/src/main/java/cn/rrg/com/UsbBulkTransferRaw.java +++ b/communication/src/main/java/cn/rrg/com/AbsUsbBulkTransfer.java @@ -19,16 +19,16 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; -import cn.dxl.utils.ContextContentProvider; +import cn.rrg.utils.ContextContentProvider; import cn.dxl.bulkio.BulkInputStream; import cn.dxl.bulkio.BulkOutputStream; -public abstract class UsbBulkTransferRaw implements DriverInterface { +public abstract class AbsUsbBulkTransfer implements DriverInterface { // Application context, is global. cant cache activity context! private Context mContext = ContextContentProvider.mContext; //日志特征 - private static final String LOG_TAG = UsbBulkTransferRaw.class.getSimpleName(); + private static final String LOG_TAG = AbsUsbBulkTransfer.class.getSimpleName(); private DevCallback mCallback = null; //广播接收器,在设备插入和移除时使用 private BroadcastReceiver mReceiver; @@ -50,7 +50,7 @@ public abstract class UsbBulkTransferRaw implements DriverInterface { @Override public InputStream getInput() { if (mPort != null) { - SerialInputStream is = mPort.getInputStream(); - // is.setTimeout(2048); - return is; + return mPort.getInputStream(); } return null; } diff --git a/communication/src/main/java/cn/dxl/utils/ContextContentProvider.java b/communication/src/main/java/cn/rrg/utils/ContextContentProvider.java similarity index 98% rename from communication/src/main/java/cn/dxl/utils/ContextContentProvider.java rename to communication/src/main/java/cn/rrg/utils/ContextContentProvider.java index cea6c352..67971988 100644 --- a/communication/src/main/java/cn/dxl/utils/ContextContentProvider.java +++ b/communication/src/main/java/cn/rrg/utils/ContextContentProvider.java @@ -1,4 +1,4 @@ -package cn.dxl.utils; +package cn.rrg.utils; import android.annotation.SuppressLint; import android.content.ContentProvider; diff --git a/pm3flasher/src/main/cpp/client/flash.c b/pm3flasher/src/main/cpp/client/flash.c index 24202dd7..f4ab9085 100644 --- a/pm3flasher/src/main/cpp/client/flash.c +++ b/pm3flasher/src/main/cpp/client/flash.c @@ -674,10 +674,8 @@ jboolean open_proxmark3(JNIEnv *env, jobject thiz) { if (conn.run) { LOGD("设备已经是打开状态,将会跳过打开!"); return true; - } else { - LOGD("开启完成."); } - return (jboolean) OpenProxmark("dxl", false, 233, true, FLASHMODE_SPEED); + return (jboolean) OpenProxmark("socket:DXL.COM.ASL", false, 1000, true, FLASHMODE_SPEED); } JNIEXPORT jint JNI_OnLoad(JavaVM *vm, void *reserved) { diff --git a/pm3flasher/src/main/cpp/client/uart/uart_posix.c b/pm3flasher/src/main/cpp/client/uart/uart_posix.c index 381eba52..2641cabe 100644 --- a/pm3flasher/src/main/cpp/client/uart/uart_posix.c +++ b/pm3flasher/src/main/cpp/client/uart/uart_posix.c @@ -48,6 +48,7 @@ #include #include #include +#include #include "sys/socket.h" #include "sys/un.h" @@ -195,6 +196,7 @@ serial_port uart_open(const char *pcPortName, uint32_t speed) { if (connect(localsocket, (struct sockaddr *) &remote, len) == -1) { free(sp); + LOGD("连接套接字失败,请检查连接服务是否已经被停止!"); return INVALID_SERIAL_PORT; } diff --git a/pm3flasher/src/main/java/com/proxgrind/pm3flasher/Proxmark3Flasher.java b/pm3flasher/src/main/java/com/proxgrind/pm3flasher/Proxmark3Flasher.java index 283c28bc..63ae4da5 100644 --- a/pm3flasher/src/main/java/com/proxgrind/pm3flasher/Proxmark3Flasher.java +++ b/pm3flasher/src/main/java/com/proxgrind/pm3flasher/Proxmark3Flasher.java @@ -5,6 +5,8 @@ import android.util.Log; import java.io.File; import java.io.FileNotFoundException; +import cn.dxl.com.LocalComBridgeAdapter; + /** * 0. Open the device and create a connection! * 1. Enter bootloader mode, the device will restart and the USB device will regenerate! @@ -80,6 +82,7 @@ public class Proxmark3Flasher { switch (target) { case CLIENT: closeProxmark3(); + LocalComBridgeAdapter.getInstance().stopClient(); break; case BOOT: flashModeClose();