No puedo hacer que Wiegand RFID-reader y Odroid C2 funcionen correctamente

0

Tengo una tarea bastante interesante. La tarea es la siguiente: Odroid C2 (computadora de placa única) que se ejecuta en Android 5.1 tiene que recibir la identificación de la tarjeta de RFID-reader sobre la interfaz Wiegand . Para lograr esto, mi aplicación escucha UART port (/ dev / ttyS1) con el permiso SU :

public SerialPort(...){
    Process su = Runtime.getRuntime().exec("/system/bin/su");
    String cmd = "chmod 666 " + "path/to/the/device" + "\n"
                    + "exit\n";
    su.getOutputStream().write(cmd.getBytes());
    ...
}

y la configuración de tty en JNI de la siguiente manera:

JNIEXPORT jobject JNICALL Java_android_1serialport_1api_SerialPort_open(...) {
    int fd;
    speed_t speed;
    jobject mFileDescriptor;

        /* Opening device */
    {
        fd = open("path/to/the/device", O_RDWR | O_NOCTTY | O_NDELAY);  
    }
        //all check blocks are omitted for the sake of simplicity

        /* Configure device */
    {
        struct termios cfg;

        cfsetospeed(&cfg, speed);
        cfsetispeed(&cfg, speed);

        cfg.c_cflag |= (CLOCAL | CREAD);     //ignore modem controls
        cfg.c_cflag &= ~CSIZE;
        cfg.c_cflag |= CS8;          //8-bit characters
        cfg.c_cflag &= ~PARENB;      //no parity bit
        cfg.c_cflag &= ~CSTOPB;      //only need 1 stop bit
        cfg.c_cflag &= ~CRTSCTS;     //no hardware flowcontrol

        //setup for non-canonical mode
        cfg.c_iflag &= ~(IGNBRK | BRKINT | PARMRK | ISTRIP | INLCR | IGNCR
        | ICRNL | IXON);
        cfg.c_lflag &= ~(ECHO | ECHONL | ICANON | ISIG | IEXTEN);
        cfg.c_oflag &= ~OPOST;

        //fetch bytes as they become available
        cfg.c_cc[VMIN] = 1;
        cfg.c_cc[VTIME] = 0;

        //creating FileDescriptor...

        return mFileDescriptor;
    }

Permite pasar al lado Java ... Aquí simplemente pasamos el correspondiente FileDescriptor como argumento al objeto FileInputStream para leerlo más adelante

public SerialPort(...){
    ...
    FileInputStream mFileInputStream;
    FileDescriptor mFd;

    mFd = open(...); //recieve newly created FileDescriptor

    mFileInputStream = new FileInputStream(mFd); //pass it as argument to FileInputStream
    ...
}

Leí los datos de FileInputStream en otra clase con un hilo separado. Y aquí es donde sale mi problema. Cada vez que coloco la tarjeta rfid delante de la función read() del lector, se activa 15 veces con hex_val igual a FC (Dec = 252).

public FooClass(...){
    ...
    byte[] buffer = new byte[64];

    int size = mInputStream.read(buffer);
    if (size > 0) {

        for (int j = 0; j < buffer.length; j++) {
            String val = String.format("%02X ", buffer[j]);
            Log.v("hex_val", val);
        }
    }
    ...
}

Buscando en Internet, tropecé con una página

enlace

mencionando este valor como un byte de error.

Estaré infinitamente agradecido por cualquier sugerencia o respuesta a las siguientes preguntas:

  • ¿Es mi configuración UART apropiada o no? ¿Debería ser específico para un protocolo Wiegand ?
  • ¿Por qué recibo 15 bytes en lugar de 3Bytes (W26) o 4Bytes (W34)?

P.S. Si tiene un bosquejo Java o C trabajando, déjelo aquí, gracias.

    
pregunta Taras Mykhalchuk

0 respuestas

Lea otras preguntas en las etiquetas