Raspberry Pi3 Android上的两个ACR122U NFC读卡器

时间:2017-12-27 16:23:47

标签: java android acr122

我正在尝试使用连接到Android IoT下的Raspberry Pi3的两个NFC ACR122u阅读器。

我正在使用ASC提供的原生acssmc-1.1.3.jar库。

连接一个阅读器后,一切正常,我可以获得tagId,打开/关闭蜂鸣器/灯,但是当两者都连接时我无法与第二个阅读器通信。

所以,我可以启动它们,初始化BroadcastReceiver,但是当调试器日志中的onCreate method类的读取器状态更改监听器Reader时,我看到一个读取器已关闭消息D/UsbDeviceConnectionJNI: close

以下代码初始化并启动两个阅读器。但是无法为两个读者获取读者状态,仅针对其中一个读者状态,因为初始化后会立即关闭。

我认为我必须为每个读者单独初始化Reader课程,但也没有运气。

我迷失在这一部分。任何帮助都会非常感激!

public class MainActivity extends AppCompatActivity {

    private static final String ACTION_USB_PERMISSION = "com.android.reader.USB_PERMISSION";

    private List<UsbDevice> active_devices = new ArrayList<>(2);
    private PendingIntent mPermissionIntent;
    private Reader mReader;
    private UsbManager mManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

    mManager = (UsbManager) getSystemService(Context.USB_SERVICE);
    Map<String, UsbDevice> connectedDevices = mManager.getDeviceList();

    mReader = new Reader(mManager);
    int i = 0;
    for (UsbDevice device : connectedDevices.values()) {
        if (mReader.isSupported(device)) {
            active_devices.add(device);

            Reader[] Reader = new Reader[2];
            Reader[i] = new Reader(mManager);
            Reader[i].setOnStateChangeListener(new Reader.OnStateChangeListener() {
                @Override
                public void onStateChange(int slotNum, int prevState, int currState) {
                    Log.i("STATE CHANGE", String.valueOf(currState));
                    if (currState < com.acs.smartcard.Reader.CARD_UNKNOWN || currState > com.acs.smartcard.Reader.CARD_SPECIFIC) {
                        currState = 0;
                    }
                    if (currState == com.acs.smartcard.Reader.CARD_PRESENT) {
                        Log.i("CARD PRESENT", String.valueOf(slotNum));
                    }
                }
            });
            i++;
        }
    }

    this.mPermissionIntent = PendingIntent.getBroadcast(this, 0, new Intent(ACTION_USB_PERMISSION), 0);
    IntentFilter filter = new IntentFilter();

    filter.addAction(ACTION_USB_PERMISSION);
    filter.addAction("android.hardware.usb.action.USB_DEVICE_DETACHED");
    registerReceiver(mReceiver, filter);

    powerUp();
    }

    public void powerUp(UsbManager manager) {
        for (UsbDevice device: active_devices) {
            manager.requestPermission(device, this.mPermissionIntent);
        }
    }

    private final BroadcastReceiver mReceiver = new BroadcastReceiver() {

        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();

            if (MainActivity.ACTION_USB_PERMISSION.equals(action)) {
                synchronized (this) {
                    UsbDevice device = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
                    if (!intent.getBooleanExtra("permission", false)) {
                        Log.i("Permission denied ", device.getDeviceName());
                    } else if (device != null) {
                        Log.i("Opening reader:", device.getDeviceName());
                        new OpenTask().execute(device);
                    }
                }
            } else if ("android.hardware.usb.action.USB_DEVICE_DETACHED".equals(action)) {
                synchronized (this) {
                    UsbDevice device = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
                    if (device != null && device.equals(mReader.getDevice())) {
                        Log.i("Closing...", "Closing...");
                        new CloseTask().execute();
                    }
                }
            }
        }
    };

    private class CloseTask extends AsyncTask<Void, Void, Void> {
        private CloseTask() {
        }

        protected Void doInBackground(Void... params) {
            mReader.close();
            return null;
        }

        protected void onPostExecute(Void result) {
        }
    }

    private class OpenTask extends AsyncTask<UsbDevice, Void, Exception> {
        private OpenTask() {
        }

        protected Exception doInBackground(UsbDevice... params) {
            try {
                mReader.open(params[0]);
                return null;
            } catch (Exception e) {
                return e;
            }
        }

        protected void onPostExecute(Exception result) {
            if (result != null) {

                Log.i("Post Execute Result: ", result.toString());

            } else {

                try{
                    Log.i("Reader name: ", mReader.getReaderName());
                } catch (Exception e){
                    Log.w("Error", e.getMessage());
                }

                int numSlots = mReader.getNumSlots();
                Log.i("Number of slots: ", String.valueOf(numSlots));

            }
        }
    }
}

0 个答案:

没有答案