pdu_sms 1.0.4 → 1.1.1
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 +5 -5
- data/lib/pdu_sms/data_coding_scheme.rb +1 -1
- data/lib/pdu_sms/helpers.rb +23 -0
- data/lib/pdu_sms/user_data.rb +59 -73
- data/lib/pdu_sms/version.rb +1 -1
- data/lib/pdu_sms.rb +3 -0
- metadata +3 -3
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
|
-
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
2
|
+
SHA256:
|
|
3
|
+
metadata.gz: 0b004f0aac97f63ae4f480ede59c3bb19f963f64f22676615e75aedd389e9415
|
|
4
|
+
data.tar.gz: 3a870a2ba498b2388e41ad6d99341da77d76a32510b234ca567f16fcb5f71f3b
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: '086a47442278f7511e434626227b2533e1d5a5f18b2d96bad89f193aaada6be63b23aa4458a8654a2baf3f3a39d43280f1c744ad35e7580c72f989b33ef219fc'
|
|
7
|
+
data.tar.gz: bd7755153864fb6d814a8ed073f6c303f774d3831395330e635ec63b0f464bf7f3266c8af4f8ae6035bf0eacc4a560a11f2c01b46ab03964c8140b36ae73d4e6
|
|
@@ -36,7 +36,7 @@ module PduSms
|
|
|
36
36
|
|
|
37
37
|
def DataCodingScheme.decode_sc(pdu_str)
|
|
38
38
|
pdu = '%08b' % DataCodingScheme.cut_off_pdu(pdu_str, :current, :sc).to_i(16)
|
|
39
|
-
message_class = (pdu[
|
|
39
|
+
message_class = (pdu[3].to_i == MESSAGE_CLASS_ON) ? pdu[6..7].to_i(2) : false
|
|
40
40
|
new(:decode_sc, compressed:pdu[2].to_i(2), message_class:message_class, alphabet:pdu[4..5].to_i(2)).freeze
|
|
41
41
|
end
|
|
42
42
|
|
data/lib/pdu_sms/helpers.rb
CHANGED
|
@@ -55,6 +55,28 @@ module PduSms
|
|
|
55
55
|
text
|
|
56
56
|
end
|
|
57
57
|
|
|
58
|
+
def self.decode_7bit_fill_bits(string, udhl)
|
|
59
|
+
message = ''
|
|
60
|
+
if udhl.to_i(16) == UDHL_SIZE_5
|
|
61
|
+
message << ("0%08b" % string[0..1].to_i(16))[0..-2].to_i(2).chr
|
|
62
|
+
message << self.decode_7bit(string[2..-1])
|
|
63
|
+
else
|
|
64
|
+
message << self.decode_7bit(string)
|
|
65
|
+
end
|
|
66
|
+
message
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def self.encode_7bit_fill_bits(string, udhl)
|
|
70
|
+
message = ''
|
|
71
|
+
if udhl.to_i(16) == UDHL_SIZE_5
|
|
72
|
+
message << '%02X' % ('%07b0' % string[0].ord).to_i(2)
|
|
73
|
+
message << self.encode_7bit(string[1..-1])
|
|
74
|
+
else
|
|
75
|
+
message << self.encode_7bit(string)
|
|
76
|
+
end
|
|
77
|
+
message
|
|
78
|
+
end
|
|
79
|
+
|
|
58
80
|
def self.encode_8bit(string)
|
|
59
81
|
string.chars.to_a.collect {|char| '%02X' % char.ord }.join
|
|
60
82
|
end
|
|
@@ -66,3 +88,4 @@ module PduSms
|
|
|
66
88
|
end
|
|
67
89
|
end
|
|
68
90
|
|
|
91
|
+
|
data/lib/pdu_sms/user_data.rb
CHANGED
|
@@ -3,13 +3,13 @@ module PduSms
|
|
|
3
3
|
|
|
4
4
|
def initialize(message, coding, ied1: false, ied2: false, ied3: false, udhl: false, iei: false, iedl: false)
|
|
5
5
|
@coding = _check_coding coding
|
|
6
|
-
@
|
|
7
|
-
@ied1 = _check_ied1 ied1, coding
|
|
6
|
+
@ied1 = _check_ied1 ied1
|
|
8
7
|
@ied2 = _check_ied2 ied2
|
|
9
8
|
@ied3 = _check_ied3 ied3
|
|
10
|
-
@udhl = udhl ? udhl : _check_udhl(
|
|
11
|
-
@iei = iei ? iei : _check_iei(
|
|
12
|
-
@iedl = iedl ? iedl : _check_iedl(
|
|
9
|
+
@udhl = udhl ? udhl : _check_udhl(ied1)
|
|
10
|
+
@iei = iei ? iei : _check_iei(ied1)
|
|
11
|
+
@iedl = iedl ? iedl : _check_iedl(ied1)
|
|
12
|
+
@message = _check_message message, coding, ied1
|
|
13
13
|
end
|
|
14
14
|
|
|
15
15
|
def UserData.encode_ms(message, coding=:auto)
|
|
@@ -18,21 +18,19 @@ module PduSms
|
|
|
18
18
|
if coding == ALPHABET_7BIT
|
|
19
19
|
if message.length > 160
|
|
20
20
|
message_array = message.scan(/.{1,152}/)
|
|
21
|
-
ied1 = rand(65536)
|
|
22
21
|
end
|
|
23
22
|
elsif coding == ALPHABET_8BIT
|
|
24
23
|
if message.length > 140
|
|
25
24
|
message_array = message.scan(/.{1,133}/)
|
|
26
|
-
ied1 = rand(65536)
|
|
27
25
|
end
|
|
28
26
|
elsif coding == ALPHABET_16BIT
|
|
29
27
|
if message.length > 70
|
|
30
28
|
message_array = message.scan(/.{1,67}/)
|
|
31
|
-
ied1 = rand(256)
|
|
32
29
|
end
|
|
33
30
|
else
|
|
34
31
|
raise ArgumentError, 'The "coding" is incorrect'
|
|
35
32
|
end
|
|
33
|
+
ied1 = '%02X' % rand(255)
|
|
36
34
|
message_array.collect.each_with_index do |mess, current_message|
|
|
37
35
|
if message_array.length > 1
|
|
38
36
|
new(mess, coding, ied1:ied1, ied2:message_array.length, ied3:current_message+1).freeze
|
|
@@ -47,7 +45,11 @@ module PduSms
|
|
|
47
45
|
dcs = DataCodingScheme.decode_ms(pdu_str)
|
|
48
46
|
if dcs.alphabet_7bit?
|
|
49
47
|
coding = dcs.get_alphabet.to_i(2)
|
|
50
|
-
|
|
48
|
+
if header.empty?
|
|
49
|
+
message = Helpers.decode_7bit(message)
|
|
50
|
+
else
|
|
51
|
+
message = Helpers.decode_7bit_fill_bits(message, header[0..1])
|
|
52
|
+
end
|
|
51
53
|
elsif dcs.alphabet_8bit?
|
|
52
54
|
coding = dcs.get_alphabet.to_i(2)
|
|
53
55
|
message = Helpers.decode_8bit(message)
|
|
@@ -60,10 +62,12 @@ module PduSms
|
|
|
60
62
|
if header.empty?
|
|
61
63
|
new(message, coding).freeze
|
|
62
64
|
else
|
|
63
|
-
if header[
|
|
64
|
-
new(message, coding, udhl: header[0..1].to_i(16), iei: header[2..3].to_i(16), iedl: header[4..5].to_i(16), ied1: header[6..9]
|
|
65
|
-
elsif header[
|
|
66
|
-
new(message, coding, udhl: header[0..1].to_i(16), iei: header[2..3].to_i(16), iedl: header[4..5].to_i(16), ied1: header[6..7]
|
|
65
|
+
if header[0..1].to_i(16) == UDHL_SIZE_6
|
|
66
|
+
new(message, coding, udhl: header[0..1].to_i(16), iei: header[2..3].to_i(16), iedl: header[4..5].to_i(16), ied1: header[6..9], ied2: header[10..11].to_i(16), ied3: header[12..13].to_i(16)).freeze
|
|
67
|
+
elsif header[0..1].to_i(16) == UDHL_SIZE_5
|
|
68
|
+
new(message, coding, udhl: header[0..1].to_i(16), iei: header[2..3].to_i(16), iedl: header[4..5].to_i(16), ied1: header[6..7], ied2: header[8..9].to_i(16), ied3: header[10..11].to_i(16)).freeze
|
|
69
|
+
else
|
|
70
|
+
new(message, coding).freeze
|
|
67
71
|
end
|
|
68
72
|
end
|
|
69
73
|
end
|
|
@@ -77,7 +81,11 @@ module PduSms
|
|
|
77
81
|
dcs = DataCodingScheme.decode_sc(pdu_str)
|
|
78
82
|
if dcs.alphabet_7bit?
|
|
79
83
|
coding = dcs.get_alphabet.to_i(2)
|
|
80
|
-
|
|
84
|
+
if header.empty?
|
|
85
|
+
message = Helpers.decode_7bit(message)
|
|
86
|
+
else
|
|
87
|
+
message = Helpers.decode_7bit_fill_bits(message, header[0..1])
|
|
88
|
+
end
|
|
81
89
|
elsif dcs.alphabet_8bit?
|
|
82
90
|
coding = dcs.get_alphabet.to_i(2)
|
|
83
91
|
message = Helpers.decode_8bit(message)
|
|
@@ -90,10 +98,12 @@ module PduSms
|
|
|
90
98
|
if header.empty?
|
|
91
99
|
new(message, coding).freeze
|
|
92
100
|
else
|
|
93
|
-
if header[
|
|
94
|
-
new(message, coding, udhl: header[0..1].to_i(16), iei: header[2..3].to_i(16), iedl: header[4..5].to_i(16), ied1: header[6..9]
|
|
95
|
-
elsif header[
|
|
96
|
-
new(message, coding, udhl: header[0..1].to_i(16), iei: header[2..3].to_i(16), iedl: header[4..5].to_i(16), ied1: header[6..7]
|
|
101
|
+
if header[0..1].to_i(16) == UDHL_SIZE_6
|
|
102
|
+
new(message, coding, udhl: header[0..1].to_i(16), iei: header[2..3].to_i(16), iedl: header[4..5].to_i(16), ied1: header[6..9], ied2: header[10..11].to_i(16), ied3: header[12..13].to_i(16)).freeze
|
|
103
|
+
elsif header[0..1].to_i(16) == UDHL_SIZE_5
|
|
104
|
+
new(message, coding, udhl: header[0..1].to_i(16), iei: header[2..3].to_i(16), iedl: header[4..5].to_i(16), ied1: header[6..7], ied2: header[8..9].to_i(16), ied3: header[10..11].to_i(16)).freeze
|
|
105
|
+
else
|
|
106
|
+
new(message, coding).freeze
|
|
97
107
|
end
|
|
98
108
|
end
|
|
99
109
|
end
|
|
@@ -138,12 +148,7 @@ module PduSms
|
|
|
138
148
|
|
|
139
149
|
def get_ied1
|
|
140
150
|
return '' unless @ied1
|
|
141
|
-
|
|
142
|
-
when ALPHABET_7BIT then '%04X' % @ied1
|
|
143
|
-
when ALPHABET_8BIT then '%04X' % @ied1
|
|
144
|
-
when ALPHABET_16BIT then '%02X' % @ied1
|
|
145
|
-
else raise 'unknown encoding'
|
|
146
|
-
end
|
|
151
|
+
@ied1
|
|
147
152
|
end
|
|
148
153
|
|
|
149
154
|
def get_ied2
|
|
@@ -172,13 +177,12 @@ module PduSms
|
|
|
172
177
|
end
|
|
173
178
|
|
|
174
179
|
def get_hex
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
Helpers.encode_ucs2(@message)
|
|
180
|
+
if @coding == ALPHABET_7BIT
|
|
181
|
+
message =Helpers.encode_7bit_fill_bits(@message, get_udhl)
|
|
182
|
+
elsif @coding == ALPHABET_8BIT
|
|
183
|
+
message =Helpers.encode_8bit(@message)
|
|
184
|
+
else
|
|
185
|
+
message =Helpers.encode_ucs2(@message)
|
|
182
186
|
end
|
|
183
187
|
'%s%s%s%s%s%s%s' % [get_udhl, get_iei, get_iedl, get_ied1, get_ied2, get_ied3, message]
|
|
184
188
|
end
|
|
@@ -205,18 +209,9 @@ module PduSms
|
|
|
205
209
|
coding
|
|
206
210
|
end
|
|
207
211
|
|
|
208
|
-
def _check_ied1(ied1
|
|
212
|
+
def _check_ied1(ied1)
|
|
209
213
|
return false unless ied1
|
|
210
|
-
|
|
211
|
-
when ALPHABET_7BIT
|
|
212
|
-
raise ArgumentError, 'The message is too long' unless (0..65535).include?(ied1)
|
|
213
|
-
when ALPHABET_8BIT
|
|
214
|
-
raise ArgumentError, 'The message is too long' unless (0..65535).include?(ied1)
|
|
215
|
-
when ALPHABET_16BIT
|
|
216
|
-
raise ArgumentError, 'The message is too long' unless (0..255).include?(ied1)
|
|
217
|
-
else
|
|
218
|
-
false
|
|
219
|
-
end
|
|
214
|
+
raise ArgumentError, 'The message is too long' unless (0..65535).include?(ied1.to_i(16))
|
|
220
215
|
ied1
|
|
221
216
|
end
|
|
222
217
|
|
|
@@ -230,47 +225,38 @@ module PduSms
|
|
|
230
225
|
ied3
|
|
231
226
|
end
|
|
232
227
|
|
|
233
|
-
def _check_udhl(
|
|
228
|
+
def _check_udhl(ied1)
|
|
234
229
|
return false unless ied1
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
0x05
|
|
242
|
-
else
|
|
243
|
-
false
|
|
230
|
+
if ied1.length == 2
|
|
231
|
+
UDHL_SIZE_5
|
|
232
|
+
elsif ied1.length == 4
|
|
233
|
+
UDHL_SIZE_6
|
|
234
|
+
else
|
|
235
|
+
false
|
|
244
236
|
end
|
|
245
237
|
end
|
|
246
238
|
|
|
247
|
-
def _check_iei(
|
|
239
|
+
def _check_iei(ied1)
|
|
248
240
|
return false unless ied1
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
0x00
|
|
256
|
-
else
|
|
257
|
-
false
|
|
241
|
+
if ied1.length == 2
|
|
242
|
+
0x00
|
|
243
|
+
elsif ied1.length == 4
|
|
244
|
+
0x08
|
|
245
|
+
else
|
|
246
|
+
false
|
|
258
247
|
end
|
|
259
248
|
end
|
|
260
249
|
|
|
261
|
-
def _check_iedl(
|
|
250
|
+
def _check_iedl(ied1)
|
|
262
251
|
return false unless ied1
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
0x03
|
|
270
|
-
else
|
|
271
|
-
false
|
|
252
|
+
if ied1.length == 2
|
|
253
|
+
0x03
|
|
254
|
+
elsif ied1.length == 4
|
|
255
|
+
0x04
|
|
256
|
+
else
|
|
257
|
+
false
|
|
272
258
|
end
|
|
273
259
|
end
|
|
274
260
|
|
|
275
261
|
end
|
|
276
|
-
end
|
|
262
|
+
end
|
data/lib/pdu_sms/version.rb
CHANGED
data/lib/pdu_sms.rb
CHANGED
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: pdu_sms
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.
|
|
4
|
+
version: 1.1.1
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Mikhail Stolyarov
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: exe
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
11
|
+
date: 2018-02-27 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: bundler
|
|
@@ -105,7 +105,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
105
105
|
version: '0'
|
|
106
106
|
requirements: []
|
|
107
107
|
rubyforge_project:
|
|
108
|
-
rubygems_version: 2.
|
|
108
|
+
rubygems_version: 2.7.6
|
|
109
109
|
signing_key:
|
|
110
110
|
specification_version: 4
|
|
111
111
|
summary: PDU SMS coding and decoding library
|