nfc 1.0.0 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGELOG.rdoc +7 -0
- data/Manifest.txt +9 -1
- data/README.rdoc +30 -6
- data/Rakefile +13 -8
- data/bin/nfc +3 -1
- data/ext/nfc/extconf.rb +56 -0
- data/ext/nfc/nfc.c +11 -0
- data/ext/nfc/nfc.h +12 -0
- data/ext/nfc/nfc_device.c +111 -0
- data/ext/nfc/nfc_device.h +8 -0
- data/ext/nfc/nfc_iso14443a.c +100 -0
- data/ext/nfc/nfc_iso14443a.h +10 -0
- data/lib/nfc.rb +73 -27
- data/lib/nfc/device.rb +10 -0
- data/lib/nfc/iso14443a.rb +39 -0
- metadata +17 -18
- data/lib/nfc/lib_nfc.rb +0 -66
data/CHANGELOG.rdoc
CHANGED
data/Manifest.txt
CHANGED
@@ -4,6 +4,14 @@ Manifest.txt
|
|
4
4
|
README.rdoc
|
5
5
|
Rakefile
|
6
6
|
bin/nfc
|
7
|
+
ext/nfc/extconf.rb
|
8
|
+
ext/nfc/nfc.c
|
9
|
+
ext/nfc/nfc.h
|
10
|
+
ext/nfc/nfc_device.c
|
11
|
+
ext/nfc/nfc_device.h
|
12
|
+
ext/nfc/nfc_iso14443a.c
|
13
|
+
ext/nfc/nfc_iso14443a.h
|
7
14
|
lib/nfc.rb
|
8
|
-
lib/nfc/
|
15
|
+
lib/nfc/device.rb
|
16
|
+
lib/nfc/iso14443a.rb
|
9
17
|
test/test_nfc.rb
|
data/README.rdoc
CHANGED
@@ -10,26 +10,50 @@ lets you read RFID tags.
|
|
10
10
|
|
11
11
|
== FEATURES/PROBLEMS:
|
12
12
|
|
13
|
-
* Only supports ISO1443A
|
13
|
+
* Only supports ISO1443A (MIFARE) tags right now.
|
14
14
|
|
15
15
|
== SYNOPSIS:
|
16
16
|
|
17
17
|
require 'nfc'
|
18
18
|
|
19
|
-
# Read your tag and print the info
|
19
|
+
# Read your tag and print the info.
|
20
20
|
p NFC.instance.find
|
21
21
|
|
22
|
+
# NFC#find will return immidiately, which means you should have a tag
|
23
|
+
# sitting on the reader when running it. If you'd like it to block until
|
24
|
+
# it detects a tag, give find a block like so:
|
25
|
+
|
26
|
+
NFC.instance.find do |tag|
|
27
|
+
p tag
|
28
|
+
end
|
29
|
+
|
30
|
+
# You can even run in an infinite loop if you'd like to continually find
|
31
|
+
# tags:
|
32
|
+
|
33
|
+
loop do
|
34
|
+
NFC.instance.find do |tag|
|
35
|
+
p tag
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
22
39
|
== REQUIREMENTS:
|
23
40
|
|
24
41
|
* A USB RFID reader. I'm using the touchatag[http://touchatag.com].
|
25
|
-
* ffi
|
26
42
|
* libnfc
|
27
43
|
|
28
44
|
== INSTALL:
|
29
45
|
|
30
|
-
|
31
|
-
|
32
|
-
|
46
|
+
First install libnfc[http://libnfc.org/]
|
47
|
+
I installed libnfc like this:
|
48
|
+
|
49
|
+
$ ./configure --prefix=/usr/local
|
50
|
+
$ make && make install
|
51
|
+
|
52
|
+
The install the gem:
|
53
|
+
|
54
|
+
$ sudo gem install nfc
|
55
|
+
|
56
|
+
NOTE!!!! The nfc gem requires libnfc version 1.2.0 or greater!
|
33
57
|
|
34
58
|
== LICENSE:
|
35
59
|
|
data/Rakefile
CHANGED
@@ -2,15 +2,20 @@
|
|
2
2
|
|
3
3
|
require 'rubygems'
|
4
4
|
require 'hoe'
|
5
|
-
|
6
|
-
require
|
5
|
+
gem 'rake-compiler', '>= 0.4.1'
|
6
|
+
require "rake/extensiontask"
|
7
7
|
|
8
|
-
Hoe.
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
8
|
+
HOE = Hoe.spec('nfc') do
|
9
|
+
developer('Aaron Patterson', 'aaronp@rubyforge.org')
|
10
|
+
self.readme_file = 'README.rdoc'
|
11
|
+
self.history_file = 'CHANGELOG.rdoc'
|
12
|
+
self.extra_rdoc_files = FileList['*.rdoc']
|
13
|
+
self.spec_extras = { :extensions => ["ext/nfc/extconf.rb"] }
|
14
|
+
self.rubyforge_name = 'seattlerb'
|
15
|
+
end
|
16
|
+
|
17
|
+
RET = Rake::ExtensionTask.new("nfc", HOE.spec) do |ext|
|
18
|
+
ext.lib_dir = File.join('lib', 'nfc')
|
14
19
|
end
|
15
20
|
|
16
21
|
# vim: syntax=Ruby
|
data/bin/nfc
CHANGED
data/ext/nfc/extconf.rb
ADDED
@@ -0,0 +1,56 @@
|
|
1
|
+
ENV['RC_ARCHS'] = '' if RUBY_PLATFORM =~ /darwin/
|
2
|
+
|
3
|
+
# :stopdoc:
|
4
|
+
|
5
|
+
require 'mkmf'
|
6
|
+
|
7
|
+
LIBDIR = Config::CONFIG['libdir']
|
8
|
+
INCLUDEDIR = Config::CONFIG['includedir']
|
9
|
+
|
10
|
+
$CFLAGS << " -O3 -Wall -Wcast-qual -Wwrite-strings -Wconversion -Wmissing-noreturn -Winline"
|
11
|
+
|
12
|
+
HEADER_DIRS = [
|
13
|
+
# First search /opt/local for macports
|
14
|
+
'/opt/local/include',
|
15
|
+
|
16
|
+
# Then search /usr/local for people that installed from source
|
17
|
+
'/usr/local/include',
|
18
|
+
|
19
|
+
# Check the ruby install locations
|
20
|
+
INCLUDEDIR,
|
21
|
+
|
22
|
+
# Finally fall back to /usr
|
23
|
+
'/usr/include',
|
24
|
+
]
|
25
|
+
|
26
|
+
LIB_DIRS = [
|
27
|
+
# First search /opt/local for macports
|
28
|
+
'/opt/local/lib',
|
29
|
+
|
30
|
+
# Then search /usr/local for people that installed from source
|
31
|
+
'/usr/local/lib',
|
32
|
+
|
33
|
+
# Check the ruby install locations
|
34
|
+
LIBDIR,
|
35
|
+
|
36
|
+
# Finally fall back to /usr
|
37
|
+
'/usr/lib',
|
38
|
+
]
|
39
|
+
|
40
|
+
nfc_dirs = dir_config('nfc', '/opt/local/include', '/opt/local/lib')
|
41
|
+
unless ["", ""] == nfc_dirs
|
42
|
+
HEADER_DIRS.unshift nfc_dirs.first
|
43
|
+
LIB_DIRS.unshift nfc_dirs[1]
|
44
|
+
end
|
45
|
+
|
46
|
+
unless find_header('libnfc/libnfc.h', *HEADER_DIRS)
|
47
|
+
abort "libnfc is missing. please install libnfc: http://libnfc.org/"
|
48
|
+
end
|
49
|
+
|
50
|
+
unless find_library('nfc', 'nfc_connect', *LIB_DIRS)
|
51
|
+
abort "libnfc is missing. please install libnfc: http://libnfc.org/"
|
52
|
+
end
|
53
|
+
|
54
|
+
create_makefile('nfc/nfc')
|
55
|
+
|
56
|
+
# :startdoc:
|
data/ext/nfc/nfc.c
ADDED
data/ext/nfc/nfc.h
ADDED
@@ -0,0 +1,111 @@
|
|
1
|
+
#include <nfc_device.h>
|
2
|
+
|
3
|
+
/*
|
4
|
+
* call-seq:
|
5
|
+
* connect
|
6
|
+
*
|
7
|
+
* Connect to the NFC device
|
8
|
+
*/
|
9
|
+
static VALUE connect(VALUE klass)
|
10
|
+
{
|
11
|
+
dev_info * dev = nfc_connect();
|
12
|
+
if(!nfc_initiator_init(dev))
|
13
|
+
rb_raise(rb_eRuntimeError, "oh snap, could not init");
|
14
|
+
|
15
|
+
return Data_Wrap_Struct(klass, 0, 0, dev);
|
16
|
+
}
|
17
|
+
|
18
|
+
/*
|
19
|
+
* call-seq:
|
20
|
+
* disconnect
|
21
|
+
*
|
22
|
+
* Disconnect from the NFC device
|
23
|
+
*/
|
24
|
+
static VALUE disconnect(VALUE self)
|
25
|
+
{
|
26
|
+
dev_info * dev;
|
27
|
+
Data_Get_Struct(self, dev_info, dev);
|
28
|
+
nfc_disconnect(dev);
|
29
|
+
|
30
|
+
return self;
|
31
|
+
}
|
32
|
+
|
33
|
+
/*
|
34
|
+
* call-seq:
|
35
|
+
* configure(option, value)
|
36
|
+
*
|
37
|
+
* Configure the Device with +option+ and +value+
|
38
|
+
*/
|
39
|
+
static VALUE configure(VALUE self, VALUE option, VALUE flag)
|
40
|
+
{
|
41
|
+
dev_info * dev;
|
42
|
+
Data_Get_Struct(self, dev_info, dev);
|
43
|
+
|
44
|
+
nfc_configure(
|
45
|
+
dev,
|
46
|
+
(const dev_config_option)NUM2INT(option),
|
47
|
+
(const bool)NUM2INT(flag)
|
48
|
+
);
|
49
|
+
|
50
|
+
return self;
|
51
|
+
}
|
52
|
+
|
53
|
+
/*
|
54
|
+
* call-seq:
|
55
|
+
* select(tag)
|
56
|
+
*
|
57
|
+
* Select the +tag+ type from the device
|
58
|
+
*/
|
59
|
+
static VALUE dev_select(VALUE self, VALUE tag)
|
60
|
+
{
|
61
|
+
dev_info * dev;
|
62
|
+
Data_Get_Struct(self, dev_info, dev);
|
63
|
+
|
64
|
+
tag_info * ti = calloc(1, sizeof(tag_info));
|
65
|
+
|
66
|
+
nfc_initiator_select_tag(dev, IM_ISO14443A_106, NULL, 0, ti);
|
67
|
+
|
68
|
+
return Data_Wrap_Struct(cNfcISO14443A, 0, free, ti);
|
69
|
+
}
|
70
|
+
|
71
|
+
/*
|
72
|
+
* call-seq:
|
73
|
+
* name
|
74
|
+
*
|
75
|
+
* Get the name of the tag reader
|
76
|
+
*/
|
77
|
+
static VALUE name(VALUE self)
|
78
|
+
{
|
79
|
+
dev_info * dev;
|
80
|
+
Data_Get_Struct(self, dev_info, dev);
|
81
|
+
|
82
|
+
return rb_str_new2(dev->acName);
|
83
|
+
}
|
84
|
+
|
85
|
+
/*
|
86
|
+
* call-seq:
|
87
|
+
* deselect
|
88
|
+
*
|
89
|
+
* Deselect the current tag
|
90
|
+
*/
|
91
|
+
static VALUE dev_deselect(VALUE self)
|
92
|
+
{
|
93
|
+
dev_info * dev;
|
94
|
+
Data_Get_Struct(self, dev_info, dev);
|
95
|
+
|
96
|
+
nfc_initiator_deselect_tag(dev);
|
97
|
+
|
98
|
+
return self;
|
99
|
+
}
|
100
|
+
|
101
|
+
void init_device()
|
102
|
+
{
|
103
|
+
VALUE cNfcDevice = rb_define_class_under(cNfc, "Device", rb_cObject);
|
104
|
+
|
105
|
+
rb_define_singleton_method(cNfcDevice, "connect", connect, 0);
|
106
|
+
rb_define_method(cNfcDevice, "disconnect", disconnect, 0);
|
107
|
+
rb_define_method(cNfcDevice, "configure", configure, 2);
|
108
|
+
rb_define_method(cNfcDevice, "select", dev_select, 1);
|
109
|
+
rb_define_method(cNfcDevice, "deselect", dev_deselect, 0);
|
110
|
+
rb_define_method(cNfcDevice, "name", name, 0);
|
111
|
+
}
|
@@ -0,0 +1,100 @@
|
|
1
|
+
#include <nfc_iso14443a.h>
|
2
|
+
|
3
|
+
VALUE cNfcISO14443A;
|
4
|
+
|
5
|
+
/*
|
6
|
+
* call-seq:
|
7
|
+
* uiUidLen
|
8
|
+
*
|
9
|
+
* Get the uiUidLen
|
10
|
+
*/
|
11
|
+
static VALUE uiUidLen(VALUE self)
|
12
|
+
{
|
13
|
+
tag_info_iso14443a * tag;
|
14
|
+
Data_Get_Struct(self, tag_info_iso14443a, tag);
|
15
|
+
|
16
|
+
return INT2NUM(tag->uiUidLen);
|
17
|
+
}
|
18
|
+
|
19
|
+
/*
|
20
|
+
* call-seq:
|
21
|
+
* uiAtsLen
|
22
|
+
*
|
23
|
+
* Get the uiAtsLen
|
24
|
+
*/
|
25
|
+
static VALUE uiAtsLen(VALUE self)
|
26
|
+
{
|
27
|
+
tag_info_iso14443a * tag;
|
28
|
+
Data_Get_Struct(self, tag_info_iso14443a, tag);
|
29
|
+
|
30
|
+
return INT2NUM(tag->uiAtsLen);
|
31
|
+
}
|
32
|
+
|
33
|
+
/*
|
34
|
+
* call-seq:
|
35
|
+
* abtUid
|
36
|
+
*
|
37
|
+
* Get the abtUid
|
38
|
+
*/
|
39
|
+
static VALUE abtUid(VALUE self)
|
40
|
+
{
|
41
|
+
tag_info_iso14443a * tag;
|
42
|
+
Data_Get_Struct(self, tag_info_iso14443a, tag);
|
43
|
+
|
44
|
+
return rb_str_new(tag->abtUid, tag->uiUidLen);
|
45
|
+
}
|
46
|
+
|
47
|
+
/*
|
48
|
+
* call-seq:
|
49
|
+
* abtAts
|
50
|
+
*
|
51
|
+
* Get the abtAts
|
52
|
+
*/
|
53
|
+
static VALUE abtAts(VALUE self)
|
54
|
+
{
|
55
|
+
tag_info_iso14443a * tag;
|
56
|
+
Data_Get_Struct(self, tag_info_iso14443a, tag);
|
57
|
+
|
58
|
+
return rb_str_new(tag->abtAts, tag->uiAtsLen);
|
59
|
+
}
|
60
|
+
|
61
|
+
/*
|
62
|
+
* call-seq:
|
63
|
+
* abtAtqa
|
64
|
+
*
|
65
|
+
* Get the abtAtqa
|
66
|
+
*/
|
67
|
+
static VALUE abtAtqa(VALUE self)
|
68
|
+
{
|
69
|
+
tag_info_iso14443a * tag;
|
70
|
+
Data_Get_Struct(self, tag_info_iso14443a, tag);
|
71
|
+
|
72
|
+
return rb_str_new(tag->abtAtqa, 2);
|
73
|
+
}
|
74
|
+
|
75
|
+
/*
|
76
|
+
* call-seq:
|
77
|
+
* btSak
|
78
|
+
*
|
79
|
+
* Get the btSak
|
80
|
+
*/
|
81
|
+
static VALUE btSak(VALUE self)
|
82
|
+
{
|
83
|
+
tag_info_iso14443a * tag;
|
84
|
+
Data_Get_Struct(self, tag_info_iso14443a, tag);
|
85
|
+
|
86
|
+
return INT2NUM(tag->btSak);
|
87
|
+
}
|
88
|
+
|
89
|
+
void init_iso14443a()
|
90
|
+
{
|
91
|
+
cNfcISO14443A = rb_define_class_under(cNfc, "ISO14443A", rb_cObject);
|
92
|
+
|
93
|
+
rb_define_method(cNfcISO14443A, "uiUidLen", uiUidLen, 0);
|
94
|
+
rb_define_method(cNfcISO14443A, "uiAtsLen", uiAtsLen, 0);
|
95
|
+
rb_define_method(cNfcISO14443A, "btSak", btSak, 0);
|
96
|
+
|
97
|
+
rb_define_private_method(cNfcISO14443A, "abtUid", abtUid, 0);
|
98
|
+
rb_define_private_method(cNfcISO14443A, "abtAts", abtAts, 0);
|
99
|
+
rb_define_private_method(cNfcISO14443A, "abtAtqa", abtAtqa, 0);
|
100
|
+
}
|
data/lib/nfc.rb
CHANGED
@@ -1,60 +1,106 @@
|
|
1
1
|
require 'singleton'
|
2
|
-
require '
|
2
|
+
require 'thread'
|
3
|
+
require 'nfc/nfc'
|
4
|
+
require 'nfc/device'
|
5
|
+
require 'nfc/iso14443a'
|
3
6
|
|
7
|
+
###
|
8
|
+
# NFC is a class for dealing with Near Field Communication systems. This
|
9
|
+
# library will read RFID tags from an RFID reader. You should start by reading
|
10
|
+
# NFC#find
|
4
11
|
class NFC
|
5
|
-
VERSION = '
|
6
|
-
|
7
|
-
attr_reader :device
|
12
|
+
VERSION = '2.0.0'
|
8
13
|
|
9
14
|
include Singleton
|
10
15
|
|
16
|
+
###
|
17
|
+
# Create a new NFC class. This is private, do this instead:
|
18
|
+
# NFC.instance
|
11
19
|
def initialize
|
12
|
-
@device =
|
13
|
-
|
20
|
+
@device = nil
|
21
|
+
@mutex = Mutex.new
|
14
22
|
end
|
15
23
|
|
24
|
+
###
|
25
|
+
# Deactivate the detection field
|
16
26
|
def deactivate_field
|
17
|
-
|
27
|
+
device.configure Device::DCO_ACTIVATE_FIELD, 0
|
18
28
|
end
|
19
29
|
|
30
|
+
###
|
31
|
+
# Activate the detection field
|
20
32
|
def activate_field
|
21
|
-
|
33
|
+
device.configure Device::DCO_ACTIVATE_FIELD, 1
|
22
34
|
end
|
23
35
|
|
36
|
+
###
|
37
|
+
# Do CRC checks
|
24
38
|
def crc= value
|
25
|
-
|
39
|
+
device.configure Device::DCO_HANDLE_CRC, value ? 1 : 0
|
26
40
|
end
|
27
41
|
|
42
|
+
###
|
43
|
+
# Parity checks
|
28
44
|
def parity= v
|
29
|
-
|
45
|
+
device.configure Device::DCO_HANDLE_PARITY, v ? 1 : 0
|
46
|
+
end
|
47
|
+
|
48
|
+
###
|
49
|
+
# Get the device
|
50
|
+
def device
|
51
|
+
@device ||= NFC::Device.connect
|
30
52
|
end
|
31
53
|
|
54
|
+
###
|
55
|
+
# Block until a passive tag is detected
|
32
56
|
def infinite_list_passive= v
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
57
|
+
device.configure Device::DCO_INFINITE_LIST_PASSIVE, v ? 1 : 0
|
58
|
+
end
|
59
|
+
|
60
|
+
###
|
61
|
+
# Select a tag
|
62
|
+
def select
|
63
|
+
device.select Device::IM_ISO14443A_106
|
38
64
|
end
|
65
|
+
alias :detect :select
|
39
66
|
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
LibNFC::IM_ISO14443A_106,
|
45
|
-
nil,
|
46
|
-
0,
|
47
|
-
thing
|
48
|
-
)
|
49
|
-
thing
|
67
|
+
###
|
68
|
+
# Deselect a tag
|
69
|
+
def deselect
|
70
|
+
device.deselect
|
50
71
|
end
|
51
72
|
|
73
|
+
# Read your tag and print the info.
|
74
|
+
#
|
75
|
+
# p NFC.instance.find
|
76
|
+
#
|
77
|
+
# NFC#find will return immidiately, which means you should have a tag
|
78
|
+
# sitting on the reader when running it. If you'd like it to block until
|
79
|
+
# it detects a tag, give find a block like so:
|
80
|
+
#
|
81
|
+
# NFC.instance.find do |tag|
|
82
|
+
# p tag
|
83
|
+
# end
|
84
|
+
#
|
85
|
+
# You can even run in an infinite loop if you'd like to continually find
|
86
|
+
# tags:
|
87
|
+
#
|
88
|
+
# loop do
|
89
|
+
# NFC.instance.find do |tag|
|
90
|
+
# p tag
|
91
|
+
# end
|
92
|
+
# end
|
52
93
|
def find
|
94
|
+
@mutex.lock
|
53
95
|
deactivate_field
|
54
|
-
self.infinite_list_passive =
|
96
|
+
self.infinite_list_passive = block_given?
|
55
97
|
self.crc = true
|
56
98
|
self.parity = true
|
57
99
|
activate_field
|
58
|
-
|
100
|
+
tag = detect
|
101
|
+
deselect
|
102
|
+
@mutex.unlock
|
103
|
+
yield tag if block_given?
|
104
|
+
tag
|
59
105
|
end
|
60
106
|
end
|
data/lib/nfc/device.rb
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
class NFC
|
2
|
+
class ISO14443A
|
3
|
+
###
|
4
|
+
# Get the unique ID for this tag
|
5
|
+
def uid
|
6
|
+
abtUid.unpack 'C*'
|
7
|
+
end
|
8
|
+
|
9
|
+
###
|
10
|
+
# Get the ATS for this tag
|
11
|
+
def ats
|
12
|
+
abtAts.unpack 'C*'
|
13
|
+
end
|
14
|
+
|
15
|
+
###
|
16
|
+
# Get the atqa
|
17
|
+
def atqa
|
18
|
+
abtAtqa.unpack 'C*'
|
19
|
+
end
|
20
|
+
|
21
|
+
###
|
22
|
+
# Inspect this tag
|
23
|
+
def inspect
|
24
|
+
uid = sprintf((['%02x'] * uiUidLen).join(' '), *self.uid)
|
25
|
+
|
26
|
+
string_ary =
|
27
|
+
[ "(NFC) ISO14443A Tag",
|
28
|
+
" ATQA (SENS_RES): #{sprintf("%02x %02x", *atqa)}",
|
29
|
+
" UID (NFCID1): #{uid}",
|
30
|
+
" SAK (SEL_RES): #{sprintf("%02x", btSak)}"
|
31
|
+
]
|
32
|
+
if uiAtsLen > 0
|
33
|
+
ats = sprintf((['%02x'] * uiAtsLen).join(' '), *self.ats)
|
34
|
+
string_ary << " ATS (ATR): #{ats}"
|
35
|
+
end
|
36
|
+
string_ary.join "\n"
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: nfc
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Aaron Patterson
|
@@ -9,19 +9,9 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-
|
12
|
+
date: 2009-08-07 00:00:00 -07:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
|
-
- !ruby/object:Gem::Dependency
|
16
|
-
name: ffi
|
17
|
-
type: :runtime
|
18
|
-
version_requirement:
|
19
|
-
version_requirements: !ruby/object:Gem::Requirement
|
20
|
-
requirements:
|
21
|
-
- - ">="
|
22
|
-
- !ruby/object:Gem::Version
|
23
|
-
version: "0"
|
24
|
-
version:
|
25
15
|
- !ruby/object:Gem::Dependency
|
26
16
|
name: hoe
|
27
17
|
type: :development
|
@@ -30,7 +20,7 @@ dependencies:
|
|
30
20
|
requirements:
|
31
21
|
- - ">="
|
32
22
|
- !ruby/object:Gem::Version
|
33
|
-
version:
|
23
|
+
version: 2.3.2
|
34
24
|
version:
|
35
25
|
description: |-
|
36
26
|
NFC is a ruby wrapper for the Near Field Communication library. The Near
|
@@ -40,8 +30,8 @@ email:
|
|
40
30
|
- aaronp@rubyforge.org
|
41
31
|
executables:
|
42
32
|
- nfc
|
43
|
-
extensions:
|
44
|
-
|
33
|
+
extensions:
|
34
|
+
- ext/nfc/extconf.rb
|
45
35
|
extra_rdoc_files:
|
46
36
|
- Manifest.txt
|
47
37
|
- CHANGELOG.rdoc
|
@@ -53,8 +43,16 @@ files:
|
|
53
43
|
- README.rdoc
|
54
44
|
- Rakefile
|
55
45
|
- bin/nfc
|
46
|
+
- ext/nfc/extconf.rb
|
47
|
+
- ext/nfc/nfc.c
|
48
|
+
- ext/nfc/nfc.h
|
49
|
+
- ext/nfc/nfc_device.c
|
50
|
+
- ext/nfc/nfc_device.h
|
51
|
+
- ext/nfc/nfc_iso14443a.c
|
52
|
+
- ext/nfc/nfc_iso14443a.h
|
56
53
|
- lib/nfc.rb
|
57
|
-
- lib/nfc/
|
54
|
+
- lib/nfc/device.rb
|
55
|
+
- lib/nfc/iso14443a.rb
|
58
56
|
- test/test_nfc.rb
|
59
57
|
has_rdoc: true
|
60
58
|
homepage: http://seattlerb.rubyforge.org
|
@@ -66,6 +64,7 @@ rdoc_options:
|
|
66
64
|
- README.rdoc
|
67
65
|
require_paths:
|
68
66
|
- lib
|
67
|
+
- ext
|
69
68
|
required_ruby_version: !ruby/object:Gem::Requirement
|
70
69
|
requirements:
|
71
70
|
- - ">="
|
@@ -80,8 +79,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
80
79
|
version:
|
81
80
|
requirements: []
|
82
81
|
|
83
|
-
rubyforge_project:
|
84
|
-
rubygems_version: 1.3.
|
82
|
+
rubyforge_project: seattlerb
|
83
|
+
rubygems_version: 1.3.4
|
85
84
|
signing_key:
|
86
85
|
specification_version: 3
|
87
86
|
summary: NFC is a ruby wrapper for the Near Field Communication library
|
data/lib/nfc/lib_nfc.rb
DELETED
@@ -1,66 +0,0 @@
|
|
1
|
-
require 'ffi'
|
2
|
-
|
3
|
-
class NFC
|
4
|
-
class LibNFC
|
5
|
-
extend FFI::Library
|
6
|
-
ffi_lib 'nfc'
|
7
|
-
|
8
|
-
attach_function :nfc_connect, [], :pointer
|
9
|
-
attach_function :nfc_disconnect, [:pointer], :void
|
10
|
-
attach_function :nfc_reader_init, [:pointer], :int
|
11
|
-
attach_function :nfc_configure, [:pointer, :int, :int], :int
|
12
|
-
attach_function :nfc_reader_list_passive, [:pointer, :int, :pointer, :int, :pointer], :int
|
13
|
-
|
14
|
-
DCO_HANDLE_CRC = 0x00
|
15
|
-
DCO_HANDLE_PARITY = 0x01
|
16
|
-
DCO_ACTIVATE_FIELD = 0x10
|
17
|
-
DCO_INFINITE_LIST_PASSIVE = 0x20
|
18
|
-
|
19
|
-
IM_ISO14443A_106 = 0x00
|
20
|
-
|
21
|
-
class Device < FFI::Struct
|
22
|
-
layout(:name, [:char, 256])
|
23
|
-
|
24
|
-
def name
|
25
|
-
pointer.read_string
|
26
|
-
end
|
27
|
-
|
28
|
-
def self.release ptr
|
29
|
-
LibNFC.nfc_disconnect ptr
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
class ISO1443A < FFI::Struct
|
34
|
-
layout(
|
35
|
-
:abtAtqa, [:uchar, 2],
|
36
|
-
:btSak, :uchar,
|
37
|
-
:uiUidLen, :int,
|
38
|
-
:abtUid, [:uchar, 10],
|
39
|
-
:uiAtsLen, :int,
|
40
|
-
:abtAts, [:uchar, 36]
|
41
|
-
)
|
42
|
-
|
43
|
-
def uid
|
44
|
-
self[:abtUid].to_a.slice(0, self[:uiUidLen])
|
45
|
-
end
|
46
|
-
|
47
|
-
def inspect
|
48
|
-
uid = sprintf((['%02x'] * self[:uiUidLen]).join(' '), *self.uid)
|
49
|
-
|
50
|
-
string_ary =
|
51
|
-
[ "(NFC) ISO14443A Tag",
|
52
|
-
" ATQA (SENS_RES): #{sprintf("%02x %02x", *(self[:abtAtqa]))}",
|
53
|
-
" UID (NFCID1): #{uid}",
|
54
|
-
" SAK (SEL_RES): #{sprintf("%02x", self[:btSak])}"
|
55
|
-
]
|
56
|
-
if self[:uiAtsLen] > 0
|
57
|
-
ats =
|
58
|
-
sprintf((['%02x'] * self[:uiAtsLen]).join(' '), *(self[:abtAts]))
|
59
|
-
string_ary <<
|
60
|
-
" ATS (ATR): #{ats}"
|
61
|
-
end
|
62
|
-
string_ary.join "\n"
|
63
|
-
end
|
64
|
-
end
|
65
|
-
end
|
66
|
-
end
|