Два считывателя ACR122U NFC на Android Raspberry Pi3

Я пытаюсь работать с двумя считывателями NFC ACR122u, подключенными к моему Raspberry Pi3 под Android IoT.

Я использую нативную библиотеку acssmc-1.1.3.jar, предоставленную ASC.

Все работает нормально с одним подключенным считывателем, я могу получить 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 ответов

Другие вопросы по тегам