pm3 flasher communication recovery.

This commit is contained in:
dxl
2020-04-17 11:18:55 +08:00
parent 573e6fa039
commit 06bf59d2a3
14 changed files with 71 additions and 52 deletions
@@ -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() {
@@ -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
@@ -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<String, UsbM
@Override
public DriverInterface<String, UsbManager> getDriverInterface() {
return UniversalBulkTransfer.getTransfer();
return UsbBulkTransfer.getTransfer();
}
@Override
@@ -68,7 +67,7 @@ public class UniversalBulkPN53XRawModel extends AbstractDeviceModel<String, UsbM
AppUtil.getInstance()
.getApp()
.sendBroadcast(
new Intent(UniversalBulkTransfer.getTransfer().getDeviceDiscoveryAction())
new Intent(UsbBulkTransfer.getTransfer().getDeviceDiscoveryAction())
);
} else Log.d(TAG, "startDiscovery: 找不到任何一个USB设备!");
}
+1 -1
View File
@@ -7,7 +7,7 @@
<application>
<!-- 全局Context提供者 -->
<provider
android:name="cn.dxl.utils.ContextContentProvider"
android:name="cn.rrg.utils.ContextContentProvider"
android:authorities="${applicationId}.contextprovider"
android:exported="false" />
</application>
@@ -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();
}
}
@@ -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.
@@ -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<String, UsbManager> {
public abstract class AbsUsbBulkTransfer implements DriverInterface<String, UsbManager> {
// 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<String> mCallback = null;
//广播接收器,在设备插入和移除时使用
private BroadcastReceiver mReceiver;
@@ -50,7 +50,7 @@ public abstract class UsbBulkTransferRaw implements DriverInterface<String, UsbM
private UsbEndpoint mEpOut = null;
//私有构造方法避免被直接调用
protected UsbBulkTransferRaw() {
protected AbsUsbBulkTransfer() {
final String act = getDeviceDiscoveryAction();
final String name = getDeviceNameOnFound();
//建立意图过滤数组
@@ -1,6 +1,6 @@
package cn.rrg.com;
public class UsbAcr122Raw extends UsbBulkTransferRaw {
public class UsbAcr122Raw extends AbsUsbBulkTransfer {
//日志特征
private static final String LOG_TAG = UsbAcr122Raw.class.getSimpleName();
// single instance!
@@ -6,11 +6,11 @@ package cn.rrg.com;
* @author dxl
* @version 1.0
*/
public class UniversalBulkTransfer extends UsbBulkTransferRaw {
public class UsbBulkTransfer extends AbsUsbBulkTransfer {
private static UniversalBulkTransfer transfer = new UniversalBulkTransfer();
private static UsbBulkTransfer transfer = new UsbBulkTransfer();
public static UniversalBulkTransfer getTransfer() {
public static UsbBulkTransfer getTransfer() {
return transfer;
}
@@ -11,8 +11,6 @@ import android.hardware.usb.UsbDeviceConnection;
import android.hardware.usb.UsbManager;
import android.util.Log;
import com.felhr.usbserial.SerialInputStream;
import com.felhr.usbserial.SerialOutputStream;
import com.felhr.usbserial.UsbSerialDevice;
import java.io.IOException;
@@ -21,7 +19,7 @@ import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import cn.dxl.utils.ContextContentProvider;
import cn.rrg.utils.ContextContentProvider;
/*
* Usb 2 uart Serial implements
@@ -174,9 +172,7 @@ public class UsbSerialControl implements DriverInterface<String, UsbManager> {
@Override
public InputStream getInput() {
if (mPort != null) {
SerialInputStream is = mPort.getInputStream();
// is.setTimeout(2048);
return is;
return mPort.getInputStream();
}
return null;
}
@@ -1,4 +1,4 @@
package cn.dxl.utils;
package cn.rrg.utils;
import android.annotation.SuppressLint;
import android.content.ContentProvider;
+1 -3
View File
@@ -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) {
@@ -48,6 +48,7 @@
#include <fcntl.h>
#include <netinet/tcp.h>
#include <netdb.h>
#include <client/tools.h>
#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;
}
@@ -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();