ruby-nfc 1.3 → 1.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- ZDg5NmM4MjM1Zjg5NGQxMzI4OGZjYTUwYjVhNGYzMDQ4NzQ0NjU0Nw==
4
+ MGMyYWNlNjRjNWRlOTQ4YzQxMzg3MjUxZTMyNjljNjdiZWQxMDMxNQ==
5
5
  data.tar.gz: !binary |-
6
- MGNkNTBkMmE5YThiY2M0YWI3NDZiODRkOTQ5YjU2Y2MxYjcxZjA3NQ==
6
+ NmFlNmYxNzNhNDQyZmY3NmI2N2NjMjRlZjA4NGViMjdhYmQ3ODA2OQ==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- OGQwOGQzYmJjOTAxYmVkYjcwYzk4NTBhNzZkMWZjYzE0YTUyMjAxYmM0MzBk
10
- NjZmMDkwYzkyZWQ2NzUzNjQyZTQyM2M0ZWJlYmIxODUxYjM0Y2ZiNjMwZWYw
11
- MWQwMmI0NzAyM2FiMDdhODVlMzk4YjE0ZTYzM2M3ZTczMTRjOTI=
9
+ ODRiMTJmZmEyYjQ1ZDg0NmMzNmI0YmQ0ZGZlMDMwOTM1NGI2ZDg3OWRmMDZm
10
+ OWUzYjYwZmFiNzk4ZTRiMmIwNTUyMzcwNWRiZWQyM2IzMTNmMzZhYjdkMTc5
11
+ ZjI0NDhiZTdkMmNjMWIwNjFkYzFiYjNjZDA5MjQ5MTU2ZjYzMTc=
12
12
  data.tar.gz: !binary |-
13
- MThlODVkNjcyYjAxYzg2YTU1MGYwYTdlOTMyZmY3ZWEzYzhhODJlODM0NzQy
14
- YjRlZTc0Mjg2ZmYyY2RlZWNkMzk5NWUyNWEyYzE4OTc4YjUxZDFkYjBhOGMz
15
- ZDQ2MDc2MTA2YjBmZjdiODdlOWFmYmUxMTc1YzZlN2M2NWRiZjc=
13
+ ZGQxZDYxMTBiY2I1MGQxMjlkYmIzYmZiZGVlMDQ4YjJkMGQ3NzM4MzE4ZDlh
14
+ ZjdkMGM2MDgyMGMwY2VhODM5ZDU3NjIyYTExMTM1ZTRiZmYxZDFlNWY2YjBm
15
+ NTkwZGEzZjhkMTViN2VmYjM3NDJiN2M4NDM3YjY5MDI0NzJhODI=
data/lib/ruby-nfc/nfc.rb CHANGED
@@ -19,6 +19,7 @@ module NFC
19
19
  LibNFC.nfc_init(ptr)
20
20
  @@context = ptr.read_pointer
21
21
  end
22
+ @@context
22
23
  end
23
24
 
24
25
  def self.logger
@@ -7,66 +7,58 @@ module NFC
7
7
  @ptr = nil
8
8
  end
9
9
 
10
- def connect
11
- unless @ptr
12
- @ptr = LibNFC.nfc_open(NFC.context, @name)
13
- raise NFC::Error.new("Cant connect to #{@name}") if @ptr.null?
14
-
15
- LibNFC.nfc_initiator_init(@ptr)
16
-
17
- set_flag(:NP_ACTIVATE_FIELD, false)
18
- set_flag(:NP_HANDLE_CRC, true)
19
- set_flag(:NP_HANDLE_PARITY, true)
20
- set_flag(:NP_AUTO_ISO14443_4, true)
21
- set_flag(:NP_ACTIVATE_FIELD, true)
22
-
23
- @modulation = LibNFC::Modulation.new
24
- @modulation[:nmt] = :NMT_ISO14443A
25
- @modulation[:nbr] = :NBR_106
26
- end
10
+ def set_flag(name, value)
11
+ LibNFC.nfc_device_set_property_bool(@ptr, name, value)
12
+ end
27
13
 
14
+ def connect
15
+ @ptr ||= LibNFC.nfc_open(NFC.context, @name)
16
+ raise NFC::Error.new('Cant connect to ' << @name) if @ptr.null?
28
17
  self
29
18
  end
30
19
 
31
20
  # Returns list of tags applied to reader
32
- def discover(*tag_types)
33
- connect
34
-
35
- targets = FFI::MemoryPointer.new(:uchar, LibNFC::Target.size * 10)
36
- res = LibNFC.nfc_initiator_list_passive_targets(@ptr, @modulation,
37
- targets, 10)
38
- 0.upto(res - 1).inject([]) do |tags, i|
39
- target = LibNFC::Target.new(targets + i * LibNFC::Target.size)
40
-
41
- tag_types.select{|type| type.match?(target)}.inject(tags) do |r, type|
42
- r << type.new(target, self)
43
- end
21
+ def discover(*card_types)
22
+ # TODO: по правильному здесь надо делать низкоуровневый
23
+ card_types.inject([]) do |tags, card_type|
24
+ raise NFC::Error.new('Wrong card type') unless card_type.respond_to? :discover
25
+ tags += card_type.discover(connect)
44
26
  end
