pdu_tools 0.0.3 → 0.0.4
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.
- checksums.yaml +4 -4
- data/lib/pdu_tools/decoder.rb +13 -5
- data/lib/pdu_tools/helpers.rb +28 -19
- data/lib/pdu_tools/message_part.rb +3 -0
- data/spec/decoder_spec.rb +9 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 564211a12edbbb42d58ae7a4967ac4c25878de32
|
4
|
+
data.tar.gz: b545e9753a5fa9b8a6202438871bec369eda7e78
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a6513a79545ecb47ca44a96c4674df0c31bbef3f7892709e3ad32f4b0f7e9989a2563ee8989212e535cf758bbbf16152c3f6ff87bba58e1fca0dd337703a2907
|
7
|
+
data.tar.gz: fd22e56c43f68f9b5e190542242aa1fe27e6d31fd8777d5d794551f1f26d19c6020bf0d0b41a23167a0555139f6b390c635a3ca93003eb694fb98f4c3cc9b433
|
data/lib/pdu_tools/decoder.rb
CHANGED
@@ -4,7 +4,7 @@ module PDUTools
|
|
4
4
|
include Helpers
|
5
5
|
# http://read.pudn.com/downloads150/sourcecode/embed/646395/Short%20Message%20in%20PDU%20Encoding.pdf
|
6
6
|
def initialize pdu_hex, direction=:sc_to_ms
|
7
|
-
@pdu_hex = pdu_hex
|
7
|
+
@pdu_hex = pdu_hex.dup
|
8
8
|
@direction = direction
|
9
9
|
end
|
10
10
|
|
@@ -18,6 +18,9 @@ module PDUTools
|
|
18
18
|
@message_reference = take(2) if @pdu_type[:mti] == :sms_submit
|
19
19
|
@address_length = take(2, :integer)
|
20
20
|
@address_type = parse_address_type take(2)
|
21
|
+
if [:national, :international].include? @address_type
|
22
|
+
@address_length = @address_length.odd? ? @address_length + 1 : @address_length # Always take byte aligned - hexdecimal F is added when odd number
|
23
|
+
end
|
21
24
|
@address = parse_address take(@address_length), @address_type, @address_length
|
22
25
|
@pid = take(2)
|
23
26
|
@data_coding_scheme = parse_data_coding_scheme take(2, :binary)
|
@@ -78,7 +81,7 @@ module PDUTools
|
|
78
81
|
|
79
82
|
def parse_address address, type, length
|
80
83
|
if type == :a7bit
|
81
|
-
address = decode7bit address
|
84
|
+
address = decode7bit address
|
82
85
|
else
|
83
86
|
address = swapped2normal address
|
84
87
|
if type == :international
|
@@ -149,6 +152,8 @@ module PDUTools
|
|
149
152
|
year, month, day, hour, minute, second, zone = swapped2normal(timestamp).split('').in_groups_of(2).collect(&:join)
|
150
153
|
d = "#{year}-#{month}-#{day} #{hour}:#{minute}:#{second} +%02d:00" % (zone.to_i / 4)
|
151
154
|
Time.parse(d)
|
155
|
+
rescue
|
156
|
+
binding.pry
|
152
157
|
end
|
153
158
|
|
154
159
|
def parse_validity_period period
|
@@ -165,6 +170,7 @@ module PDUTools
|
|
165
170
|
end
|
166
171
|
|
167
172
|
def parse_user_data data_length
|
173
|
+
@offset_7bit = 1
|
168
174
|
if @pdu_type[:udhi]
|
169
175
|
@udh_length = take(2, :integer) * 2
|
170
176
|
udh = take(@udh_length)
|
@@ -172,11 +178,11 @@ module PDUTools
|
|
172
178
|
end
|
173
179
|
case @data_coding_scheme[:alphabet]
|
174
180
|
when :a7bit
|
175
|
-
@message = decode7bit
|
181
|
+
@message = gsm0338_to_utf8 decode7bit(@pdu_hex, @offset_7bit)
|
176
182
|
when :a8bit
|
177
|
-
@message = decode8bit
|
183
|
+
@message = gsm0338_to_utf8 decode8bit(@pdu_hex, data_length)
|
178
184
|
when :a16bit
|
179
|
-
@message = decode16bit
|
185
|
+
@message = gsm0338_to_utf8 decode16bit(@pdu_hex, data_length)
|
180
186
|
end
|
181
187
|
end
|
182
188
|
|
@@ -186,8 +192,10 @@ module PDUTools
|
|
186
192
|
case iei
|
187
193
|
when "00"
|
188
194
|
reference = take 2, :integer, header
|
195
|
+
@offset_7bit = 0
|
189
196
|
when "08"
|
190
197
|
reference = take 4, :integer, header
|
198
|
+
@offset_7bit = 1
|
191
199
|
else
|
192
200
|
binding.pry
|
193
201
|
raise StandardError, "unsupported Information Element Identifier in User Data Header: #{iei}"
|
data/lib/pdu_tools/helpers.rb
CHANGED
@@ -22,6 +22,14 @@ module PDUTools
|
|
22
22
|
string
|
23
23
|
end
|
24
24
|
|
25
|
+
def gsm0338_to_utf8 string
|
26
|
+
GSM_03_38_ESCAPES.each do |replace, find|
|
27
|
+
string.gsub! find, replace
|
28
|
+
end
|
29
|
+
string
|
30
|
+
end
|
31
|
+
|
32
|
+
|
25
33
|
def dec2hexbyte dec
|
26
34
|
"%02X" % dec
|
27
35
|
end
|
@@ -65,33 +73,34 @@ module PDUTools
|
|
65
73
|
string.scan(/../).collect(&:reverse).join.gsub(/F$/,'')
|
66
74
|
end
|
67
75
|
|
68
|
-
|
69
|
-
|
70
|
-
# septets.collect do |s|
|
71
|
-
# s.to_i(2).chr
|
72
|
-
# end.join
|
73
|
-
# end
|
74
|
-
|
75
|
-
def decode7bit textdata, length
|
76
|
+
def decode7bit textdata, offset=1
|
77
|
+
ret = ""
|
76
78
|
bytes = []
|
77
79
|
textdata.split('').each_slice(2) do |s|
|
78
80
|
bytes << "%08b" % s.join.to_i(16)
|
79
81
|
end
|
80
|
-
|
81
|
-
|
82
|
+
|
83
|
+
cur_septet = ""
|
84
|
+
next_septet = ""
|
85
|
+
last_char = ""
|
86
|
+
|
82
87
|
bytes.each_with_index do |byte, index|
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
88
|
+
to_take = ([0,1].include? offset) ? 7 : 8-offset
|
89
|
+
cur_septet.prepend byte[offset, to_take]
|
90
|
+
next_septet = byte[0,offset] if offset > 0
|
91
|
+
ret << cur_septet.to_i(2).chr
|
92
|
+
|
93
|
+
if offset == 7
|
94
|
+
offset = 1
|
95
|
+
ret << next_septet.to_i(2).chr
|
96
|
+
cur_septet = ""
|
87
97
|
else
|
88
|
-
|
89
|
-
|
90
|
-
bit -= 1
|
98
|
+
offset += 1
|
99
|
+
cur_septet = next_septet
|
91
100
|
end
|
101
|
+
next_septet = nil
|
92
102
|
end
|
93
|
-
|
94
|
-
bytes.collect{|b| b.chr }.join
|
103
|
+
ret
|
95
104
|
end
|
96
105
|
|
97
106
|
def decode8bit data, length
|
@@ -1,6 +1,9 @@
|
|
1
1
|
module PDUTools
|
2
2
|
class MessagePart
|
3
3
|
attr_reader :address, :body, :timestamp, :validity_period, :user_data_header
|
4
|
+
attr_writer :body
|
5
|
+
attr_accessor :metadata
|
6
|
+
|
4
7
|
def initialize address, body, timestamp, validity_period, user_data_header
|
5
8
|
@address = address
|
6
9
|
@body = body
|
data/spec/decoder_spec.rb
CHANGED
@@ -42,4 +42,13 @@ describe PDUTools::Decoder do
|
|
42
42
|
end
|
43
43
|
end
|
44
44
|
|
45
|
+
context "Odd length of address" do
|
46
|
+
let(:pdu) { "079124915000303904038109F5000041019022257580A0A8D84B960259C3FAB23B0FD287D761BD3BBD6681DC6190353C07955BED709A0D2AAFDFEE771BE02ED3E7F0F0B8EC9AAF41D6701B247EB3C3207D78CE0EBBC3A032BBBCA6CBDFEEF4781D0699C36B7A5D1E06CDE1EC30DD1D06C966AE18CC2583C5682E1008040281402010080402814020100804028140201008040281402010080402814020100804028140" }
|
47
|
+
|
48
|
+
it do
|
49
|
+
message_part = decoder.decode
|
50
|
+
expect(message_part.address).to eq "905"
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
45
54
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pdu_tools
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Filip Zachar
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2014-10-
|
12
|
+
date: 2014-10-13 00:00:00 Z
|
13
13
|
dependencies: []
|
14
14
|
|
15
15
|
description: Tools for encoding and decoding GSM SMS PDUs.
|