RFID-Libnfc
view release on metacpan or search on metacpan
examples/anticol_c.pl view on Meta::CPAN
nfc_configure($pdi, NDO_HANDLE_CRC, 0);
nfc_configure($pdi, NDO_HANDLE_PARITY, 1);
nfc_configure($pdi, NDO_EASY_FRAMING, 0);
nfc_configure($pdi, NDO_AUTO_ISO14443_4, 0);
nfc_configure($pdi, NDO_FORCE_ISO14443_A, 1);
# Enable field so more power consuming cards can power themselves up
nfc_configure($pdi, NDO_ACTIVATE_FIELD, 1);
my $cmd = pack("C", MU_REQA);
if (my $resp = transceive_bits($pdi, $cmd, 7)) {
$cmd = pack("C2", MU_SELECT1, 0x20); # ANTICOLLISION of cascade level 1
if ($resp = transceive_bytes($pdi, $cmd, 2)) {
my (@rb) = unpack("C".length($resp), $resp);
my $cuid = pack("C3", $rb[1], $rb[2], $rb[3]);
if ($rb[0] == 0x88) { # define a constant for 0x88
$cmd = pack("C9", MU_SELECT1, 0x70, @rb); # SELECT of cascade level 1
iso14443a_crc_append($cmd, 7);
if ($resp = transceive_bytes($pdi, $cmd, 9)) {
# we need to do cascade level 2
# first let's get the missing part of the uid
$cmd = pack("C2", MU_SELECT2, 0x20); # ANTICOLLISION of cascade level 2
if ($resp = transceive_bytes($pdi, $cmd, 2)) {
@rb = unpack("C".length($resp), $resp);
$cuid .= pack("C3", $rb[1], $rb[2], $rb[3]);
$cmd = pack("C9", MU_SELECT2, 0x70, @rb); # SELECT of cascade level 2
iso14443a_crc_append($cmd, 7);
if (transceive_bytes($pdi, $cmd, 9)) {
print "2 level cascade anticollision/selection passed for uid : ";
print_hex($cuid, 6);
} else {
warn "Select cascade level 2 failed";
}
} else {
warn "Anticollision cascade level 2 failed";
}
} else {
warn "Select cascade level 1 failed";
}
}
} else {
warn "Anticollision cascade level 1 failed";
}
} else {
warn "Device doesn't respond to REQA";
}
exit 0;
examples/tikiread.pl view on Meta::CPAN
my $tag = $r->connect(IM_ISO14443A_106);
if ($tag and $DEBUG) {
$tag->dump_info;
} else {
warn "No TAG";
exit -1;
}
die "Token is not a mifare ultralight" unless $tag->type eq "ULTRA";
# doing the 2-level cascade selection process is not necessary ,
# but ensures we will be talking always to the same token
# if multiple are within the field
$tag->select;
if ($DEBUG) {
print "ACL - 1 means blocked, 0 means writeable. blbits rule them all\n";
print Data::Dumper->Dump([$tag->acl], ["ACL"]);
}
# Dump the entire token
lib/RFID/Libnfc/Tag/ISO14443A_106/ULTRA.pm view on Meta::CPAN
nfc_configure($self->reader->pdi, NDO_EASY_FRAMING, 0);
nfc_configure($self->reader->pdi, NDO_AUTO_ISO14443_4, 0);
nfc_configure($self->reader->pdi, NDO_FORCE_ISO14443_A, 1);
# Enable field so more power consuming cards can power themselves up
nfc_configure($self->reader->pdi, ,NDO_ACTIVATE_FIELD, 1);
my $retry = 0;
my $retrycnt = 0;
do {
if (my $resp = nfc_initiator_transceive_bits($self->reader->pdi, pack("C", MU_REQA), 7)) {
my $cmd = pack("C2", MU_SELECT1, 0x20); # ANTICOLLISION of cascade level 1
if ($resp = nfc_initiator_transceive_bytes($self->reader->pdi, $cmd, 2)) {
my (@rb) = split(//, $resp);
my $cuid = pack("C3", $rb[1], $rb[2], $rb[3]);
if ($rb[0] == 0x88) { # define a constant for 0x88
$cmd = pack("C9", MU_SELECT1, 0x70, @rb); # SELECT of cascade level 1
#my $crc = $self->crc($cmd);
iso14443a_crc_append($cmd, 7);
if ($resp = nfc_initiator_transceive_bytes($self->reader->pdi, $cmd, 9)) {
# we need to do cascade level 2
# first let's get the missing part of the uid
$cmd = pack("C2", MU_SELECT2, 0x20); # ANTICOLLISION of cascade level 2
if ($resp = nfc_initiator_transceive_bytes($self->reader->pdi, $cmd, 2)) {
@rb = split(//, $resp);
$cuid .= pack("C3", $rb[1], $rb[2], $rb[3]);
$cmd = pack("C9", MU_SELECT2, 0x70, @rb); # SELECT of cascade level 2
#my $crc = $self->crc($cmd);
iso14443a_crc_append($cmd, 7);
if ($resp = nfc_initiator_transceive_bytes($self->reader->pdi, $cmd, 9)) {
if ($uid == $cuid) {
return 1;
} else {
# HALT the unwanted tag
$cmd = pack("C2", MU_HALT, 0x00);
nfc_initiator_transceive_bytes($self->reader->pdi, $cmd, 2);
$retry = 1;
$retrycnt++;
}
} else {
$self->{_last_error} = "Select cascade level 2 failed";
}
} else {
$self->{_last_error} = "Anticollision cascade level 2 failed";
}
} else {
$self->{_last_error} = "Select cascade level 1 failed";
}
}
} else {
$self->{_last_error} = "Anticollision cascade level 1 failed";
}
} else {
$self->{_last_error} = "Device doesn't respond to REQA";
}
} while ($retry-- and $retrycnt < 10); # fail if we are redoing the selection process for the tenth time
$self->{_last_error} = "Max retrycount reached" if ($retrycnt >= 10);
return 0;
}
1;
lib/RFID/Libnfc/Tag/ISO14443A_106/ULTRA.pm view on Meta::CPAN
RFID::Libnfc::Tag::ISO14443A_106::ULTRA
Specific implementation for mifare ultralight tags
=head1 SYNOPSIS
use RFID::Libnfc;
$tag = $r->connectTag(IM_ISO14443A_106);
# so the 2-level cascade selection process as specified in M028634_MF0ICU1_Functional_Spec_V3.4.pdf
$tag->select()
=head1 DESCRIPTION
Base class for ISO14443A_106 compliant tags
=head2 EXPORT
None by default.
lib/RFID/Libnfc/Tag/ISO14443A_106/ULTRA.pm view on Meta::CPAN
Returns the number of sectors present on the card
=item acl ( )
Returns a representation of the aclbits.
(boths page-locking bits and block-locking bits)
=item select ( )
implements the 2-level cascade selection process
=back
=head1 SEE ALSO
RFID::Libnfc::Tag::ISO14443A_106::ULTRA RFID::Libnfc::Tag::ISO14443A_106::4K
RFID::Libnfc::Tag::ISO14443A_106 RFID::Libnfc::Constants RFID::Libnfc
**
( run in 1.195 second using v1.01-cache-2.11-cpan-49f99fa48dc )