45
27
  end
46
28
 
47
- def poll(*tag_types, &block)
29
+ def poll(*card_types, &block)
48
30
  connect
49
31
 
32
+ LibNFC.nfc_initiator_init(@ptr) # we'll be initiator not a target
33
+
34
+ set_flag(:NP_ACTIVATE_FIELD, false)
35
+ set_flag(:NP_HANDLE_CRC, true)
36
+ set_flag(:NP_HANDLE_PARITY, true)
37
+ set_flag(:NP_AUTO_ISO14443_4, true)
38
+ set_flag(:NP_ACTIVATE_FIELD, true)
39
+
40
+ modulation = LibNFC::Modulation.new
41
+ modulation[:nmt] = :NMT_ISO14443A
42
+ modulation[:nbr] = :NBR_106
43
+
50
44
  targets = FFI::MemoryPointer.new(:uchar, LibNFC::Target.size * 10)
51
45
 
52
46
  loop do
53
- res = LibNFC.nfc_initiator_list_passive_targets(@ptr, @modulation,
47
+ res = LibNFC.nfc_initiator_list_passive_targets(@ptr, modulation,
54
48
  targets, 10)
55
49
 
56
- # iterate over all applied targets
50
+ # iterate over all applied targets and iterate
57
51
  0.upto(res - 1) do |i|
58
52
  target = LibNFC::Target.new(targets + i * LibNFC::Target.size)
59
53
  # iterate over requested card types for each target
60
54
  # notice that some targets can match several types i.e.
61
55
  # contactless credit cards (PayPass/payWave) with mifare chip
62
56
  # on board
63
- tag_types.each do |tag_type|
64
- if tag_type.match?(target)
65
- tag = tag_type.new(target, self)
57
+ card_types.each do |card_type|
58
+ if card_type.match?(target)
59
+ tag = card_type.new(target, self)
66
60
  tag.connect(&block)
67
-
68
- # if this tag was marked as processed within the bloc -
69
- # continue with the next tag
61
+ # if this tag was marked as processed - continue with next tag
70
62
  break if target.processed?
71
63
  end
72
64
  end
@@ -89,9 +81,5 @@ module NFC
89
81
  names.map {|name| Reader.new(name)}
90
82
  end
91
83
  end
92
-
93
- def set_flag(name, value)
94
- LibNFC.nfc_device_set_property_bool(@ptr, name, value)
95
- end
96
84
  end
97
85
  end
@@ -65,6 +65,16 @@ module IsoDep
65
65
  select(aid).raise_errno!
66
66
  end
67
67
 
68
+ # Public: Select application with given AID (Application Identifier)
69
+ #
70
+ # aid - Application Identifier of an applet located on a card
71
+ #
72
+ # Returns nothing.
73
+ # Raises APDU::Errno if application with such AID doesn't exists on a card
74
+ def select(aid)
75
+ send_apdu!("\x00\xA4\x04\x00#{aid.size.chr}#{aid}")
76
+ end
77
+
68
78
  # Public: Send APDU command to tag
69
79
  #
70
80
  # apdu - APDU command to send. see ISO/IEC 7816-4 or wiki for details.
@@ -21,7 +21,7 @@ module Mifare
21
21
  }
22
22
 
23
23
  # common freefare functions prototypes
24
- attach_function :freefare_tag_new, [:pointer, LibNFC::ISO14443a.by_value], :pointer
24
+ attach_function :freefare_tag_new, [:pointer, LibNFC::Target.by_value], :pointer
25
25
  attach_function :freefare_free_tag, [:pointer], :void
26
26
 
27
27
  # tag
@@ -37,7 +37,7 @@ module Mifare
37
37
  def initialize(target, reader)
38
38
  super(target, reader)
39
39
 
40
- @pointer = Mifare.freefare_tag_new(reader.ptr, target[:nti][:nai])
40
+ @pointer = Mifare.freefare_tag_new(reader.ptr, target)
41
41
 
42
42
  raise Mifare::Error, "Unknown mifare tag" if @pointer.null?
43
43
  end
@@ -6,10 +6,10 @@ module NFC
6
6
  @processed = false
7
7
  end
8
8
 
9
- def connect
9
+ def connect(&block)
10
10
  if block_given?
11
11
  begin
12
- yield self
12
+ self.instance_eval(&block)
13
13
  ensure
14
14
  disconnect
15
15
  end
metadata CHANGED
@@ -1,41 +1,41 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby-nfc
3
3
  version: !ruby/object:Gem::Version
4
- version: '1.3'
4
+ version: '1.4'
5
5
  platform: ruby
6
6
  authors:
7
7
  - Maxim Chechel
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-11-25 00:00:00.000000000 Z
11
+ date: 2015-11-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ffi
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ! '>='
17
+ - - ~>
18
18
  - !ruby/object:Gem::Version
19
19
  version: '0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ! '>='
24
+ - - ~>
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: minitest
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ! '>='
31
+ - - ~>
32
32
  - !ruby/object:Gem::Version
33
33
  version: '0'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - ! '>='
38
+ - - ~>
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
41
  description: ! " \tThis gem is built on top of libnfc and libfreefare using ffi and