Home

Awesome

Android Things RC522

An Android Things libray to control RFID readers based on the RC522 reader.

Based on pi-rc522 by user ondryaso

Bintray license Android Things

Features

Planned features

Connections

The connections vary based on the board used.

RST pin is configured programatically.

Raspberry Pi 3

rfid-rc522_bb

RC522 PinRPi Pin nameRPi Pin number
SDAGPIO8, CE024
SCKGPIO11, SCKL23
MOSIGPIO10, MOSI19
MISOGPIO9, MISO21
GNDGND6, 9, 20, 25
RSTAny GPIO pin--
3.3V3V3V1, 17

Installing

This library is available at jCenter. To install add this to your module's build.gradle

dependencies {
    compile 'com.galarzaa.android-things:rc522:1.0.0'

Usage

The use of interruptions is not supported yet.

The RC522 must be polled until a card is found, and then perform any operations you want.

Unfortunately, in Android, the UI thread shouldn't be blocked, so the polling has to be done on a separate thread e.g. AsyncTask, Runnable, etc.

To use the libary, a SpiDevice object must be passed in the constructor, along with a Gpio object for the RST pin.

Polling state

import com.galarzaa.androidthings.Rc522;
public class MainActivty extends AppCompatActivity{
    private Rc522 mRc522;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        PeripheralManagerService pioService = new PeripheralManagerService();
        try {
            /* Names based on Raspberry Pi 3 */
            SpiDevice spiDevice = pioService.openSpiDevice("SPI0.0");
            Gpio resetPin = pioService.openGpio("BCM25");
            /* Names based on NXP Pico i.MX7D I/O */
            SpiDevice spiDevice = pioService.openSpiDevice("SPI3.0");
            Gpio resetPin = pioService.openGpio("GPIO5_IO00");
            mRc522 = new Rc522(this, spiDevice, resetPin);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    private void readRFid(){
        while(true){
            boolean success = mRc522.request();
            if(!success){
                continue;
            }
            success = mRc522.antiCollisionDetect();
            if(!success){
                continue;
            }
            byte[] uid = mRc522.getUid();
            mRc522.selectTag(uid);
            break;
        }
        // Factory Key A:
        byte[] key = {(byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF};
        // Data that will be written
        byte[] newData = {0x0F,0x0E,0x0D,0x0C,0x0B,0x0A,0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x02,0x01,0x00};
        // Get the address of the desired block
        byte block = Rc522.getBlockAddress(3, 2);
        //We need to authenticate the card, each sector can have a different key
        boolean result = rc522.authenticateCard(Rc522.AUTH_A, block, key);
        if (!result) {
            //Authentication failed
            return;
        }
        result = rc522.writeBlock(block, newData);
        if(!result){
            //Could not write, key might have permission to read but not write
            return;
        }
        //Buffer to hold read data
        byte[] buffer = new byte[16];
        //Since we're still using the same block, we don't need to authenticate again
        result = rc522.readBlock(block, buffer);
        if(!result){
            //Could not read card
            return;
        }
        //Stop crypto to allow subsequent readings
        rc522.stopCrypto();
            
        
    }
}

Contributing

This library is still in development, suggestions, improvements and fixes are welcome. Please submit a pull request

Resources