ruby-sml 0.2

Sign up to get free protection for your applications and to get access to all the features.
data/LICENSE ADDED
@@ -0,0 +1,24 @@
1
+ Copyright (c) 2011, Prof. MAAD
2
+ All rights reserved.
3
+
4
+ Redistribution and use in source and binary forms, with or without
5
+ modification, are permitted provided that the following conditions are met:
6
+ * Redistributions of source code must retain the above copyright
7
+ notice, this list of conditions and the following disclaimer.
8
+ * Redistributions in binary form must reproduce the above copyright
9
+ notice, this list of conditions and the following disclaimer in the
10
+ documentation and/or other materials provided with the distribution.
11
+ * Neither the name of the <organization> nor the
12
+ names of its contributors may be used to endorse or promote products
13
+ derived from this software without specific prior written permission.
14
+
15
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
16
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
17
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
18
+ DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
19
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
20
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
21
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
22
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
24
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
File without changes
@@ -0,0 +1,30 @@
1
+ $:.unshift File.dirname(__FILE__)
2
+
3
+ require 'ruby-sml/transport-binary'
4
+ require 'ruby-sml/encoding-binary'
5
+
6
+ require 'ruby-sml/sml-attention'
7
+ require 'ruby-sml/sml-file'
8
+ require 'ruby-sml/sml-getlist'
9
+ require 'ruby-sml/sml-getprocparameter'
10
+ require 'ruby-sml/sml-getprofilelist'
11
+ require 'ruby-sml/sml-getprofilepack'
12
+ require 'ruby-sml/sml-listentry'
13
+ require 'ruby-sml/sml-messagebody'
14
+ require 'ruby-sml/sml-message'
15
+ require 'ruby-sml/sml-periodentry'
16
+ require 'ruby-sml/sml-procparametervalue'
17
+ require 'ruby-sml/sml-profileobjectheaderentry'
18
+ require 'ruby-sml/sml-profileobjectperiodentry'
19
+ require 'ruby-sml/sml-publicclose'
20
+ require 'ruby-sml/sml-publicopen'
21
+ require 'ruby-sml/sml-setprocparameter'
22
+ require 'ruby-sml/sml-time'
23
+ require 'ruby-sml/sml-treepath'
24
+ require 'ruby-sml/sml-tree'
25
+ require 'ruby-sml/sml-tupelentry'
26
+ require 'ruby-sml/sml-valueentry'
27
+
28
+ require 'ruby-sml/units'
29
+ require 'ruby-sml/obis'
30
+ require 'ruby-sml/helpers'
@@ -0,0 +1,47 @@
1
+ # taken from http://www.hadermann.be/blog/32/ruby-crc16-implementation/
2
+
3
+ module CRC16
4
+
5
+ def self.crc16(buf, crc=0xffff)
6
+ buf.each_byte{|x| crc = (crc >> 8) ^ CCITT_16[(crc ^ x) & 0xff]}
7
+ return crc
8
+ end
9
+
10
+ private
11
+
12
+ CCITT_16 = [
13
+ 0x0000, 0x1189, 0x2312, 0x329b, 0x4624, 0x57ad, 0x6536, 0x74bf,
14
+ 0x8c48, 0x9dc1, 0xaf5a, 0xbed3, 0xca6c, 0xdbe5, 0xe97e, 0xf8f7,
15
+ 0x1081, 0x0108, 0x3393, 0x221a, 0x56a5, 0x472c, 0x75b7, 0x643e,
16
+ 0x9cc9, 0x8d40, 0xbfdb, 0xae52, 0xdaed, 0xcb64, 0xf9ff, 0xe876,
17
+ 0x2102, 0x308b, 0x0210, 0x1399, 0x6726, 0x76af, 0x4434, 0x55bd,
18
+ 0xad4a, 0xbcc3, 0x8e58, 0x9fd1, 0xeb6e, 0xfae7, 0xc87c, 0xd9f5,
19
+ 0x3183, 0x200a, 0x1291, 0x0318, 0x77a7, 0x662e, 0x54b5, 0x453c,
20
+ 0xbdcb, 0xac42, 0x9ed9, 0x8f50, 0xfbef, 0xea66, 0xd8fd, 0xc974,
21
+ 0x4204, 0x538d, 0x6116, 0x709f, 0x0420, 0x15a9, 0x2732, 0x36bb,
22
+ 0xce4c, 0xdfc5, 0xed5e, 0xfcd7, 0x8868, 0x99e1, 0xab7a, 0xbaf3,
23
+ 0x5285, 0x430c, 0x7197, 0x601e, 0x14a1, 0x0528, 0x37b3, 0x263a,
24
+ 0xdecd, 0xcf44, 0xfddf, 0xec56, 0x98e9, 0x8960, 0xbbfb, 0xaa72,
25
+ 0x6306, 0x728f, 0x4014, 0x519d, 0x2522, 0x34ab, 0x0630, 0x17b9,
26
+ 0xef4e, 0xfec7, 0xcc5c, 0xddd5, 0xa96a, 0xb8e3, 0x8a78, 0x9bf1,
27
+ 0x7387, 0x620e, 0x5095, 0x411c, 0x35a3, 0x242a, 0x16b1, 0x0738,
28
+ 0xffcf, 0xee46, 0xdcdd, 0xcd54, 0xb9eb, 0xa862, 0x9af9, 0x8b70,
29
+ 0x8408, 0x9581, 0xa71a, 0xb693, 0xc22c, 0xd3a5, 0xe13e, 0xf0b7,
30
+ 0x0840, 0x19c9, 0x2b52, 0x3adb, 0x4e64, 0x5fed, 0x6d76, 0x7cff,
31
+ 0x9489, 0x8500, 0xb79b, 0xa612, 0xd2ad, 0xc324, 0xf1bf, 0xe036,
32
+ 0x18c1, 0x0948, 0x3bd3, 0x2a5a, 0x5ee5, 0x4f6c, 0x7df7, 0x6c7e,
33
+ 0xa50a, 0xb483, 0x8618, 0x9791, 0xe32e, 0xf2a7, 0xc03c, 0xd1b5,
34
+ 0x2942, 0x38cb, 0x0a50, 0x1bd9, 0x6f66, 0x7eef, 0x4c74, 0x5dfd,
35
+ 0xb58b, 0xa402, 0x9699, 0x8710, 0xf3af, 0xe226, 0xd0bd, 0xc134,
36
+ 0x39c3, 0x284a, 0x1ad1, 0x0b58, 0x7fe7, 0x6e6e, 0x5cf5, 0x4d7c,
37
+ 0xc60c, 0xd785, 0xe51e, 0xf497, 0x8028, 0x91a1, 0xa33a, 0xb2b3,
38
+ 0x4a44, 0x5bcd, 0x6956, 0x78df, 0x0c60, 0x1de9, 0x2f72, 0x3efb,
39
+ 0xd68d, 0xc704, 0xf59f, 0xe416, 0x90a9, 0x8120, 0xb3bb, 0xa232,
40
+ 0x5ac5, 0x4b4c, 0x79d7, 0x685e, 0x1ce1, 0x0d68, 0x3ff3, 0x2e7a,
41
+ 0xe70e, 0xf687, 0xc41c, 0xd595, 0xa12a, 0xb0a3, 0x8238, 0x93b1,
42
+ 0x6b46, 0x7acf, 0x4854, 0x59dd, 0x2d62, 0x3ceb, 0x0e70, 0x1ff9,
43
+ 0xf78f, 0xe606, 0xd49d, 0xc514, 0xb1ab, 0xa022, 0x92b9, 0x8330,
44
+ 0x7bc7, 0x6a4e, 0x58d5, 0x495c, 0x3de3, 0x2c6a, 0x1ef1, 0x0f78
45
+ ]
46
+
47
+ end
@@ -0,0 +1,262 @@
1
+ module SML
2
+
3
+ class BinaryEncoding
4
+
5
+ def self.decode_file(file)
6
+ source = String.new(file)
7
+ sml_file = []
8
+ position = 0
9
+
10
+ list_length = []
11
+ list_depth = 0
12
+ parent = []
13
+ current_list = sml_file
14
+
15
+ while not source.empty?
16
+ type = nil
17
+ value = nil
18
+ header_length = 0
19
+ length = 0
20
+ tl_byte = source.slice!(0,1).unpack('C')[0]
21
+ break if tl_byte.nil?
22
+
23
+ # check for special cases
24
+ if tl_byte == 0x00
25
+ # puts "end of message"
26
+ # puts "--------------"
27
+ list_length = []
28
+ list_depth = 0
29
+
30
+ current_list << :end_of_message
31
+
32
+ current_list = sml_file
33
+ parent = []
34
+
35
+ next
36
+ end
37
+ if tl_byte == 0x01
38
+ # list_depth.times do print "\t" end
39
+ # puts "?"
40
+
41
+ current_list << nil
42
+
43
+ if not list_length.empty?
44
+ l = list_length.pop
45
+ l -= 1
46
+ list_length.push(l)
47
+ end
48
+ while list_length.last == 0
49
+ list_length.pop
50
+ list_depth -= 1
51
+ current_list = parent.pop
52
+ end
53
+
54
+ next
55
+ end
56
+
57
+ # parse tl field
58
+ type_bits = (tl_byte & 0b01110000) >> 4
59
+ case type_bits
60
+ when 0b000
61
+ type = :string
62
+ when 0b100
63
+ type = :bool
64
+ when 0b101
65
+ type = :signed
66
+ when 0b110
67
+ type = :unsigned
68
+ when 0b111
69
+ type = :list
70
+ else
71
+ type = nil
72
+ # puts "type: unknown (0b#{type_bits.to_s(2)})"
73
+ exit
74
+ end
75
+
76
+ list_depth.times do
77
+ # print "\t"
78
+ end
79
+
80
+ if not list_length.empty?
81
+ l = list_length.pop
82
+ l -= 1
83
+ list_length.push(l)
84
+ end
85
+
86
+ length = tl_byte & 0b00001111
87
+ header_length += 1
88
+ while (tl_byte & 0b10000000) != 0
89
+ length = length << 4
90
+ tl_byte = source.slice!(0,1).unpack('C')[0]
91
+ length |= (tl_byte & 0b00001111)
92
+ header_length += 1
93
+ end
94
+
95
+ length -= header_length unless type == :list
96
+
97
+ # we know what to expect, lets get it
98
+ case type
99
+ when :string
100
+ value = source.slice!(0,length)
101
+ # puts "string(#{length}): #{value}"
102
+ current_list << value
103
+ when :bool
104
+ value = source.slice!(0,1).unpack('C')[0]
105
+ if value == 0
106
+ value = false
107
+ else
108
+ value = true
109
+ end
110
+ # puts "bool: #{value}"
111
+ current_list << value << :bool
112
+ when :signed
113
+ value = 0
114
+ bytes_left = length
115
+ while bytes_left > 0
116
+ byte = source.slice!(0,1).unpack('C')[0]
117
+ value = value << 8
118
+ value |= byte
119
+ bytes_left -= 1
120
+ end
121
+ value = to_signed(value, length*8)
122
+ # puts "int#{length*8}: #{value}"
123
+ current_list << value << "int#{length*8}".to_sym
124
+ when :unsigned
125
+ value = 0
126
+ bytes_left = length
127
+ while bytes_left > 0
128
+ byte = source.slice!(0,1).unpack('C')[0]
129
+ value = value << 8
130
+ value |= byte
131
+ bytes_left -= 1
132
+ end
133
+ # puts "uint#{length*8}: #{value}"
134
+ current_list << value << "uint#{length*8}".to_sym
135
+ when :list
136
+ # puts "list: #{length} elements"
137
+ list_depth += 1
138
+ list_length.push(length)
139
+ new_list = []
140
+ current_list << new_list
141
+ parent.push(current_list)
142
+ current_list = new_list
143
+ end
144
+
145
+ while list_length.last == 0
146
+ list_length.pop
147
+ list_depth -= 1
148
+ current_list = parent.pop
149
+ end
150
+ end
151
+
152
+ return sml_file
153
+ end
154
+
155
+ def self.encode_file(file)
156
+ result = String.new
157
+
158
+ array_rep = Array.new(file)
159
+ array_rep.each do |message|
160
+ result << encode_value(message, :array) << 0x00
161
+ end
162
+
163
+ return result
164
+ end
165
+
166
+ def self.encode_value(value, type)
167
+ result = String.new
168
+
169
+ case type
170
+ when :array
171
+ entries_with_type = []
172
+ while not value.empty?
173
+ entry = value.shift
174
+ type = case entry
175
+ when Array
176
+ :array
177
+ when String
178
+ :string
179
+ when NilClass
180
+ :nil
181
+ when Fixnum
182
+ value.shift
183
+ end
184
+
185
+ entries_with_type << [entry, type]
186
+ end
187
+
188
+ tl_bytes = encode_length(entries_with_type.length, false)
189
+ tl_bytes[0] = 0b01110000 + tl_bytes[0]
190
+ tl_bytes.each do |byte|
191
+ result << byte
192
+ end
193
+ entries_with_type.each do |entry, type|
194
+ result << encode_value(entry,type)
195
+ end
196
+ when :string
197
+ tl_bytes = encode_length(value.length, true)
198
+ tl_bytes[0] = 0b00000000 + tl_bytes[0]
199
+ tl_bytes.each do |byte|
200
+ result << byte
201
+ end
202
+ result << value
203
+ when :int8
204
+ result << 0x52 << [value].pack('c')
205
+ when :int16
206
+ result << 0x53
207
+ result << [value].pack('s').reverse
208
+ when :int32
209
+ result << 0x55
210
+ result << [value].pack('l').reverse
211
+ when :int64
212
+ result << 0x59
213
+ result << [value].pack('q').reverse
214
+ when :uint8
215
+ result << 0x62 << [value].pack('C')
216
+ when :uint16
217
+ result << 0x63 << [value].pack('n')
218
+ when :uint32
219
+ result << 0x65 << [value].pack('N')
220
+ when :uint64
221
+ result << 0x69 << [value].pack('Q').reverse
222
+ when :bool
223
+ if value == 0
224
+ result << 0x42 << 0x00
225
+ else
226
+ result << 0x42 << 0x01
227
+ end
228
+ when :nil
229
+ result << 0x01
230
+ end
231
+
232
+ return result
233
+ end
234
+ def self.encode_length(length, include_header)
235
+ result = []
236
+
237
+ header_length = 1
238
+ while (length+(include_header ? header_length : 0)) >= 2**(4*header_length)
239
+ header_length += 1
240
+ end
241
+ total_length = length + (include_header ? header_length : 0)
242
+
243
+ while header_length > 0
244
+ mask = 0xf << (header_length-1)*4
245
+ if header_length > 1
246
+ result << (0b10000000 | ((total_length & mask) >> (header_length-1)*4))
247
+ else
248
+ result << ((total_length & mask) >> (header_length-1)*4)
249
+ end
250
+ header_length -= 1
251
+ end
252
+
253
+ return result
254
+ end
255
+
256
+ def self.to_signed(int, bits)
257
+ mask = (1 << (bits - 1))
258
+ return (int & ~mask) - (int & mask)
259
+ end
260
+
261
+ end
262
+ end
@@ -0,0 +1,58 @@
1
+ require 'ruby-sml/sml-listentry'
2
+ require 'ruby-sml/sml-periodentry'
3
+ require 'ruby-sml/sml-tree'
4
+
5
+ require 'ruby-sml/obis.rb'
6
+
7
+ module SML
8
+
9
+ module Helpers
10
+
11
+ def self.hex_to_s(hex)
12
+ result = ""
13
+ hex.each_byte do |byte|
14
+ result << byte.to_s(16) << ":"
15
+ end
16
+ result.slice!(-1)
17
+
18
+ return result
19
+ end
20
+
21
+ def self.print_entry(entry)
22
+ return unless (entry.class == SML::ListEntry or entry.class == SML::PeriodEntry)
23
+
24
+ name = entry.name
25
+ value = entry.value
26
+ scaler = entry.scaler
27
+ unit = entry.unit
28
+
29
+ name = SML::OBIS::resolve(name)
30
+ value = value * (10**entry.scaler) if ((value.class == Fixnum) and not (scaler.nil?))
31
+ value = value.to_f if (value.class == Fixnum)
32
+ unit = SML::Units[unit]["unit"] unless (unit.nil? or SML::Units[unit].nil?)
33
+
34
+ puts "#{name}: #{value} #{unit}"
35
+ end
36
+
37
+ def self.print_tree(tree)
38
+ return unless tree.class == SML::Tree
39
+ print_tree_internal(tree, 0)
40
+ end
41
+ def self.print_tree_internal(tree, level)
42
+ name = tree.parameter_name
43
+ name = SML::OBIS::resolve(name)
44
+
45
+ if level > 0
46
+ (level*4).times do print " " end
47
+ print "|-> " unless level == 0
48
+ end
49
+ puts "#{name} : #{tree.parameter_value}"
50
+
51
+ tree.child_list.each do |child|
52
+ print_tree_internal(child, level+1)
53
+ end
54
+ end
55
+
56
+ end
57
+
58
+ end
@@ -0,0 +1,5 @@
1
+ class NilClass
2
+ def to_a
3
+ return nil
4
+ end
5
+ end
@@ -0,0 +1,139 @@
1
+ require 'ruby-sml/helpers'
2
+
3
+ module SML
4
+
5
+ module OBIS
6
+
7
+ def self.resolve(obis)
8
+ if SML::OBIS::Lookup[obis].nil?
9
+ return SML::Helpers::hex_to_s(obis)
10
+ else
11
+ return SML::OBIS::Lookup[obis]
12
+ end
13
+ end
14
+
15
+ Lookup = {}
16
+
17
+ Lookup["\x81\x81\xc7\x82\x01\xff"] = "Device Properties Root"
18
+ Lookup["\x81\x81\xc7\x82\x02\xff"] = "Device Class"
19
+ Lookup["\x81\x81\xc7\x82\x03\xff"] = "Manufacturer"
20
+ Lookup["\x81\x81\xc7\x82\x05\xff"] = "Public Key"
21
+
22
+ Lookup["\x01\x00\x00\x00\x09\xff"] = "Device ID"
23
+ Lookup["\x01\x00\x00\x02\x00\xff"] = "Firmware Version"
24
+ Lookup["\x01\x00\x00\x02\x02\xff"] = "Control Program Nr"
25
+
26
+ Lookup["\x81\x81\xc7\x89\xe1\xff"] = "Event Log"
27
+ Lookup["\x81\x81\xc7\x89\xe2\xff"] = "Event ID"
28
+
29
+ Lookup["\x81\x81\xc7\x8c\x01\xff"] = "INFO interface active"
30
+ Lookup["\x81\x81\xc7\x8c\x02\xff"] = "EDL40 mode"
31
+ Lookup["\x81\x81\xc7\x8c\x03\xff"] = "Delete old usage values"
32
+ Lookup["\x81\x81\xc7\x8c\x04\xff"] = "Display old usage values"
33
+ Lookup["\x81\x81\xc7\x8c\x06\xff"] = "Display Text on INFO display"
34
+ Lookup["\x81\x81\xc7\x8c\x07\xff"] = "Displayed Tariff Registers Bitmask"
35
+ Lookup["\x81\x81\xc7\x8c\x08\xff"] = "Advanced Manufacturer Dataset on MSB"
36
+ Lookup["\x81\x81\xc7\x8c\x09\xff"] = "History Delete via Blinken- Interface enabled"
37
+ Lookup["\x81\x81\xc7\x8c\x0a\xff"] = "Display PIN Protected enabled"
38
+ Lookup["\x81\x81\xc7\x8c\x0b\xff"] = "Display PIN Code"
39
+ Lookup["\x81\x81\xc7\x8c\x0c\xff"] = "Number of Manipulation Attempts"
40
+ Lookup["\x81\x81\xc7\x8c\x0d\xff"] = "Automatic PIN Protected after Timeout enabled"
41
+
42
+ Lookup["\x01\x00\x01\x08\x00\xff"] = "Current Value - Overall Register"
43
+ Lookup["\x01\x00\x01\x08\x01\xff"] = "Current Value - Register Tariff 1"
44
+ Lookup["\x01\x00\x01\x08\x02\xff"] = "Current Value - Register Tariff 2"
45
+ Lookup["\x01\x00\x01\x11\x00\xff"] = "Last signed overall Register Value"
46
+ Lookup["\x01\x00\x0f\x07\x00\xff"] = "Current Meter Reading"
47
+
48
+ Lookup["\x01\x00\x01\x08\x00\x60"] = "Usage History - last Day"
49
+ Lookup["\x01\x00\x01\x08\x00\x61"] = "Usage History - last 7 Days"
50
+ Lookup["\x01\x00\x01\x08\x00\x62"] = "Usage History - last 30 Days"
51
+ Lookup["\x01\x00\x01\x08\x00\x63"] = "Usage History - last 365 Days"
52
+
53
+ Lookup["\x01\x00\x00\x09\x0b\x00"] = "Current Time"
54
+ Lookup["\x01\x00\x00\x09\x0b\x01"] = "Former Time"
55
+ Lookup["\x00\x00\x60\x08\x00\xff"] = "Seconds counter"
56
+ Lookup["\x81\x00\x00\x09\x0b\x01"] = "Timezone Offset"
57
+
58
+ Lookup["\x00\x00\x60\x0e\x00\xff"] = "Selected Tariff"
59
+
60
+ Lookup["\x81\x81\x27\x32\x07\x01"] = "Log Entry Period"
61
+
62
+ Lookup["\x81\x00\x60\x05\x00\x00"] = "Status word"
63
+
64
+ Lookup["\x81\x01\x00\x00\x01\x00"] = "Interface name"
65
+ Lookup["\x81\x03\x00\x00\x01\x00"] = "Interface name"
66
+
67
+ Lookup["\x81\x81\x81\x60\xff\xff"] = "Rights and Roles Root"
68
+ Lookup["\x81\x81\x81\x60\x01\xff"] = "Role"
69
+ Lookup["\x81\x81\x81\x60\x02\xff"] = "Role"
70
+ Lookup["\x81\x81\x81\x60\x03\xff"] = "Role"
71
+ Lookup["\x81\x81\x81\x60\x04\xff"] = "Role"
72
+ Lookup["\x81\x81\x81\x60\x05\xff"] = "Role"
73
+ Lookup["\x81\x81\x81\x60\x06\xff"] = "Role"
74
+ Lookup["\x81\x81\x81\x60\x07\xff"] = "Role"
75
+ Lookup["\x81\x81\x81\x60\x08\xff"] = "Role"
76
+ Lookup["\x81\x81\x81\x60\x01\x01"] = "Access Right" # actualle all of \x81\x81\x81\x60\x0[1-8]\x[01-fe]
77
+ Lookup["\x81\x81\x81\x61\xff\xff"] = "Username"
78
+ Lookup["\x81\x81\x81\x62\xff\xff"] = "Password"
79
+ Lookup["\x81\x81\x81\x63\xff\xff"] = "Public Key for User Access"
80
+ Lookup["\x81\x81\x81\x64\x01\x01"] = "ACL for Server ID" # actually all ending with \x01 to \xfe
81
+
82
+ Lookup["\x81\x02\x00\x07\x00\xff"] = "Enduser Interface Root"
83
+ Lookup["\x81\x02\x00\x07\x01\xff"] = "Enduser IP Acquisition Method"
84
+ Lookup["\x81\x02\x17\x07\x00\x01"] = "Enduser manually assigned IP Address"
85
+ Lookup["\x81\x02\x17\x07\x01\x01"] = "Enduser manually assigned Network Mask"
86
+ Lookup["\x81\x02\x00\x07\x02\xff"] = "Enduser DHCP Server active"
87
+ Lookup["\x81\x02\x00\x07\x02\x01"] = "Enduser DHCP Local Netmask"
88
+ Lookup["\x81\x02\x00\x07\x02\x02"] = "Enduser DHCP Default Gateway"
89
+ Lookup["\x81\x02\x00\x07\x02\x03"] = "Enduser DHCP DNS Server"
90
+ Lookup["\x81\x02\x00\x07\x02\x04"] = "Enduser DHCP IP Pool Start"
91
+ Lookup["\x81\x02\x00\x07\x02\x05"] = "Enduser DHCP IP Pool End"
92
+ Lookup["\x81\x02\x00\x07\x10\xff"] = "Enduser Interface Status Root"
93
+ Lookup["\x81\x02\x17\x07\x00\x00"] = "Enduser Current IP Address"
94
+
95
+ Lookup["\x81\x04\x00\x06\x00\xff"] = "WAN Interface Status Root"
96
+ Lookup["\x81\x04\x00\x00\x01\x00"] = "WAN Interface Name"
97
+ Lookup["\x81\x04\x00\x02\x00\x00"] = "WAN Interface Firmware Version"
98
+ Lookup["\x81\x04\x00\x07\x00\xff"] = "WAN Interface Parameter Root"
99
+ Lookup["\x81\x04\x27\x32\x03\x01"] = "WAN Interface automatic Reboot"
100
+ Lookup["\x81\x42\x64\x3c\x01\x01"] = "WAN Interface Max. Inter Message Timeout"
101
+ Lookup["\x81\x42\x64\x3c\x01\x02"] = "WAN Interface Max. Timeout from Close-Request to Open-Response"
102
+
103
+ Lookup["\x81\x04\x02\x07\x00\xff"] = "GSM Parameter Root"
104
+ Lookup["\x81\x04\x00\x32\x01\x01"] = "GSM SIM PIN"
105
+ Lookup["\x81\x04\x00\x32\x04\x01"] = "GSM Provider Selection Method"
106
+ Lookup["\x81\x04\x00\x32\x08\x01"] = "GSM Bearer Service Type"
107
+ Lookup["\x81\x04\x00\x32\x09\x01"] = "GSM Quality of Service"
108
+ Lookup["\x81\x04\x27\x32\x01\x01"] = "GSM Max. Connection Length"
109
+ Lookup["\x81\x04\x27\x32\x02\x01"] = "GSM Connection Idle Time"
110
+ Lookup["\x81\x04\x31\x32\x01\x01"] = "GSM Number of Rings until Call pickup"
111
+
112
+ Lookup["\x81\x49\x0d\x06\x00\xff"] = "IPT Status Root"
113
+ Lookup["\x81\x49\x17\x07\x00\x00"] = "IPT Current Master Target IP Address"
114
+ Lookup["\x81\x49\x1a\x07\x00\x00"] = "IPT Current Master Target Port"
115
+ Lookup["\x81\x49\x19\x07\x00\x00"] = "IPT Current Master Source Port"
116
+ Lookup["\x81\x49\x0d\x07\x00\xff"] = "IPT Parameter Root"
117
+ Lookup["\x81\x49\x0d\x07\x00\x01"] = "IPT Primary Master Root"
118
+ Lookup["\x81\x49\x17\x07\x00\x01"] = "IPT Primary Master Target IP Address"
119
+ Lookup["\x81\x49\x1a\x07\x00\x01"] = "IPT Primary Master Target Port"
120
+ Lookup["\x81\x49\x19\x07\x00\x01"] = "IPT Primary Master Source Port"
121
+ Lookup["\x81\x49\x63\x3c\x01\x01"] = "IPT Primary Master Username"
122
+ Lookup["\x81\x49\x63\x3c\x02\x01"] = "IPT Primary Master Password"
123
+ Lookup["\x81\x49\x0d\x07\x00\x02"] = "IPT Secondary Master Root"
124
+ Lookup["\x81\x49\x17\x07\x00\x02"] = "IPT Secondary Master Target IP Address"
125
+ Lookup["\x81\x49\x1a\x07\x00\x02"] = "IPT Secondary Master Target Port"
126
+ Lookup["\x81\x49\x19\x07\x00\x02"] = "IPT Secondary Master Source Port"
127
+ Lookup["\x81\x49\x63\x3c\x01\x02"] = "IPT Secondary Master Username"
128
+ Lookup["\x81\x49\x63\x3c\x02\x02"] = "IPT Secondary Master Password"
129
+ Lookup["\x81\x48\x27\x32\x06\x01"] = "IPT Connection Retry Timeout"
130
+ Lookup["\x81\x48\x31\x32\x02\x01"] = "IPT Max. Connection Retries"
131
+
132
+ Lookup["\x81\x04\x00\x33\x01\xff"] = "AT-Hayes-Strings Root"
133
+ Lookup["\x81\x04\x00\x33\x01\x01"] = "AT-Hayes-String after Modem Power-On, before PIN-Entry"
134
+ Lookup["\x81\x04\x00\x33\x02\x01"] = "AT-Hayes-String after PIN-Entry"
135
+ Lookup["\x81\x04\x00\x33\x03\x01"] = "AT-Hayes-String GPRS Initialization"
136
+
137
+ end
138
+
139
+ end