rfid4r 1.0.0-x86-linux

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.
@@ -0,0 +1,300 @@
1
+ require 'webrick'
2
+ require 'rubygems'
3
+ require 'sqlite3'
4
+ require 'readers_adapter/phidget_rfid_reader'
5
+ require 'inteface_aplication/rfid_interface_client'
6
+
7
+ #
8
+ # La clase RfidServer representa el manejador de eventos del Middleware RFID,
9
+ # para el manejo de los eventos generados por las capturas de etiquetas RFID.
10
+ # RfidServer es una clase concreta de la clase WEBrick::GenericServer que
11
+ # implementa un servidor para el manejo de un lector RFID. Adicionalmente
12
+ # recibe comandos que permiten consultar, registrar y liberar el lector RFID,
13
+ # asi como tambien comandos para consultar la base de datos SQLite de eventos
14
+ # RFID.
15
+ #
16
+ class RfidServer < WEBrick::GenericServer
17
+ # Representa una referencia a una interfaz cliente para consultas hacia otros
18
+ # servidores RFID
19
+ attr_reader :interface_client
20
+ # Referencia al lector RFID conectado al servidor
21
+ attr_reader :reader
22
+ # Referencia logica para la presencia o no del lector RFID
23
+ attr_reader :is_attach
24
+ # Referencia logica para la activacion o no del muestreo de eventos RFID
25
+ attr_reader :active
26
+ # Referencia logica para la activacion o no del muestreo de eventos RFID remoto
27
+ attr_reader :active_remote
28
+ # Referencia al tiempo de espera para conectar el lector RFID
29
+ attr_reader :timeout
30
+ # Representa una referencia al monitor de enventos le lectura de tags RFID
31
+ attr_reader :verbose
32
+ # Representa una referencia al monitor de enventos le lectura de tags RFID remoto
33
+ attr_reader :verbose_remote
34
+ # Referencia a un semaforo de sincronizacion de captura de eventos RFID
35
+ attr_reader :mutex
36
+
37
+ #
38
+ # Crea un nuevo servidor RFID utilizando el archivo de configuracion
39
+ # "rfid_config.yml", adicionalmente instancia la base de datos SQLite de
40
+ # eventos para su uso porterior.
41
+ #
42
+ def initialize(config={}, default=WEBrick::Config::General)
43
+ @interface_client = RfidInterfaceClient.new
44
+ p = @interface_client.config["local_config"]["port"]
45
+ ip = @interface_client.config["local_config"]["ip_address"]
46
+ @timeout = @interface_client.config["local_config"]["timeout"]
47
+ config[:Port] = p unless p.nil?
48
+ config[:BindAddress] = ip unless ip.nil?
49
+ @is_attach = false
50
+ @active = false
51
+ @active_remote = false
52
+ @mutex = Mutex.new
53
+ super
54
+ @db = SQLite3::Database.new('rfid_events.db')
55
+ end
56
+
57
+ #
58
+ # Recibe y procesa los comandos, a continuacion se muestra una lista de los comandos soportados
59
+ # y una breve descripcion de su funcion:
60
+ #
61
+ # attach: Attach a new RFID reader
62
+ # detach: Detach the RFID reader
63
+ # ls|list|reader: Serial of RFID reader
64
+ # n|name: Name of RFID reader
65
+ # t|type: Type of RFID reader
66
+ # version: Version of RFID reader
67
+ # verbose: Initialize the observer of RFID events
68
+ # stop: Stop the observer of RFID events
69
+ # server: List all servers
70
+ # set [id_of_server]: Change the current server
71
+ # current: Show the current server selected
72
+ # select [SQL]: Consulta de tipo SQL a la base de datos SQLite
73
+ # quit|close|exit: Close the connection with de server
74
+ #
75
+ def run(sock)
76
+ while true
77
+ cmd = sock.gets
78
+ case cmd
79
+ when /\bclose|exit|quit\W/
80
+ sock.print "Shutting down..."
81
+ break
82
+ # ************************* servers ******************************
83
+ when /\bservers\W/
84
+ if @interface_client.servers>0
85
+ @interface_client.config.each do |key, value|
86
+ sock.print "Server: #{key} #{value["ip_address"]}:#{value["port"]}, Id of server: #{value["id_server"]}\n"
87
+ end
88
+ else
89
+ sock.print "ERROR: No Server Found!\n"
90
+ end
91
+ # ************************* current server ******************************
92
+ when /\bcurrent\W/
93
+ server_name = @interface_client.id_server
94
+ sock.print "Server: #{server_name} #{@interface_client.config[server_name]["ip_address"]}:#{@interface_client.config[server_name]["port"]} , Id of server: #{@interface_client.config[server_name]["id_server"]}\n"
95
+ # ************************* set server ******************************
96
+ when /\bset\s+([0-9A-Za-z])+/
97
+ if @interface_client.servers>0
98
+ @interface_client.set_server(sock,cmd.split(/\s/)[1])
99
+ else
100
+ sock.print "ERROR: No Server Found!\n"
101
+ end
102
+ # ************************* attach **********************************
103
+ when /\battach\W(\s*-r)?/
104
+ if @interface_client.id_server.eql?("local_config")
105
+ if !@is_attach
106
+ begin
107
+ @reader = PhidgetRfidReader.new(@timeout)
108
+ @is_attach = true
109
+ sock.print "Device #{@reader.serial} found!\n"
110
+ rescue Exception => e
111
+ sock.print "ERROR: #{e}\n"
112
+ end
113
+ else
114
+ sock.print "ERROR: An RFID reader is attached!\n"
115
+ end
116
+ elsif @interface_client.servers>0
117
+ @interface_client.single_consult(sock,"attach -r\n")
118
+ end
119
+ if cmd.split(/\s/)[1].eql?("-r")
120
+ break
121
+ end
122
+ # ************************* ls|list|reader **********************************
123
+ when /\bls|list|reader\W(\s*-r)?/
124
+ if @interface_client.id_server.eql?("local_config")
125
+ if @is_attach
126
+ sock.print "#{@reader.serial}\n"
127
+ else
128
+ sock.print "ERROR: No device found!\n"
129
+ end
130
+ elsif @interface_client.servers>0
131
+ @interface_client.single_consult(sock,"ls -r\n")
132
+ end
133
+ if cmd.split(/\s/)[1].eql?("-r")
134
+ break
135
+ end
136
+ # ************************* name **********************************
137
+ when /\bn|name\W(\s*-r)?/
138
+ if @interface_client.id_server.eql?("local_config")
139
+ if @is_attach
140
+ sock.print "#{@reader.name}\n"
141
+ else
142
+ sock.print "ERROR: No device found!\n"
143
+ end
144
+ elsif @interface_client.servers>0
145
+ @interface_client.single_consult(sock,"n -r\n")
146
+ end
147
+ if cmd.split(/\s/)[1].eql?("-r")
148
+ break
149
+ end
150
+ # ************************* type **********************************
151
+ when /\bt|type\W(\s*-r)?/
152
+ if @interface_client.id_server.eql?("local_config")
153
+ if @is_attach
154
+ sock.print "#{@reader.type}\n"
155
+ else
156
+ sock.print "ERROR: No device found!\n"
157
+ end
158
+ elsif @interface_client.servers>0
159
+ @interface_client.single_consult(sock,"t -r\n")
160
+ end
161
+ if cmd.split(/\s/)[1].eql?("-r")
162
+ break
163
+ end
164
+ # ************************* version **********************************
165
+ when /\bversion\W(\s*-r)?/
166
+ if @interface_client.id_server.eql?("local_config")
167
+ if @is_attach
168
+ sock.print "#{@reader.version}\n"
169
+ else
170
+ sock.print "ERROR: No device found!\n"
171
+ end
172
+ elsif @interface_client.servers>0
173
+ @interface_client.single_consult(sock,"version -r\n")
174
+ end
175
+ if cmd.split(/\s/)[1].eql?("-r")
176
+ break
177
+ end
178
+ # ************************* detach **********************************
179
+ when /\bdetach\W(\s*-r)?/
180
+ if @interface_client.id_server.eql?("local_config")
181
+ if @is_attach
182
+ @reader.delete
183
+ @is_attach = false
184
+ if @active
185
+ @verbose.exit
186
+ @active = false
187
+ end
188
+ sock.print "Device #{@reader.serial} detached!\n"
189
+ else
190
+ sock.print "ERROR: No device found!\n"
191
+ end
192
+ elsif @interface_client.servers>0
193
+ @interface_client.single_consult(sock,"detach -r\n")
194
+ end
195
+ if cmd.split(/\s/)[1].eql?("-r")
196
+ break
197
+ end
198
+ # ************************* detachall **********************************
199
+ # when /\bdetachall\W/
200
+ # @readers.each do |s,r|
201
+ # sock.print "Device #{r.serial} detached!\n"
202
+ # r.delete
203
+ # end
204
+ # @readers.clear
205
+ # ************************* consult **********************************
206
+ when /\bconsult/
207
+ @db.execute(cmd.split("consult")[1]) do |row|
208
+ row.each do |col|
209
+ sock.print "#{col.to_s};"
210
+ end
211
+ sock.print "\n"
212
+ end
213
+ break
214
+ # ************************* select SQL **********************************
215
+ when /\bselect/
216
+ begin
217
+ if @interface_client.id_server.eql?("local_config")
218
+ @db.execute(cmd) do |row|
219
+ row.each do |col|
220
+ sock.print "#{col.to_s};"
221
+ end
222
+ sock.print "\n"
223
+ end
224
+ elsif @interface_client.servers>0
225
+ @interface_client.consult(sock,"consult #{cmd}")
226
+ end
227
+ rescue SQLite3::SQLException => e
228
+ sock.print "ERROR: #{e}\n"
229
+ rescue Exception => e
230
+ sock.print "ERROR: #{e}\n"
231
+ end
232
+ # ******************** Mostrar eventos a cierta frecuencia ************************
233
+ when /\bverbose\W(\s*-r)?/
234
+ if @interface_client.id_server.eql?("local_config")
235
+ if !@active and @is_attach
236
+ @active = true
237
+ tag = 0
238
+ opt = cmd.split(' ')[1]
239
+ @verbose = Thread.new(opt) do
240
+ while true
241
+ if @reader.count > tag
242
+ tag = @reader.count
243
+ sock.print "Reader:#{@reader.serial} #{@reader.lastTag()}\n"
244
+ elsif !@active
245
+ sock.print "MESSAGE: Stop Verbose\n"
246
+ break
247
+ else
248
+ sock.print " "
249
+ end
250
+ sleep(0.1)
251
+ end
252
+ end
253
+ end
254
+ elsif @interface_client.servers>0
255
+ if !@active_remote
256
+ @active_remote = true
257
+ @verbose_remote = Thread.new do
258
+ @interface_client.consult(sock,"verbose -r -r")
259
+ end
260
+ end
261
+ end
262
+ # ************************* Parar Muestreo **********************************
263
+ when /\bstop\W(\s*-r)?/
264
+ if @interface_client.id_server.eql?("local_config")
265
+ if @active
266
+ #sock.print "MESSAGE: Stop Verbose\n"
267
+ @active = false
268
+ #@verbose.exit
269
+ end
270
+ elsif @interface_client.servers>0
271
+ if @active_remote
272
+ @interface_client.single_consult(sock,"stop -r\n")
273
+ #@verbose_remote.exit
274
+ @active_remote = false
275
+ end
276
+ end
277
+ if cmd.split(/\s/)[1].eql?("-r")
278
+ break
279
+ end
280
+ # ************************* h|help **********************************
281
+ when /\bh|help\W/
282
+ sock.print "attach: Attach a new RFID reader\n"
283
+ sock.print "detach: Detach the RFID reader\n"
284
+ sock.print "ls|list|reader: Serial of RFID reade\n"
285
+ sock.print "n|name: Name of RFID reader\n"
286
+ sock.print "t|type: Type of RFID reader\n"
287
+ sock.print "version: Version of RFID reader\n"
288
+ sock.print "verbose: Initialize the observer of RFID events\n"
289
+ sock.print "stop: Stop the observer of RFID events\n"
290
+ sock.print "server: List all servers\n"
291
+ sock.print "set [id_of_server]: Change the current server\n"
292
+ sock.print "current: Show the current server selected\n"
293
+ sock.print "select [SQL]: Consulta de tipo SQL a la base de datos SQLite\n"
294
+ sock.print "quit|close|exit: Close the connection with de server\n"
295
+ else
296
+ sock.print "ERROR: Unknown command! Type h or help for Help\n"
297
+ end
298
+ end
299
+ end
300
+ end
@@ -0,0 +1,10 @@
1
+ local_config:
2
+ id_server: 0
3
+ ip_address: 127.0.0.1
4
+ port: 8004
5
+ timeout: 5000
6
+
7
+ server1:
8
+ id_server: 1
9
+ ip_address: 127.0.0.1
10
+ port: 8000
@@ -0,0 +1,84 @@
1
+ require 'net/telnet'
2
+ require 'rubygems'
3
+ require 'yaml'
4
+
5
+ #
6
+ # La clase RfidInterfaceClient representa una interfaz para un cliente Telnet genérico
7
+ #
8
+ class RfidInterfaceClient
9
+ # Referencia a un hash de parámetros de configuración
10
+ attr_reader :config
11
+ # Referencia a cantidad de servidores instanciados
12
+ attr_reader :servers
13
+ # Representa el identificado del servidor actualmente en uso
14
+ attr_reader :id_server
15
+
16
+ #
17
+ # Crea una nueva interfaz para un cliente Telnet genérico, a partir de los parámetros
18
+ # de configuración obtenidos desde el archivo "rfid_config.yml"
19
+ #
20
+ def initialize(yml='rfid_config.yml')
21
+ parse = YAML::parse(File.open(yml))
22
+ @config = parse.transform
23
+ @id_server = "local_config"
24
+ @servers = 0
25
+ @config.each do |key, value|
26
+ if key.include?("server")
27
+ @servers = @servers + 1
28
+ end
29
+ end
30
+ end
31
+
32
+ #
33
+ # Ejecuta un comando y recibe una o más respuestas, imprimiéndola(s) en el socket
34
+ #
35
+ def consult(sock,cmd)
36
+ begin
37
+ conection = Net::Telnet::new("Host" => @config[@id_server]["ip_address"].to_s,"Timeout" => 5,"Port" => @config[@id_server]["port"])
38
+ sock.print "MESSAGE: Server "+@config[@id_server]["ip_address"].to_s+":"+@config[@id_server]["port"].to_s+"\n"
39
+ conection.cmd("#{cmd.chop}") do |response|
40
+ sock.print response.to_s
41
+ if response.to_s.include?("Stop Verbose")
42
+ conection.puts("exit")
43
+ end
44
+ end
45
+ rescue Exception => e
46
+ sock.print "ERROR: Couldn't establish the conexion!\n"
47
+ end
48
+ end
49
+
50
+ #
51
+ # Ejecuta un comando y recibe una respuesta, imprimiéndola en el socket
52
+ #
53
+ def single_consult(sock,cmd)
54
+ begin
55
+ conection = Net::Telnet::new("Host" => @config[@id_server]["ip_address"].to_s,"Timeout" => 5,"Port" => @config[@id_server]["port"])
56
+ sock.print "MESSAGE: Server "+@config[@id_server]["ip_address"].to_s+":"+@config[@id_server]["port"].to_s+"\n"
57
+ conection.puts("#{cmd.chop}")
58
+ sock.print conection.gets
59
+ #conection.close
60
+ rescue
61
+ sock.print "ERROR: Couldn't establish the conexion!\n"
62
+ end
63
+ end
64
+
65
+ #
66
+ # Permite cambiar el servidor al cual seran dirigidos los comandos
67
+ # y consultas
68
+ #
69
+ def set_server(sock, id)
70
+ change = false
71
+ @config.each do |key, value|
72
+ if value["id_server"].to_s.eql?(id)
73
+ change = true
74
+ @id_server = key
75
+ sock.print "MESSAGE: Change to Server #{id} Complete!\n"
76
+ break
77
+ end
78
+ end
79
+ if !change
80
+ sock.print "ERROR: No Server Found!\n"
81
+ end
82
+ end
83
+
84
+ end
data/lib/phid.so ADDED
Binary file
@@ -0,0 +1,84 @@
1
+ require 'phid'
2
+ require 'readers_adapter/rfid_reader'
3
+ require 'observer'
4
+
5
+ #
6
+ # PhidgetRfidReader es una clase concreta de la clase RfidReader que define en
7
+ # detalle la estructura de los metodos de un lector RFID.
8
+ #
9
+ class PhidgetRfidReader < RfidReader
10
+ # El modulo Phid encapsula el wrapper de lector RFID PhidgetRFID-1023.
11
+ include Phid
12
+
13
+ #
14
+ # Crea un nuevo lector RFID con sus atributos básicos.
15
+ # Adicionalmente maneja un log de registro de eventos de lecturas de
16
+ # etiquetas RFID, estos eventos son almacenados en una base de datos SQLite a
17
+ # la vez que son leidos por el lector RFID.
18
+ #
19
+ def initialize(timeout=10,log='phid.log', dbname='rfid_events.db')
20
+ begin
21
+ rfid_create(dbname)
22
+ result = wait_attachment(timeout)
23
+ if result != 0
24
+ raise get_error_description(result)
25
+ end
26
+ super(get_device_name, get_device_type, get_serial_number, get_device_version)
27
+ puts "Device #{name}::#{serial} Found!\n"
28
+ log_message("#{self}", "Device #{name}::#{serial} Found!\n")
29
+ enable_loggin("#{serial}-#{log}")
30
+ turn_antenna_on
31
+ rescue Exception => e
32
+ puts "ERROR: #{e}"
33
+ raise get_error_description(result)
34
+ end
35
+ end
36
+
37
+ #
38
+ # Activa o desactiva la antena del lector RFID.
39
+ #
40
+ def antenna(set)
41
+ if set
42
+ turn_antenna_on
43
+ else
44
+ turn_antenna_off
45
+ end
46
+ end
47
+
48
+ #
49
+ # Muestra por salida estandar las propiedas básicas del lector RFID, como
50
+ # nombre, tipo, serial y versión.
51
+ #
52
+ def properties
53
+ puts "Device Name: #{name}\n"
54
+ puts "Device Type: #{type}\n"
55
+ puts "Device Serial: #{serial}\n"
56
+ puts "Device Version: #{version}\n"
57
+ end
58
+
59
+ #
60
+ # Elimina el lector RFID mostrando un aviso de notificacion, con lo cual se
61
+ # dejara de detectar las etiquetas RFID. Adicionalmente, este evento es
62
+ # almacenado en el log de registro y en la base de datos SQLite.
63
+ #
64
+ def delete
65
+ puts "Device #{name}::#{serial} Dettached!\n"
66
+ log_message("#{self}", "Device #{name}::#{serial} Dettached!\n")
67
+ rfid_delete
68
+ end
69
+
70
+ #
71
+ # Retorna el último ID leído por el lector.
72
+ #
73
+ def lastTag
74
+ get_lastTag
75
+ end
76
+
77
+ #
78
+ # Retorna el número de eventos de lectura registrados por el lector.
79
+ #
80
+ def count
81
+ count_tags
82
+ end
83
+
84
+ end
@@ -0,0 +1,40 @@
1
+ #
2
+ # La clase RfidReader encapsula la estructura básica de los metodos de un
3
+ # lector RFID. Las subclases deberan redefinir los metodos sin cambiar su
4
+ # estructura.
5
+ #
6
+ class RfidReader
7
+ # Referencia al nombre del lector RFID
8
+ attr_accessor :name
9
+ # Referencia al tipo de lector RFID
10
+ attr_accessor :type
11
+ # Referencia al serial unico del lector RFID
12
+ attr_accessor :serial
13
+ # Referencia a la versión del lector RFID
14
+ attr_accessor :version
15
+
16
+ #
17
+ # Crea un nuevo lector RFID con sus atributos básicos.
18
+ #
19
+ def initialize(name, type, serial, version)
20
+ @name=name
21
+ @type=type
22
+ @serial=serial
23
+ @version=version
24
+ end
25
+
26
+ #
27
+ # Muestra las propiedas básicas del lector RFID, como nombre, tipo, serial
28
+ # y/o versión.
29
+ #
30
+ def properties
31
+ end
32
+
33
+ #
34
+ # Elimina el lector RFID, con lo cual se dejara de detectar las etiquetas
35
+ # RFID.
36
+ #
37
+ def delete
38
+ end
39
+
40
+ end
data/lib/rfid4r.rb ADDED
@@ -0,0 +1,32 @@
1
+ require 'event_handler/rfid_server'
2
+
3
+ #
4
+ # La clase Rfid4r implementa directamente el servidor RFID de la clase
5
+ # RfidServer.
6
+ #
7
+ class Rfid4r
8
+ # Referencia al servidor RFID
9
+ attr_reader :server
10
+
11
+ # Instancia e inicia automaticamente los servicios del servidor RFID.
12
+ # Un ejemplo sencillo de uso de esta clase se muestra a continuacion:
13
+ #
14
+ # require 'rubygems'
15
+ # require 'rfid4r'
16
+ # r = Rfid4r.new
17
+ # r.init
18
+ # se obtiene:
19
+ # [2008-10-03 12:34:48] INFO WEBrick 1.3.1
20
+ # [2008-10-03 12:34:48] INFO ruby 1.8.6 (2008-08-08) [i686-linux]
21
+ # [2008-10-03 12:34:48] INFO RfidServer#start: pid=6394 port=8004
22
+ def init
23
+ @server = RfidServer.new()
24
+ trap("INT"){ @server.shutdown }
25
+ @server.start
26
+ end
27
+
28
+ def stop
29
+ @server.shutdown
30
+ end
31
+ end
32
+
metadata ADDED
@@ -0,0 +1,78 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rfid4r
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: x86-linux
6
+ authors:
7
+ - "Daniel Gonz\xC3\xA1lez & Joel Ojeda"
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2008-10-27 00:00:00 -04:30
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: sqlite3-ruby
17
+ type: :runtime
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: 1.2.4
24
+ version:
25
+ description:
26
+ email: dangt85@gmail.com & ojeda.joel@gmail.com
27
+ executables: []
28
+
29
+ extensions: []
30
+
31
+ extra_rdoc_files:
32
+ - README.rdoc
33
+ files:
34
+ - ext/phid.so
35
+ - ext/phid.h
36
+ - ext/phid_wrap.c
37
+ - ext/extconf.rb
38
+ - ext/Makefile
39
+ - ext/phid.i
40
+ - lib/readers_adapter
41
+ - lib/readers_adapter/rfid_reader.rb
42
+ - lib/readers_adapter/phidget_rfid_reader.rb
43
+ - lib/inteface_aplication
44
+ - lib/inteface_aplication/rfid_interface_client.rb
45
+ - lib/inteface_aplication/rfid_config.yml
46
+ - lib/rfid4r.rb
47
+ - lib/phid.so
48
+ - lib/event_handler
49
+ - lib/event_handler/rfid_server.rb
50
+ - README.rdoc
51
+ has_rdoc: true
52
+ homepage: http://rfid4r.rubyforge.org
53
+ post_install_message:
54
+ rdoc_options: []
55
+
56
+ require_paths:
57
+ - lib
58
+ required_ruby_version: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: "0"
63
+ version:
64
+ required_rubygems_version: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: "0"
69
+ version:
70
+ requirements: []
71
+
72
+ rubyforge_project: rfid4r
73
+ rubygems_version: 1.2.0
74
+ signing_key:
75
+ specification_version: 2
76
+ summary: An RFID middleware using a Ruby wrapper for the PhidgetRFID-1023 reader.
77
+ test_files: []
78
+