首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过USB连接的APDU

通过USB连接的APDU
EN

Stack Overflow用户
提问于 2015-06-17 15:59:27
回答 1查看 1.3K关注 0票数 0

我想创建一个android应用程序来查找我的micro-usb (智能卡读取设备),所以我在接收智能卡中的数据时遇到了问题(我发送了一个APDU是0x...方法usbDeviceConnection.bulkTransfer添加到智能卡中。但我不知道如何接收数据或应答的东西(它必须在我发送命令后将卡中的数据应答给我)。当它回答时,我如何编码或将十六进制转换为字符串?

我想,(参考代码)我有一个2端点,所以我对endpointIn和endpointOut有疑问。这些参数是什么?如何使用它在设备和应用之间发送和接收数据?我觉得对不对?BroadcastReceiver是做什么的?

代码语言:javascript
复制
protected void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
   tv = (TextView) findViewById(R.id.textview);   
   //register the broadcast receiver
   mPermissionIntent = PendingIntent.getBroadcast(this, 0, new Intent(ACTION_USB_PERMISSION), 0);
  IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION);
  registerReceiver(mUsbReceiver, filter);

  registerReceiver(mUsbDeviceReceiver, new IntentFilter(UsbManager.ACTION_USB_DEVICE_ATTACHED));
  registerReceiver(mUsbDeviceReceiver, new IntentFilter(UsbManager.ACTION_USB_DEVICE_DETACHED));

  connectUsb();
}

下面是connectUSB方法。

代码语言:javascript
复制
private void connectUsb() {
  Toast.makeText(MainActivity.this,
   "connectUsb()",
  Toast.LENGTH_LONG).show();


  searchEndPoint();

   if (usbInterfaceFound != null) {
  setupUsbComm();

   threadUsbTx = new ThreadUsbTx(usbDeviceConnection, endpointOut);
   threadUsbTx.start();

   //bytes are APDU to send for get data from card.
   threadUsbTx.insertCmd(
   new byte[]{(byte) 0xA0, (byte) 0xA4, 0x00, 0x00, 0x02, 0x3F, 0x00});
   threadUsbTx.insertCmd(
   new byte[]{(byte)0x80, (byte)0xb0, 0x00, 0x04, 0x02, 0x00, 0x0d});
   threadUsbTx.insertCmd(
   new byte[]{0x00, (byte)0xc0, 0x00, 0x00, 0x0d});
   }
  }

这是类ThreadUsbTx..

代码语言:javascript
复制
class ThreadUsbTx extends Thread {
   boolean running;

  UsbDeviceConnection txConnection;
  UsbEndpoint txEndpoint;
  Queue<byte[]> cmdQueue;
   byte[] cmdToSent;


  ThreadUsbTx(UsbDeviceConnection conn, UsbEndpoint endpoint) {
   txConnection = conn;
   txEndpoint = endpoint;
   cmdQueue = new LinkedList<byte[]>();
   cmdToSent = null;

   running = true;
  }

   public void setRunning(boolean r) {
   running = r;
  }

   public void insertCmd(byte[] cmd) {
   synchronized (cmdQueue) {
   cmdQueue.add(cmd);
  }
  }

   @Override
   public void run() {

   while (running) {

   synchronized (cmdQueue) {
   if (cmdQueue.size() > 0) {
   cmdToSent = cmdQueue.remove();
  }
  }

   if (cmdToSent != null) {

   final int usbResult = usbDeviceConnection.bulkTransfer(
   txEndpoint,
   cmdToSent,
   cmdToSent.length,
   0);

   final String s = new String(cmdToSent);
  String result = null;

   try {
  result = new String(cmdToSent,"TIS620"); // To Thai language
  } catch (UnsupportedEncodingException e) {
  e.printStackTrace();
  }

   final String finalResult = result;
  runOnUiThread(new Runnable() {

   @Override
   public void run() {
  Toast.makeText(MainActivity.this,
   finalResult+" "+String.format("%040x",cmdToSent),
  Toast.LENGTH_LONG).show();
  }
  });
   cmdToSent = null;
   }
  }
  }
  }
EN

回答 1

Stack Overflow用户

发布于 2016-12-13 00:49:36

与USB卡读卡器通信的最佳方式是将符合CCID的读卡器与支持OTG的电话一起使用。看看Playstore中的App "CCID Reader应用程序演示“。同样有用的the library可用here。否则,您必须在代码中实现或多或少的CCID行为

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30885623

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档