Sample code for 30+ languages & platforms
Perl

PC/SC Get Card UID

See more SCard Examples

Sends the APDU command to get a card's UID.

Chilkat Perl Downloads

Perl
use chilkat();

$success = 0;

# This example requires the Chilkat API to have been previously unlocked.
# See Global Unlock Sample for sample code.

$scard = chilkat::CkSCard->new();

# First establish a context to the PC/SC Resource Manager
$success = $scard->EstablishContext("user");
if ($success == 0) {
    print $scard->lastErrorText() . "\r\n";
    exit;
}

# Use your own smart card reader name here.
$success = $scard->Connect("ACS ACR122 0","shared","no_preference");
if ($success == 0) {
    print $scard->lastErrorText() . "\r\n";
    exit;
}

print "Connected reader: " . $scard->connectedReader() . "\r\n";
print "Active protocol: " . $scard->activeProtocol() . "\r\n";
print "ATR: " . $scard->cardAtr() . "\r\n";
print "Reader Status: " . $scard->readerStatus() . "\r\n";

#  Send the APDU command 0xFF, 0xCA, 0x00, 0x00, 0x00
$bdRecv = chilkat::CkBinData->new();
$success = $scard->TransmitHex($scard->activeProtocol(),"FFCA000000",$bdRecv,32);
if ($success == 1) {

    print "Received: " . $bdRecv->getEncoded("hex") . "\r\n";

    # The UID is the returned data without the final 2 bytes.
    $numBytes = $bdRecv->get_NumBytes();
    if ($numBytes > 2) {
        print "UID: " . $bdRecv->getEncodedChunk(0,$numBytes - 2,"hex") . "\r\n";
    }

}
else {
    print $scard->lastErrorText() . "\r\n";
}

# Disconnect from this reader.
$success = $scard->Disconnect("leave");
if ($success == 0) {
    print $scard->lastErrorText() . "\r\n";
}

# Applications should always release the context when finished.
$success = $scard->ReleaseContext();
if ($success == 0) {
    print $scard->lastErrorText() . "\r\n";
}