line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
1
|
|
|
|
|
|
|
package RFID::EPC::Tag; |
2
|
|
|
|
|
|
|
$VERSION=0.002; |
3
|
|
|
|
|
|
|
@ISA = qw(RFID::Tag); |
4
|
|
|
|
|
|
|
|
5
|
|
|
|
|
|
|
# Written by Scott Gifford |
6
|
|
|
|
|
|
|
# Copyright (C) 2004 The Regents of the University of Michigan. |
7
|
|
|
|
|
|
|
# See the file LICENSE included with the distribution for license |
8
|
|
|
|
|
|
|
# information. |
9
|
|
|
|
|
|
|
=head1 NAME |
10
|
|
|
|
|
|
|
|
11
|
|
|
|
|
|
|
RFID::EPC::Tag - An EPC tag. |
12
|
|
|
|
|
|
|
|
13
|
|
|
|
|
|
|
=head1 SYNOPSIS |
14
|
|
|
|
|
|
|
|
15
|
|
|
|
|
|
|
This class implements an EPC tag based on L. It |
16
|
|
|
|
|
|
|
allows tags to be created based on the fields of the various EPC tag |
17
|
|
|
|
|
|
|
types, and allows tag IDs to be parsed into their EPC components. |
18
|
|
|
|
|
|
|
|
19
|
|
|
|
|
|
|
Generally, you'll get these objects returend from an EPC RFID reader: |
20
|
|
|
|
|
|
|
|
21
|
|
|
|
|
|
|
use RFID::Gumbo::Reader::TCP; |
22
|
|
|
|
|
|
|
my $reader = |
23
|
|
|
|
|
|
|
RFID::Gumbo::Reader::TCP->new(PeerAddr => 10.20.30.40, |
24
|
|
|
|
|
|
|
PeerPort => 4001) |
25
|
|
|
|
|
|
|
or die "Couldn't create Blammo reader"; |
26
|
|
|
|
|
|
|
my @tags = $reader->readtags(); |
27
|
|
|
|
|
|
|
foreach my $tag (@tags) |
28
|
|
|
|
|
|
|
{ |
29
|
|
|
|
|
|
|
if ($tag->type eq 'epc') |
30
|
|
|
|
|
|
|
{ |
31
|
|
|
|
|
|
|
my $epc_type = $tag->get('epc_type'); |
32
|
|
|
|
|
|
|
print "I see EPC tag ",$tag->id," of type $epc_type\n"; |
33
|
|
|
|
|
|
|
} |
34
|
|
|
|
|
|
|
} |
35
|
|
|
|
|
|
|
|
36
|
|
|
|
|
|
|
But you can also create a tag yourself, either with an ID string: |
37
|
|
|
|
|
|
|
|
38
|
|
|
|
|
|
|
my $tag = RFID::EPC::Tag->new(id => '357777777666666999999999'); |
39
|
|
|
|
|
|
|
|
40
|
|
|
|
|
|
|
or with the various componenets: |
41
|
|
|
|
|
|
|
|
42
|
|
|
|
|
|
|
my $tag = |
43
|
|
|
|
|
|
|
RFID::EPC::Tag->new(epc_serial => '999999999', |
44
|
|
|
|
|
|
|
epc_manager => '7777777', |
45
|
|
|
|
|
|
|
epc_class => '666666', |
46
|
|
|
|
|
|
|
epc_type => 'GID-96'); |
47
|
|
|
|
|
|
|
print "Tag ID is ",$tag->id,"\n"; |
48
|
|
|
|
|
|
|
|
49
|
|
|
|
|
|
|
|
50
|
|
|
|
|
|
|
=head1 DESCRIPTION |
51
|
|
|
|
|
|
|
|
52
|
|
|
|
|
|
|
The parsing and tag creation in this module are based on the |
53
|
|
|
|
|
|
|
specifications in EPCGlobal's I
|
54
|
|
|
|
|
|
|
Rev.1.24>, from April 1st 2004 (although it doesn't appear to be a |
55
|
|
|
|
|
|
|
joke...). See L for more information. |
56
|
|
|
|
|
|
|
|
57
|
|
|
|
|
|
|
=cut |
58
|
|
|
|
|
|
|
|
59
|
2
|
|
|
2
|
|
117846
|
use strict; |
|
2
|
|
|
|
|
6
|
|
|
2
|
|
|
|
|
102
|
|
60
|
2
|
|
|
2
|
|
14
|
use warnings; |
|
2
|
|
|
|
|
4
|
|
|
2
|
|
|
|
|
73
|
|
61
|
|
|
|
|
|
|
|
62
|
2
|
|
|
2
|
|
13
|
use Carp; |
|
2
|
|
|
|
|
9
|
|
|
2
|
|
|
|
|
270
|
|
63
|
2
|
|
|
2
|
|
13
|
use Exporter; |
|
2
|
|
|
|
|
3
|
|
|
2
|
|
|
|
|
108
|
|
64
|
2
|
|
|
2
|
|
8366
|
use RFID::Tag; |
|
2
|
|
|
|
|
6508
|
|
|
2
|
|
|
|
|
151
|
|
65
|
|
|
|
|
|
|
|
66
|
|
|
|
|
|
|
our @EXPORT_OK = (@RFID::Tag::Export_OK); |
67
|
|
|
|
|
|
|
|
68
|
2
|
|
|
2
|
|
18
|
use constant TAGTYPE => 'epc'; |
|
2
|
|
|
|
|
3
|
|
|
2
|
|
|
|
|
23055
|
|
69
|
|
|
|
|
|
|
|
70
|
|
|
|
|
|
|
# Cheatsheet for fast hex conversion |
71
|
|
|
|
|
|
|
our %HEXCHEAT = ( 0 => '0000', 1 => '0001', 2 => '0010', 3 => '0011', |
72
|
|
|
|
|
|
|
4 => '0100', 5 => '0101', 6 => '0110', 7 => '0111', |
73
|
|
|
|
|
|
|
8 => '1000', 9 => '1001', A => '1010', B => '1011', |
74
|
|
|
|
|
|
|
C => '1100', D => '1101', E => '1110', F => '1111'); |
75
|
|
|
|
|
|
|
|
76
|
|
|
|
|
|
|
# The names and specifications for all of the EPC tags we know about. |
77
|
|
|
|
|
|
|
our %TAGTYPES = |
78
|
|
|
|
|
|
|
( |
79
|
|
|
|
|
|
|
'SGTIN-96' => { |
80
|
|
|
|
|
|
|
bits => 96, |
81
|
|
|
|
|
|
|
type_bits => 8, |
82
|
|
|
|
|
|
|
type_val => 0b00110000, |
83
|
|
|
|
|
|
|
fields => [ |
84
|
|
|
|
|
|
|
epc_header => 8, |
85
|
|
|
|
|
|
|
epc_filter => 3, |
86
|
|
|
|
|
|
|
epc_partition => 3, |
87
|
|
|
|
|
|
|
epc_company => '?', |
88
|
|
|
|
|
|
|
epc_item => '?', |
89
|
|
|
|
|
|
|
epc_serial => 38 |
90
|
|
|
|
|
|
|
], |
91
|
|
|
|
|
|
|
partition_fields => [qw(epc_company epc_item)], |
92
|
|
|
|
|
|
|
partitions => [ |
93
|
|
|
|
|
|
|
[40,4], |
94
|
|
|
|
|
|
|
[37,7], |
95
|
|
|
|
|
|
|
[34,10], |
96
|
|
|
|
|
|
|
[30,14], |
97
|
|
|
|
|
|
|
[27,17], |
98
|
|
|
|
|
|
|
[24,20], |
99
|
|
|
|
|
|
|
[20,24], |
100
|
|
|
|
|
|
|
], |
101
|
|
|
|
|
|
|
}, |
102
|
|
|
|
|
|
|
'GID-96' => { |
103
|
|
|
|
|
|
|
bits => 96, |
104
|
|
|
|
|
|
|
type_bits => 8, |
105
|
|
|
|
|
|
|
type_val => 0b00110101, |
106
|
|
|
|
|
|
|
fields => [ |
107
|
|
|
|
|
|
|
epc_header => 8, |
108
|
|
|
|
|
|
|
epc_manager => 28, |
109
|
|
|
|
|
|
|
epc_class => 24, |
110
|
|
|
|
|
|
|
epc_serial => 36 |
111
|
|
|
|
|
|
|
] |
112
|
|
|
|
|
|
|
}, |
113
|
|
|
|
|
|
|
'SGTIN-64' => { |
114
|
|
|
|
|
|
|
bits => 64, |
115
|
|
|
|
|
|
|
type_bits => 2, |
116
|
|
|
|
|
|
|
type_val => 0b10000000, |
117
|
|
|
|
|
|
|
fields => [ |
118
|
|
|
|
|
|
|
epc_header => 2, |
119
|
|
|
|
|
|
|
epc_filter => 3, |
120
|
|
|
|
|
|
|
epc_company => 14, |
121
|
|
|
|
|
|
|
epc_item => 20, |
122
|
|
|
|
|
|
|
epc_serial => 25 |
123
|
|
|
|
|
|
|
] |
124
|
|
|
|
|
|
|
}, |
125
|
|
|
|
|
|
|
'SSCC-64' => { |
126
|
|
|
|
|
|
|
bits => 64, |
127
|
|
|
|
|
|
|
type_bits => 8, |
128
|
|
|
|
|
|
|
type_val => 0b00001000, |
129
|
|
|
|
|
|
|
fields => [ |
130
|
|
|
|
|
|
|
epc_header => 8, |
131
|
|
|
|
|
|
|
epc_filter => 3, |
132
|
|
|
|
|
|
|
epc_company => 14, |
133
|
|
|
|
|
|
|
epc_serial => 39 |
134
|
|
|
|
|
|
|
] |
135
|
|
|
|
|
|
|
}, |
136
|
|
|
|
|
|
|
'SSCC-96' => { |
137
|
|
|
|
|
|
|
bits => 96, |
138
|
|
|
|
|
|
|
type_bits => 8, |
139
|
|
|
|
|
|
|
type_val => 0b00110001, |
140
|
|
|
|
|
|
|
fields => [ |
141
|
|
|
|
|
|
|
epc_header => 8, |
142
|
|
|
|
|
|
|
epc_filter => 3, |
143
|
|
|
|
|
|
|
epc_partition => 3, |
144
|
|
|
|
|
|
|
epc_company => '?', |
145
|
|
|
|
|
|
|
epc_serial => '?', |
146
|
|
|
|
|
|
|
epc_unallocated => 25 |
147
|
|
|
|
|
|
|
], |
148
|
|
|
|
|
|
|
partition_fields => [qw(epc_company epc_serial)], |
149
|
|
|
|
|
|
|
partitions => [ |
150
|
|
|
|
|
|
|
[40,17], |
151
|
|
|
|
|
|
|
[37,20], |
152
|
|
|
|
|
|
|
[34,23], |
153
|
|
|
|
|
|
|
[30,27], |
154
|
|
|
|
|
|
|
[27,30], |
155
|
|
|
|
|
|
|
[24,33], |
156
|
|
|
|
|
|
|
[20,37], |
157
|
|
|
|
|
|
|
], |
158
|
|
|
|
|
|
|
}, |
159
|
|
|
|
|
|
|
'GRAI-64' => { |
160
|
|
|
|
|
|
|
bits => 64, |
161
|
|
|
|
|
|
|
type_bits => 8, |
162
|
|
|
|
|
|
|
type_val => 0b00001010, |
163
|
|
|
|
|
|
|
fields => [ |
164
|
|
|
|
|
|
|
epc_header => 8, |
165
|
|
|
|
|
|
|
epc_filter => 3, |
166
|
|
|
|
|
|
|
epc_company => 14, |
167
|
|
|
|
|
|
|
epc_asset_type => 20, |
168
|
|
|
|
|
|
|
epc_serial => 19 |
169
|
|
|
|
|
|
|
] |
170
|
|
|
|
|
|
|
}, |
171
|
|
|
|
|
|
|
'GRAI-96' => { |
172
|
|
|
|
|
|
|
bits => 96, |
173
|
|
|
|
|
|
|
type_bits => 8, |
174
|
|
|
|
|
|
|
type_val => 0b00110011, |
175
|
|
|
|
|
|
|
fields => [ |
176
|
|
|
|
|
|
|
epc_header => 8, |
177
|
|
|
|
|
|
|
epc_filter => 3, |
178
|
|
|
|
|
|
|
epc_partition => 3, |
179
|
|
|
|
|
|
|
epc_company => '?', |
180
|
|
|
|
|
|
|
epc_asset_type => '?', |
181
|
|
|
|
|
|
|
epc_serial => 38 |
182
|
|
|
|
|
|
|
], |
183
|
|
|
|
|
|
|
partition_fields => [qw(epc_company epc_asset_type)], |
184
|
|
|
|
|
|
|
partitions => [ |
185
|
|
|
|
|
|
|
[40,4], |
186
|
|
|
|
|
|
|
[37,7], |
187
|
|
|
|
|
|
|
[34,10], |
188
|
|
|
|
|
|
|
[30,14], |
189
|
|
|
|
|
|
|
[27,17], |
190
|
|
|
|
|
|
|
[24,20], |
191
|
|
|
|
|
|
|
[20,24], |
192
|
|
|
|
|
|
|
], |
193
|
|
|
|
|
|
|
}, |
194
|
|
|
|
|
|
|
'SGLN-64' => { |
195
|
|
|
|
|
|
|
bits => 64, |
196
|
|
|
|
|
|
|
type_bits => 8, |
197
|
|
|
|
|
|
|
type_val => 0b00001001, |
198
|
|
|
|
|
|
|
fields => [ |
199
|
|
|
|
|
|
|
epc_header => 8, |
200
|
|
|
|
|
|
|
epc_filter => 3, |
201
|
|
|
|
|
|
|
epc_company => 14, |
202
|
|
|
|
|
|
|
epc_location => 20, |
203
|
|
|
|
|
|
|
epc_serial => 19 |
204
|
|
|
|
|
|
|
] |
205
|
|
|
|
|
|
|
}, |
206
|
|
|
|
|
|
|
'SGLN-96' => { |
207
|
|
|
|
|
|
|
bits => 96, |
208
|
|
|
|
|
|
|
type_bits => 8, |
209
|
|
|
|
|
|
|
type_val => 0b00110010, |
210
|
|
|
|
|
|
|
fields => [ |
211
|
|
|
|
|
|
|
epc_header => 8, |
212
|
|
|
|
|
|
|
epc_filter => 3, |
213
|
|
|
|
|
|
|
epc_partition => 3, |
214
|
|
|
|
|
|
|
epc_company => '?', |
215
|
|
|
|
|
|
|
epc_location => '?', |
216
|
|
|
|
|
|
|
epc_serial => 41 |
217
|
|
|
|
|
|
|
], |
218
|
|
|
|
|
|
|
partition_fields => [qw(epc_company epc_location)], |
219
|
|
|
|
|
|
|
partitions => [ |
220
|
|
|
|
|
|
|
[40,1], |
221
|
|
|
|
|
|
|
[37,4], |
222
|
|
|
|
|
|
|
[34,7], |
223
|
|
|
|
|
|
|
[30,11], |
224
|
|
|
|
|
|
|
[27,14], |
225
|
|
|
|
|
|
|
[24,17], |
226
|
|
|
|
|
|
|
[20,21], |
227
|
|
|
|
|
|
|
], |
228
|
|
|
|
|
|
|
}, |
229
|
|
|
|
|
|
|
'GIAI-64' => { |
230
|
|
|
|
|
|
|
bits => 64, |
231
|
|
|
|
|
|
|
type_bits => 8, |
232
|
|
|
|
|
|
|
type_val => 0b00001011, |
233
|
|
|
|
|
|
|
fields => [ |
234
|
|
|
|
|
|
|
epc_header => 8, |
235
|
|
|
|
|
|
|
epc_filter => 3, |
236
|
|
|
|
|
|
|
epc_company => 14, |
237
|
|
|
|
|
|
|
epc_asset => 39, |
238
|
|
|
|
|
|
|
] |
239
|
|
|
|
|
|
|
}, |
240
|
|
|
|
|
|
|
'GIAI-96' => { |
241
|
|
|
|
|
|
|
bits => 96, |
242
|
|
|
|
|
|
|
type_bits => 8, |
243
|
|
|
|
|
|
|
type_val => 0b00110100, |
244
|
|
|
|
|
|
|
fields => [ |
245
|
|
|
|
|
|
|
epc_header => 8, |
246
|
|
|
|
|
|
|
epc_filter => 3, |
247
|
|
|
|
|
|
|
epc_partition => 3, |
248
|
|
|
|
|
|
|
epc_company => '?', |
249
|
|
|
|
|
|
|
epc_asset => '?', |
250
|
|
|
|
|
|
|
], |
251
|
|
|
|
|
|
|
partition_fields => [qw(epc_company epc_asset)], |
252
|
|
|
|
|
|
|
partitions => [ |
253
|
|
|
|
|
|
|
[40,42], |
254
|
|
|
|
|
|
|
[37,45], |
255
|
|
|
|
|
|
|
[34,48], |
256
|
|
|
|
|
|
|
[30,52], |
257
|
|
|
|
|
|
|
[27,55], |
258
|
|
|
|
|
|
|
[24,58], |
259
|
|
|
|
|
|
|
[20,62], |
260
|
|
|
|
|
|
|
], |
261
|
|
|
|
|
|
|
}, |
262
|
|
|
|
|
|
|
'UNKNOWN1-64' => { |
263
|
|
|
|
|
|
|
bits => 64, |
264
|
|
|
|
|
|
|
type_bits => 2, |
265
|
|
|
|
|
|
|
type_val => 0b01000000, |
266
|
|
|
|
|
|
|
fields => [ |
267
|
|
|
|
|
|
|
epc_header => 2, |
268
|
|
|
|
|
|
|
epc_unknown => 62, |
269
|
|
|
|
|
|
|
] |
270
|
|
|
|
|
|
|
}, |
271
|
|
|
|
|
|
|
'UNKNOWN2-64' => { |
272
|
|
|
|
|
|
|
bits => 64, |
273
|
|
|
|
|
|
|
type_bits => 2, |
274
|
|
|
|
|
|
|
type_val => 0b11000000, |
275
|
|
|
|
|
|
|
fields => [ |
276
|
|
|
|
|
|
|
epc_header => 2, |
277
|
|
|
|
|
|
|
epc_unknown => 62, |
278
|
|
|
|
|
|
|
] |
279
|
|
|
|
|
|
|
}, |
280
|
|
|
|
|
|
|
'UNKNOWN3-64' => { |
281
|
|
|
|
|
|
|
bits => 64, |
282
|
|
|
|
|
|
|
type_bits => 5, |
283
|
|
|
|
|
|
|
type_val => 0b00001111, |
284
|
|
|
|
|
|
|
fields => [ |
285
|
|
|
|
|
|
|
epc_header => 8, |
286
|
|
|
|
|
|
|
epc_unknown => 56, |
287
|
|
|
|
|
|
|
] |
288
|
|
|
|
|
|
|
}, |
289
|
|
|
|
|
|
|
'UNKNOWN-96' => { |
290
|
|
|
|
|
|
|
bits => 96, |
291
|
|
|
|
|
|
|
type_bits => 4, |
292
|
|
|
|
|
|
|
type_val => 0b00111111, |
293
|
|
|
|
|
|
|
fields => [ |
294
|
|
|
|
|
|
|
epc_header => 8, |
295
|
|
|
|
|
|
|
epc_unknown => 88, |
296
|
|
|
|
|
|
|
] |
297
|
|
|
|
|
|
|
}, |
298
|
|
|
|
|
|
|
'UNKNOWN' => { |
299
|
|
|
|
|
|
|
type_bits => 0, |
300
|
|
|
|
|
|
|
type_val => 0b00000111, |
301
|
|
|
|
|
|
|
fields => [ |
302
|
|
|
|
|
|
|
epc_header => 8, |
303
|
|
|
|
|
|
|
epc_unknown => '*', |
304
|
|
|
|
|
|
|
], |
305
|
|
|
|
|
|
|
}, |
306
|
|
|
|
|
|
|
|
307
|
|
|
|
|
|
|
); |
308
|
|
|
|
|
|
|
|
309
|
|
|
|
|
|
|
|
310
|
|
|
|
|
|
|
# Sort from longest type_bits to shortest. |
311
|
|
|
|
|
|
|
our @TAGSEARCH = sort |
312
|
|
|
|
|
|
|
{ -1 * ($TAGTYPES{$a}{type_bits} <=> $TAGTYPES{$b}{type_bits}) } |
313
|
|
|
|
|
|
|
keys %TAGTYPES; |
314
|
|
|
|
|
|
|
|
315
|
|
|
|
|
|
|
=head2 Constructor |
316
|
|
|
|
|
|
|
|
317
|
|
|
|
|
|
|
=head3 new |
318
|
|
|
|
|
|
|
|
319
|
|
|
|
|
|
|
Creates a new EPC tag object with the requested properties. |
320
|
|
|
|
|
|
|
|
321
|
|
|
|
|
|
|
There are two general ways to create an EPC tag. First, you can pass |
322
|
|
|
|
|
|
|
in the tag ID number as a hex string with the parameter name I. |
323
|
|
|
|
|
|
|
Second, you can pass in various components specific to your L
|
324
|
|
|
|
|
|
|
Type|/Tag Types>, including at least I. |
325
|
|
|
|
|
|
|
|
326
|
|
|
|
|
|
|
my $tag1 = RFID::EPC::Tag->new(id => '357777777666666999999999'); |
327
|
|
|
|
|
|
|
|
328
|
|
|
|
|
|
|
my $tag2 = |
329
|
|
|
|
|
|
|
RFID::EPC::Tag->new(epc_serial => '999999999', |
330
|
|
|
|
|
|
|
epc_manager => '7777777', |
331
|
|
|
|
|
|
|
epc_class => '666666', |
332
|
|
|
|
|
|
|
epc_type => 'GID-96'); |
333
|
|
|
|
|
|
|
|
334
|
|
|
|
|
|
|
print "The two tags are ", |
335
|
|
|
|
|
|
|
($tag1->tagcmp($tag2)==0?"the same":"different"), |
336
|
|
|
|
|
|
|
"\n"; |
337
|
|
|
|
|
|
|
|
338
|
|
|
|
|
|
|
=cut |
339
|
|
|
|
|
|
|
|
340
|
|
|
|
|
|
|
sub new |
341
|
|
|
|
|
|
|
{ |
342
|
58
|
|
|
58
|
1
|
72739
|
my $self = bless {}, shift; |
343
|
58
|
|
|
|
|
227
|
my(%p)=@_; |
344
|
|
|
|
|
|
|
|
345
|
58
|
|
|
|
|
389
|
$self->_init(%p); |
346
|
|
|
|
|
|
|
|
347
|
58
|
100
|
|
|
|
3398
|
if (defined($p{id})) |
|
|
50
|
|
|
|
|
|
348
|
|
|
|
|
|
|
{ |
349
|
|
|
|
|
|
|
# Construct a tag from its ID |
350
|
29
|
|
|
|
|
72
|
$self->{id} = uc $p{id}; |
351
|
29
|
|
|
|
|
134
|
$self->{id} =~ tr/0-9A-Z//cd; |
352
|
29
|
50
|
|
|
|
169
|
$self->{id} =~ /^[0-9A-F]+$/ |
353
|
|
|
|
|
|
|
or croak "RFID::EPC::Tag id format is invalid (must be a hex number)"; |
354
|
|
|
|
|
|
|
} |
355
|
|
|
|
|
|
|
elsif (defined($p{epc_type})) |
356
|
|
|
|
|
|
|
{ |
357
|
|
|
|
|
|
|
# Construct a tag from its components. |
358
|
29
|
|
|
|
|
93
|
_maketag($self,\%p); |
359
|
|
|
|
|
|
|
} |
360
|
|
|
|
|
|
|
else |
361
|
|
|
|
|
|
|
{ |
362
|
0
|
|
|
|
|
0
|
croak "Cannot create RFID::EPC::Tag with no id or parts"; |
363
|
|
|
|
|
|
|
} |
364
|
|
|
|
|
|
|
|
365
|
58
|
|
|
|
|
400
|
$self; |
366
|
|
|
|
|
|
|
} |
367
|
|
|
|
|
|
|
|
368
|
|
|
|
|
|
|
=head2 Methods |
369
|
|
|
|
|
|
|
|
370
|
|
|
|
|
|
|
The following methods are supported. In addition, |
371
|
|
|
|
|
|
|
L are inherited. |
372
|
|
|
|
|
|
|
|
373
|
|
|
|
|
|
|
=head3 get |
374
|
|
|
|
|
|
|
|
375
|
|
|
|
|
|
|
Get a property of this tag. In addition to the L
|
376
|
|
|
|
|
|
|
from RFID::Tag|RFID::Tag/Properties>, the following fields are |
377
|
|
|
|
|
|
|
supported. Note that whether a particular field is supported depends |
378
|
|
|
|
|
|
|
on the tag type. All fields are represented as hex strings. |
379
|
|
|
|
|
|
|
|
380
|
|
|
|
|
|
|
=over 4 |
381
|
|
|
|
|
|
|
|
382
|
|
|
|
|
|
|
=item epc_type |
383
|
|
|
|
|
|
|
|
384
|
|
|
|
|
|
|
The EPC type of this tag. |
385
|
|
|
|
|
|
|
|
386
|
|
|
|
|
|
|
=item epc_serial |
387
|
|
|
|
|
|
|
|
388
|
|
|
|
|
|
|
The EPC serial number of this tag. |
389
|
|
|
|
|
|
|
|
390
|
|
|
|
|
|
|
=item epc_manager |
391
|
|
|
|
|
|
|
|
392
|
|
|
|
|
|
|
The EPC manager number of this tag. |
393
|
|
|
|
|
|
|
|
394
|
|
|
|
|
|
|
=item epc_class |
395
|
|
|
|
|
|
|
|
396
|
|
|
|
|
|
|
The EPC class of this tag. |
397
|
|
|
|
|
|
|
|
398
|
|
|
|
|
|
|
=item epc_header |
399
|
|
|
|
|
|
|
|
400
|
|
|
|
|
|
|
The EPC header bits for this tag. |
401
|
|
|
|
|
|
|
|
402
|
|
|
|
|
|
|
=item epc_filter |
403
|
|
|
|
|
|
|
|
404
|
|
|
|
|
|
|
The EPC filter for this tag. |
405
|
|
|
|
|
|
|
|
406
|
|
|
|
|
|
|
=item epc_partition |
407
|
|
|
|
|
|
|
|
408
|
|
|
|
|
|
|
The EPC partition number for this tag. This field determines the size |
409
|
|
|
|
|
|
|
of later fields; see the EPC specification for more information. |
410
|
|
|
|
|
|
|
|
411
|
|
|
|
|
|
|
=item epc_item |
412
|
|
|
|
|
|
|
|
413
|
|
|
|
|
|
|
The EPC item number for this tag. |
414
|
|
|
|
|
|
|
|
415
|
|
|
|
|
|
|
=item epc_company |
416
|
|
|
|
|
|
|
|
417
|
|
|
|
|
|
|
The EPC company number for this tag. |
418
|
|
|
|
|
|
|
|
419
|
|
|
|
|
|
|
=item epc_asset_type |
420
|
|
|
|
|
|
|
|
421
|
|
|
|
|
|
|
The EPC asset type number for this tag. |
422
|
|
|
|
|
|
|
|
423
|
|
|
|
|
|
|
=item epc_location |
424
|
|
|
|
|
|
|
|
425
|
|
|
|
|
|
|
The EPC location number for this tag. |
426
|
|
|
|
|
|
|
|
427
|
|
|
|
|
|
|
=item epc_asset |
428
|
|
|
|
|
|
|
|
429
|
|
|
|
|
|
|
The EPC asset number for this tag. |
430
|
|
|
|
|
|
|
|
431
|
|
|
|
|
|
|
=item epc_unknown |
432
|
|
|
|
|
|
|
|
433
|
|
|
|
|
|
|
For tags of unrecognized type, all of the bytes that could not be |
434
|
|
|
|
|
|
|
parsed. |
435
|
|
|
|
|
|
|
|
436
|
|
|
|
|
|
|
=back |
437
|
|
|
|
|
|
|
|
438
|
|
|
|
|
|
|
=cut |
439
|
|
|
|
|
|
|
|
440
|
|
|
|
|
|
|
sub get |
441
|
|
|
|
|
|
|
{ |
442
|
29
|
|
|
29
|
1
|
46257
|
my $self = shift; |
443
|
29
|
|
|
|
|
182
|
my(@p)=@_; |
444
|
29
|
|
|
|
|
34
|
my(%ret); |
445
|
|
|
|
|
|
|
|
446
|
29
|
|
|
|
|
69
|
foreach my $p (@p) |
447
|
|
|
|
|
|
|
{ |
448
|
132
|
50
|
|
|
|
1411
|
if (lc $p eq 'type') |
|
|
50
|
|
|
|
|
|
449
|
|
|
|
|
|
|
{ |
450
|
0
|
|
|
|
|
0
|
$ret{$p} = TAGTYPE; |
451
|
|
|
|
|
|
|
} |
452
|
|
|
|
|
|
|
elsif ($p =~ /^epc_/) |
453
|
|
|
|
|
|
|
{ |
454
|
132
|
100
|
|
|
|
635
|
$self->{_epc_parsed} = $self->_epc_parse |
455
|
|
|
|
|
|
|
unless ($self->{_epc_parsed}); |
456
|
132
|
50
|
|
|
|
272
|
if ($p eq 'epc_all') |
457
|
|
|
|
|
|
|
{ |
458
|
0
|
|
|
|
|
0
|
$ret{$p} = { %{$self->{_epc_parsed}} } |
|
0
|
|
|
|
|
0
|
|
459
|
|
|
|
|
|
|
} |
460
|
|
|
|
|
|
|
else |
461
|
|
|
|
|
|
|
{ |
462
|
132
|
|
|
|
|
1279
|
$ret{$p}=$self->{_epc_parsed}{$p}; |
463
|
|
|
|
|
|
|
} |
464
|
|
|
|
|
|
|
} |
465
|
|
|
|
|
|
|
else |
466
|
|
|
|
|
|
|
{ |
467
|
0
|
|
|
|
|
0
|
$ret{$p} = $self->SUPER::get($p); |
468
|
|
|
|
|
|
|
} |
469
|
|
|
|
|
|
|
} |
470
|
|
|
|
|
|
|
|
471
|
29
|
50
|
|
|
|
65
|
if (wantarray) |
472
|
|
|
|
|
|
|
{ |
473
|
29
|
|
|
|
|
351
|
return %ret; |
474
|
|
|
|
|
|
|
} |
475
|
|
|
|
|
|
|
else |
476
|
|
|
|
|
|
|
{ |
477
|
|
|
|
|
|
|
# Return last value |
478
|
0
|
|
|
|
|
0
|
return $ret{$_[$#_]}; |
479
|
|
|
|
|
|
|
} |
480
|
|
|
|
|
|
|
|
481
|
|
|
|
|
|
|
} |
482
|
|
|
|
|
|
|
|
483
|
|
|
|
|
|
|
# Create a tag from its various components |
484
|
|
|
|
|
|
|
sub _maketag |
485
|
|
|
|
|
|
|
{ |
486
|
29
|
|
|
29
|
|
43
|
my($tag,$p)=@_; |
487
|
|
|
|
|
|
|
|
488
|
29
|
|
|
|
|
91
|
_packbits($tag,$p,$p->{epc_type}); |
489
|
29
|
|
|
|
|
51
|
$tag; |
490
|
|
|
|
|
|
|
} |
491
|
|
|
|
|
|
|
|
492
|
|
|
|
|
|
|
# Helper function for _maketag |
493
|
|
|
|
|
|
|
sub _packbits |
494
|
|
|
|
|
|
|
{ |
495
|
29
|
|
|
29
|
|
48
|
my($tag,$p,$type)=@_; |
496
|
29
|
50
|
|
|
|
137
|
my $spec = $TAGTYPES{$type} |
497
|
|
|
|
|
|
|
or die "Unknown tag type '$type'"; |
498
|
29
|
|
|
|
|
44
|
my $bits = ""; |
499
|
29
|
|
|
|
|
36
|
my %calc_fieldsize; |
500
|
|
|
|
|
|
|
|
501
|
|
|
|
|
|
|
# Create the header byte, with the bits right-justified in the |
502
|
|
|
|
|
|
|
# epc_header field, so they'll parse properly. |
503
|
29
|
50
|
|
|
|
503
|
$p->{epc_header} = sprintf "%x", $spec->{type_val} >> (8 - $spec->{fields}[1]) |
504
|
|
|
|
|
|
|
unless (defined($p->{epc_header})); |
505
|
|
|
|
|
|
|
|
506
|
|
|
|
|
|
|
# Now build the tag ID based on the specs. |
507
|
29
|
|
|
|
|
346
|
my @fields = @{$spec->{fields}}; |
|
29
|
|
|
|
|
413
|
|
508
|
29
|
|
|
|
|
86
|
while (@fields) |
509
|
|
|
|
|
|
|
{ |
510
|
134
|
|
|
|
|
186
|
my $field = shift @fields; |
511
|
134
|
|
|
|
|
164
|
my $numbits = shift @fields; |
512
|
|
|
|
|
|
|
|
513
|
|
|
|
|
|
|
# Get the value for this field in hex, then clean it up. |
514
|
134
|
100
|
|
|
|
456
|
my $fieldval = defined($p->{$field}) |
515
|
|
|
|
|
|
|
? uc $p->{$field} |
516
|
|
|
|
|
|
|
: ''; |
517
|
134
|
|
|
|
|
550
|
$fieldval =~ tr/0-9A-Z//cd; |
518
|
134
|
50
|
|
|
|
886
|
$fieldval =~ /^[0-9A-F]*$/ |
519
|
|
|
|
|
|
|
or croak "field '$field' must be in hex for tag type $tag->{epc_type}"; |
520
|
134
|
100
|
|
|
|
659
|
if (length($fieldval) % 2) |
521
|
|
|
|
|
|
|
{ |
522
|
74
|
|
|
|
|
481
|
$fieldval = "0".$fieldval; |
523
|
|
|
|
|
|
|
} |
524
|
|
|
|
|
|
|
|
525
|
|
|
|
|
|
|
# Deal with special cases |
526
|
134
|
100
|
|
|
|
835
|
if ($field eq 'epc_partition') |
|
|
100
|
|
|
|
|
|
|
|
100
|
|
|
|
|
|
527
|
|
|
|
|
|
|
{ |
528
|
|
|
|
|
|
|
# The epc_partition field is an index into an array of |
529
|
|
|
|
|
|
|
# sizes for fields that aren't yet defined (are set to ?) |
530
|
16
|
50
|
|
|
|
73
|
my $partlist = $spec->{partitions}[hex $fieldval] |
531
|
|
|
|
|
|
|
or die "Invalid EPC partition size\n"; |
532
|
16
|
|
|
|
|
92
|
foreach my $i (0..$#{$partlist}) |
|
16
|
|
|
|
|
309
|
|
533
|
|
|
|
|
|
|
{ |
534
|
32
|
|
|
|
|
116
|
$calc_fieldsize{$spec->{partition_fields}[$i]} = $partlist->[$i]; |
535
|
|
|
|
|
|
|
} |
536
|
|
|
|
|
|
|
} |
537
|
|
|
|
|
|
|
elsif ($numbits eq '?') |
538
|
|
|
|
|
|
|
{ |
539
|
|
|
|
|
|
|
# We should have already precalculated this from epc_partition |
540
|
32
|
50
|
|
|
|
90
|
$numbits = $calc_fieldsize{$field} |
541
|
|
|
|
|
|
|
or die "Couldn't figure out fieldsize for '$field'\n"; |
542
|
|
|
|
|
|
|
} |
543
|
|
|
|
|
|
|
elsif ($numbits eq '*') |
544
|
|
|
|
|
|
|
{ |
545
|
|
|
|
|
|
|
# Just use all of the bits available. |
546
|
|
|
|
|
|
|
# This is only used for the UNKNOWN type, where we don't |
547
|
|
|
|
|
|
|
# know the size and have to guess. |
548
|
3
|
|
|
|
|
6
|
$numbits = length($fieldval)*4; |
549
|
|
|
|
|
|
|
} |
550
|
|
|
|
|
|
|
|
551
|
|
|
|
|
|
|
# Convert into binary and append to current bits |
552
|
134
|
|
|
|
|
1058
|
my $fieldbits=substr(unpack("B*",pack("H*",$fieldval)),-$numbits); |
553
|
134
|
|
|
|
|
601
|
$bits .= "0" x ($numbits-length($fieldbits)) . $fieldbits; |
554
|
|
|
|
|
|
|
} |
555
|
|
|
|
|
|
|
# Convert bitstring into hex. |
556
|
29
|
|
|
|
|
196
|
$tag->{id} = unpack("H*",pack("B*",$bits)); |
557
|
|
|
|
|
|
|
} |
558
|
|
|
|
|
|
|
|
559
|
|
|
|
|
|
|
# Return a hash with the components of a tag's ID |
560
|
|
|
|
|
|
|
sub _epc_parse |
561
|
|
|
|
|
|
|
{ |
562
|
29
|
|
|
29
|
|
43
|
my $self = shift; |
563
|
29
|
|
|
|
|
161
|
my $id = $self->id; |
564
|
29
|
|
|
|
|
272
|
my $byte1 = hex substr($id,0,2); |
565
|
29
|
|
|
|
|
42
|
my $taglen; |
566
|
|
|
|
|
|
|
|
567
|
|
|
|
|
|
|
# Find the match for the header with the longest mask |
568
|
29
|
|
|
|
|
128
|
foreach my $name (@TAGSEARCH) |
569
|
|
|
|
|
|
|
{ |
570
|
232
|
|
|
|
|
379
|
my $spec = $TAGTYPES{$name}; |
571
|
232
|
|
|
|
|
272
|
my $mask; |
572
|
232
|
100
|
|
|
|
1043
|
if (!defined($mask=$spec->{type_mask})) |
573
|
|
|
|
|
|
|
{ |
574
|
16
|
|
|
|
|
46
|
$mask=$spec->{type_mask} = 2**($spec->{type_bits})-1 << (8 - $spec->{type_bits}); |
575
|
|
|
|
|
|
|
} |
576
|
232
|
100
|
|
|
|
1249
|
if (($byte1 & $mask) == ($spec->{type_val} & $mask)) |
577
|
|
|
|
|
|
|
{ |
578
|
29
|
|
|
|
|
77
|
return _splitbits($id,$name); |
579
|
|
|
|
|
|
|
} |
580
|
|
|
|
|
|
|
} |
581
|
|
|
|
|
|
|
|
582
|
|
|
|
|
|
|
# This should never happen, since the UNKNOWN tag type should |
583
|
|
|
|
|
|
|
# always match. |
584
|
0
|
|
|
|
|
0
|
die "Couldn't figure out tag type '$byte1'!\n"; |
585
|
|
|
|
|
|
|
} |
586
|
|
|
|
|
|
|
|
587
|
|
|
|
|
|
|
# Helper function for _epc_parse |
588
|
|
|
|
|
|
|
sub _splitbits |
589
|
|
|
|
|
|
|
{ |
590
|
29
|
|
|
29
|
|
110
|
my($hex,$name)=@_; |
591
|
29
|
50
|
|
|
|
146
|
my $spec = $TAGTYPES{$name} |
592
|
|
|
|
|
|
|
or die "Unknown tag type '$name'"; |
593
|
29
|
|
|
|
|
390
|
my %r = (epc_type => $name); |
594
|
29
|
|
|
|
|
31
|
my %calc_fieldsize; |
595
|
|
|
|
|
|
|
|
596
|
|
|
|
|
|
|
# Convert hex to a string of bits |
597
|
29
|
|
|
|
|
186
|
my $bits = unpack("B*",pack("H*",$hex)); |
598
|
|
|
|
|
|
|
|
599
|
|
|
|
|
|
|
# Now deconstruct the ID field-by-field. |
600
|
29
|
|
|
|
|
42
|
my @fields = @{$spec->{fields}}; |
|
29
|
|
|
|
|
131
|
|
601
|
29
|
|
|
|
|
88
|
while (@fields) |
602
|
|
|
|
|
|
|
{ |
603
|
134
|
|
|
|
|
189
|
my $field = shift @fields; |
604
|
134
|
|
|
|
|
164
|
my $numbits = shift @fields; |
605
|
|
|
|
|
|
|
|
606
|
134
|
100
|
|
|
|
732
|
if ($numbits eq '?') |
|
|
100
|
|
|
|
|
|
607
|
|
|
|
|
|
|
{ |
608
|
32
|
50
|
|
|
|
76
|
$numbits = $calc_fieldsize{$field} |
609
|
|
|
|
|
|
|
or die "Couldn't figure out fieldsize for '$field'\n"; |
610
|
|
|
|
|
|
|
} |
611
|
|
|
|
|
|
|
elsif ($numbits eq '*') |
612
|
|
|
|
|
|
|
{ |
613
|
3
|
|
|
|
|
5
|
$numbits = length($bits); |
614
|
|
|
|
|
|
|
} |
615
|
|
|
|
|
|
|
|
616
|
134
|
|
|
|
|
558
|
my $thesebits = substr($bits,0,$numbits,''); |
617
|
|
|
|
|
|
|
|
618
|
|
|
|
|
|
|
# Pad with 0's so that unpack can parse it properly. |
619
|
134
|
100
|
|
|
|
265
|
if ($numbits % 4) |
620
|
|
|
|
|
|
|
{ |
621
|
80
|
|
|
|
|
474
|
$thesebits = "0"x(4-$numbits%4) . $thesebits; |
622
|
|
|
|
|
|
|
} |
623
|
|
|
|
|
|
|
|
624
|
|
|
|
|
|
|
# Now convert the bits into hex |
625
|
134
|
|
|
|
|
1057
|
$r{$field} = unpack("H*",(pack("B*",$thesebits))); |
626
|
134
|
100
|
100
|
|
|
1376
|
if (($numbits % 8) and ($numbits % 8) <= 4) |
627
|
|
|
|
|
|
|
{ |
628
|
|
|
|
|
|
|
# Remove trailing zero. |
629
|
68
|
|
|
|
|
423
|
chop($r{$field}); |
630
|
|
|
|
|
|
|
} |
631
|
|
|
|
|
|
|
|
632
|
|
|
|
|
|
|
# Handle the special partition case, which determines the sizes |
633
|
|
|
|
|
|
|
# of later fields. |
634
|
134
|
100
|
|
|
|
802
|
if ($field eq 'epc_partition') |
635
|
|
|
|
|
|
|
{ |
636
|
16
|
|
|
|
|
37
|
my $partition = hex($r{$field}); |
637
|
16
|
50
|
|
|
|
52
|
my $partlist = $spec->{partitions}[$partition] |
638
|
|
|
|
|
|
|
or die "Invalid EPC partition size\n"; |
639
|
16
|
|
|
|
|
20
|
foreach my $i (0..$#{$partlist}) |
|
16
|
|
|
|
|
135
|
|
640
|
|
|
|
|
|
|
{ |
641
|
32
|
|
|
|
|
198
|
$calc_fieldsize{$spec->{partition_fields}[$i]} = $partlist->[$i]; |
642
|
|
|
|
|
|
|
} |
643
|
|
|
|
|
|
|
} |
644
|
|
|
|
|
|
|
|
645
|
|
|
|
|
|
|
} |
646
|
|
|
|
|
|
|
|
647
|
29
|
|
|
|
|
323
|
return \%r; |
648
|
|
|
|
|
|
|
} |
649
|
|
|
|
|
|
|
|
650
|
|
|
|
|
|
|
=head3 type |
651
|
|
|
|
|
|
|
|
652
|
|
|
|
|
|
|
This method returns the general type of this tag (always C). |
653
|
|
|
|
|
|
|
|
654
|
|
|
|
|
|
|
=cut |
655
|
|
|
|
|
|
|
|
656
|
|
|
|
|
|
|
sub type |
657
|
|
|
|
|
|
|
{ |
658
|
0
|
|
|
0
|
1
|
|
return TAGTYPE; |
659
|
|
|
|
|
|
|
} |
660
|
|
|
|
|
|
|
|
661
|
|
|
|
|
|
|
=head2 Tag Types |
662
|
|
|
|
|
|
|
|
663
|
|
|
|
|
|
|
The EPC Tag Data Standards document defines many specific types of EPC |
664
|
|
|
|
|
|
|
tags. We do our best to parse these out, and return the appropriate |
665
|
|
|
|
|
|
|
fields. This isn't very well tested, since we don't have access to a |
666
|
|
|
|
|
|
|
large number of different types of EPC tags, but it tries to follow |
667
|
|
|
|
|
|
|
the spec, and should be easy to correct if any errors are found. |
668
|
|
|
|
|
|
|
|
669
|
|
|
|
|
|
|
The purpose of the fields is beyond the scope of this document; we |
670
|
|
|
|
|
|
|
assume you know what the fields are for, and just want to know what |
671
|
|
|
|
|
|
|
names they are given in this code. Mostly that's because it took EPC |
672
|
|
|
|
|
|
|
78 pages to describe exactly what the tag types are, and I don't want |
673
|
|
|
|
|
|
|
to repeat that here. Look up the I document |
674
|
|
|
|
|
|
|
referenced at the top of this documentation for more information. |
675
|
|
|
|
|
|
|
|
676
|
|
|
|
|
|
|
=over 4 |
677
|
|
|
|
|
|
|
|
678
|
|
|
|
|
|
|
=item GIAI-64 |
679
|
|
|
|
|
|
|
|
680
|
|
|
|
|
|
|
64-bit Global Individual Asset Identifier. Fields are epc_header, |
681
|
|
|
|
|
|
|
epc_filter, epc_company, epc_asset. |
682
|
|
|
|
|
|
|
|
683
|
|
|
|
|
|
|
=item GIAI-96 |
684
|
|
|
|
|
|
|
|
685
|
|
|
|
|
|
|
96-bit Global Individual Asset Identifier. Fields are epc_header, |
686
|
|
|
|
|
|
|
epc_filter, epc_partition, epc_company, epc_asset. |
687
|
|
|
|
|
|
|
|
688
|
|
|
|
|
|
|
=item GID-96 |
689
|
|
|
|
|
|
|
|
690
|
|
|
|
|
|
|
96-bit General Identifier. Fields are epc_header, epc_manager, |
691
|
|
|
|
|
|
|
epc_class, epc_serial. |
692
|
|
|
|
|
|
|
|
693
|
|
|
|
|
|
|
=item GRAI-64 |
694
|
|
|
|
|
|
|
|
695
|
|
|
|
|
|
|
64-bit Global Returnable Asset Identifier. Fields are epc_header, |
696
|
|
|
|
|
|
|
epc_filter, epc_company, epc_asset_type, epc_serial. |
697
|
|
|
|
|
|
|
|
698
|
|
|
|
|
|
|
=item GRAI-96 |
699
|
|
|
|
|
|
|
|
700
|
|
|
|
|
|
|
96-bit Global Returnable Asset Identifier. Fields are epc_header, |
701
|
|
|
|
|
|
|
epc_filter, epc_partition, epc_company, epc_asset_type, epc_serial. |
702
|
|
|
|
|
|
|
|
703
|
|
|
|
|
|
|
=item SGLN-64 |
704
|
|
|
|
|
|
|
|
705
|
|
|
|
|
|
|
64-bit Serialized Global Location Number. Fields are epc_header, |
706
|
|
|
|
|
|
|
epc_filter, epc_company, epc_location, epc_serial. |
707
|
|
|
|
|
|
|
|
708
|
|
|
|
|
|
|
=item SGLN-96 |
709
|
|
|
|
|
|
|
|
710
|
|
|
|
|
|
|
96-bit Serialized Global Location Number. Fields are epc_header, |
711
|
|
|
|
|
|
|
epc_filter, epc_partition, epc_company, epc_location, epc_serial. |
712
|
|
|
|
|
|
|
|
713
|
|
|
|
|
|
|
=item SGTIN-64 |
714
|
|
|
|
|
|
|
|
715
|
|
|
|
|
|
|
64-bit Serialized Global Trade Identification Number. Fields are |
716
|
|
|
|
|
|
|
epc_header, epc_filter, epc_company, epc_item, epc_serial. |
717
|
|
|
|
|
|
|
|
718
|
|
|
|
|
|
|
=item SGTIN-96 |
719
|
|
|
|
|
|
|
|
720
|
|
|
|
|
|
|
96-bit Serialized Global Trade Identification Number. Fields are |
721
|
|
|
|
|
|
|
epc_header, epc_filter, epc_partition, epc_company, epc_item, |
722
|
|
|
|
|
|
|
epc_serial. |
723
|
|
|
|
|
|
|
|
724
|
|
|
|
|
|
|
=item SSCC-64 |
725
|
|
|
|
|
|
|
|
726
|
|
|
|
|
|
|
64-bit Serial Shipping Container Code. Fields are epc_header, |
727
|
|
|
|
|
|
|
epc_filter, epc_company, epc_serial. |
728
|
|
|
|
|
|
|
|
729
|
|
|
|
|
|
|
=item SSCC-96 |
730
|
|
|
|
|
|
|
|
731
|
|
|
|
|
|
|
96-bit Serial Shipping Container Code. Fields are epc_header, |
732
|
|
|
|
|
|
|
epc_filter, epc_partition, epc_company, epc_serial, epc_unallocated. |
733
|
|
|
|
|
|
|
|
734
|
|
|
|
|
|
|
=item UNKNOWNI-64 |
735
|
|
|
|
|
|
|
|
736
|
|
|
|
|
|
|
64-bit tag without any type recognized by this software, but with a |
737
|
|
|
|
|
|
|
header indicating it is 64 bits. Fields are epc_header and |
738
|
|
|
|
|
|
|
epc_unknown. |
739
|
|
|
|
|
|
|
|
740
|
|
|
|
|
|
|
=item UNKNOWN-96 |
741
|
|
|
|
|
|
|
|
742
|
|
|
|
|
|
|
96-bit tag without any type recognized by this software, but with a |
743
|
|
|
|
|
|
|
header indicating it is 96 bits. Fields are epc_header and |
744
|
|
|
|
|
|
|
epc_unknown. |
745
|
|
|
|
|
|
|
|
746
|
|
|
|
|
|
|
=item UNKNOWN |
747
|
|
|
|
|
|
|
|
748
|
|
|
|
|
|
|
Tag without any type recognized by this software, and with no |
749
|
|
|
|
|
|
|
indication of its size in the header. Fields are epc_header and |
750
|
|
|
|
|
|
|
epc_unknown. |
751
|
|
|
|
|
|
|
|
752
|
|
|
|
|
|
|
=back |
753
|
|
|
|
|
|
|
|
754
|
|
|
|
|
|
|
=head1 SEE ALSO |
755
|
|
|
|
|
|
|
|
756
|
|
|
|
|
|
|
L, L, |
757
|
|
|
|
|
|
|
L, |
758
|
|
|
|
|
|
|
L, The manual for your particular RFID |
759
|
|
|
|
|
|
|
reader. |
760
|
|
|
|
|
|
|
|
761
|
|
|
|
|
|
|
=head1 AUTHOR |
762
|
|
|
|
|
|
|
|
763
|
|
|
|
|
|
|
Scott Gifford Egifford@umich.eduE, Esgifford@suspectclass.comE |
764
|
|
|
|
|
|
|
|
765
|
|
|
|
|
|
|
Copyright (C) 2004 The Regents of the University of Michigan. |
766
|
|
|
|
|
|
|
|
767
|
|
|
|
|
|
|
See the file LICENSE included with the distribution for license |
768
|
|
|
|
|
|
|
information. |
769
|
|
|
|
|
|
|
|
770
|
|
|
|
|
|
|
=cut |
771
|
|
|
|
|
|
|
|
772
|
|
|
|
|
|
|
|
773
|
|
|
|
|
|
|
1; |