Add you as group of dialout (20)
# usermod -aG dialout myuser
# usermod -aG uucp myuser
# usermod -aG lock myuser
# usermod -aG tty myuser
Note:
- All of these groups may not exist on every Linux distro. (Note, this process must only be done once for each user)
- if you use terminal only, this will effect directly, but if you use window Manager, you require to logout and re-login to make it effect especially on Netbeans, If aftar re-login fail, try restart.
Confirm which com the reader assign
# ls -l /dev/ttyACM0
crw-rw---- 1 root dialout 166, 0 May 19 13:43 /dev/ttyACM0
The card reader assign com at /dev/ttyACM0
This is simple java code to read card when tap on device
import com.fazecast.jSerialComm.SerialPort;
import java.io.InputStream;
import java.io.OutputStream;
/**
*
* @author dedetok
*/
public class DedetokSerialCom {
static private SerialPort serialPort;
static private int boudRate = 115200;
public static void main(String[] args) {
System.out.println("Hello World!");
serialPort = SerialPort.getCommPort("/dev/ttyACM0");
// Configure serial port
serialPort.setBaudRate(boudRate);
serialPort.setNumDataBits(8);
serialPort.setNumStopBits(SerialPort.ONE_STOP_BIT);
serialPort.setParity(SerialPort.NO_PARITY);
// Optional timeouts
serialPort.setComPortTimeouts(
SerialPort.TIMEOUT_READ_SEMI_BLOCKING,
1000,
0
);
// Open port
if (!serialPort.openPort()) {
System.out.println("Failed to open port");
return;
}
System.out.println("Port opened"); // debug
// ------------------read mifare id card ----------------------
System.out.println("MIFARE"); // debug
// STX LEN CMD
byte[] cmd = new byte[] {
(byte)0x02, // STX
(byte)0x01, // LEN
(byte)0x11 // CMD Read UID
};
// Send
serialPort.writeBytes(cmd, cmd.length);
System.out.println("command Send"); // debug
/*
02 02 11 10 : command error
02 02 11 01 : no card
02 06 11 00 xx xx xx xx : mifare id xx xx xx xx
*/
byte[] rx = new byte[64];
int n = serialPort.readBytes(rx, rx.length);
System.out.println("Received bytes: " + n);
// Print raw HEX
for (int i = 0; i < n; i++) {
System.out.printf("%02X ", rx[i]);
}
System.out.println();
// ------------------read ISO15693 inventory card ----------------------
// NOT SUPPORTED
System.out.println();
serialPort.closePort();
System.out.println("Port Closed"); // debug
}
}
This is sample output with uid masked Netbeans
Hello World!
Port opened
MIFARE
command Send
Received bytes: 8
02 06 xx xx xx xx xx 52
What are they?
02 STX
06 LENGTH
Data 1-5 xx xx xx xx xx
Checksum 52
e.g. to read Mifare UID (0x11)
command in bytes: 02 01 11
02: run command
01: length
11: command to read Mifare UID
10 checksum ( 01 xor 11 )
if return 4 bytes: MIFARE Classic 1K/4K
if return 7 bytes: NTAG / Ultralight / DESFire
if return 8 bytes: ISO15693
Example response 4 bytes UID (classic mifare)
02 06 01 xx xx xx xx 8E
| | | | |
| | | | -> checksum
| | | -------------> data uid
| | ----------------> status
| -------------------> length data
----------------------> STX
Example response 6 bytes UID
02 0A 11 00 xx xx xx xx xx xx 80 00
| | | | | |
| | | | | -> SAK
| | | | ----> checksum
| | | -------------------------> data uid
| | ----------------------------> status
| -------------------------------> length data
----------------------------------> STX