ruby-smpp 0.1.3 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +1 -0
- data/Rakefile +1 -1
- data/VERSION +1 -1
- data/lib/smpp.rb +1 -0
- data/lib/smpp/base.rb +5 -2
- data/lib/smpp/optional_parameter.rb +31 -0
- data/lib/smpp/pdu/base.rb +24 -5
- data/lib/smpp/pdu/submit_sm.rb +15 -3
- data/ruby-smpp.gemspec +9 -4
- data/test/optional_parameter_test.rb +30 -0
- data/test/submit_sm_test.rb +40 -0
- metadata +7 -2
data/.gitignore
CHANGED
data/Rakefile
CHANGED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.2.0
|
data/lib/smpp.rb
CHANGED
data/lib/smpp/base.rb
CHANGED
@@ -165,7 +165,10 @@ module Smpp
|
|
165
165
|
end
|
166
166
|
|
167
167
|
def hex_debug(data, prefix = "")
|
168
|
-
|
168
|
+
Base.hex_debug(data, prefix)
|
169
|
+
end
|
170
|
+
|
171
|
+
def Base.hex_debug(data, prefix = "")
|
169
172
|
logger.debug do
|
170
173
|
message = "Hex dump follows:\n"
|
171
174
|
hexdump(data).each_line do |line|
|
@@ -175,7 +178,7 @@ module Smpp
|
|
175
178
|
end
|
176
179
|
end
|
177
180
|
|
178
|
-
def hexdump(target)
|
181
|
+
def Base.hexdump(target)
|
179
182
|
width=16
|
180
183
|
group=2
|
181
184
|
|
@@ -0,0 +1,31 @@
|
|
1
|
+
class Smpp::OptionalParameter
|
2
|
+
|
3
|
+
attr_reader :tag, :value
|
4
|
+
|
5
|
+
def initialize(tag, value)
|
6
|
+
@tag = tag
|
7
|
+
@value = value
|
8
|
+
end
|
9
|
+
|
10
|
+
def [](symbol)
|
11
|
+
self.send symbol
|
12
|
+
end
|
13
|
+
|
14
|
+
#class methods
|
15
|
+
class << self
|
16
|
+
def from_wire_data(data)
|
17
|
+
|
18
|
+
return nil if data.nil?
|
19
|
+
tag, length, remaining_bytes = data.unpack('H4na*')
|
20
|
+
tag = tag.hex
|
21
|
+
|
22
|
+
raise "invalid data, cannot parse optional parameters" if tag == 0 or length.nil?
|
23
|
+
|
24
|
+
value = remaining_bytes.slice!(0...length)
|
25
|
+
|
26
|
+
return new(tag, value), remaining_bytes
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
data/lib/smpp/pdu/base.rb
CHANGED
@@ -98,11 +98,32 @@ module Smpp::Pdu
|
|
98
98
|
end
|
99
99
|
|
100
100
|
# return int as binary string of 4 octets
|
101
|
-
def fixed_int(value)
|
101
|
+
def Base.fixed_int(value)
|
102
102
|
arr = [value >> 24, value >> 16, value >> 8, value & 0xff]
|
103
103
|
arr.pack("cccc")
|
104
104
|
end
|
105
105
|
|
106
|
+
def fixed_int(value)
|
107
|
+
Base.fixed_int(value)
|
108
|
+
end
|
109
|
+
|
110
|
+
#expects a hash like {tag => Smpp::OptionalParameter}
|
111
|
+
def Base.optional_parameters_to_buffer(optionals)
|
112
|
+
output = ""
|
113
|
+
optionals.each do |tag, optional_param|
|
114
|
+
length = optional_param.value.length
|
115
|
+
buffer = []
|
116
|
+
buffer += [tag >> 8, tag & 0xff]
|
117
|
+
buffer += [length >> 8, length & 0xff]
|
118
|
+
output << buffer.pack('cccc') << optional_param.value
|
119
|
+
end
|
120
|
+
output
|
121
|
+
end
|
122
|
+
|
123
|
+
def optional_parameters_to_buffer(optionals)
|
124
|
+
Base.optional_parameters_to_buffer(optionals)
|
125
|
+
end
|
126
|
+
|
106
127
|
def next_sequence_number
|
107
128
|
Base.next_sequence_number
|
108
129
|
end
|
@@ -147,10 +168,8 @@ module Smpp::Pdu
|
|
147
168
|
optionals = {}
|
148
169
|
while not remaining_bytes.empty?
|
149
170
|
optional = {}
|
150
|
-
|
151
|
-
|
152
|
-
optional[:value] = remaining_bytes.slice!(0...optional[:length])
|
153
|
-
optionals[tag.hex] = optional
|
171
|
+
optional_parameter, remaining_bytes = Smpp::OptionalParameter.from_wire_data(remaining_bytes)
|
172
|
+
optionals[optional_parameter.tag] = optional_parameter
|
154
173
|
end
|
155
174
|
|
156
175
|
return optionals
|
data/lib/smpp/pdu/submit_sm.rb
CHANGED
@@ -4,7 +4,7 @@ class Smpp::Pdu::SubmitSm < Smpp::Pdu::Base
|
|
4
4
|
attr_reader :service_type, :source_addr_ton, :source_addr_npi, :source_addr, :dest_addr_ton, :dest_addr_npi,
|
5
5
|
:destination_addr, :esm_class, :protocol_id, :priority_flag, :schedule_delivery_time,
|
6
6
|
:validity_period, :registered_delivery, :replace_if_present_flag, :data_coding,
|
7
|
-
:sm_default_msg_id, :sm_length, :udh, :short_message
|
7
|
+
:sm_default_msg_id, :sm_length, :udh, :short_message, :optional_parameters
|
8
8
|
|
9
9
|
|
10
10
|
# Note: short_message (the SMS body) must be in iso-8859-1 format
|
@@ -33,11 +33,17 @@ class Smpp::Pdu::SubmitSm < Smpp::Pdu::Base
|
|
33
33
|
payload = @udh ? @udh + @short_message : @short_message
|
34
34
|
@sm_length = payload.length
|
35
35
|
|
36
|
+
@optional_parameters = options[:optional_parameters]
|
37
|
+
|
36
38
|
# craft the string/byte buffer
|
37
39
|
pdu_body = sprintf("%s\0%c%c%s\0%c%c%s\0%c%c%c%s\0%s\0%c%c%c%c%c%s", @service_type, @source_addr_ton, @source_addr_npi, @source_addr,
|
38
40
|
@dest_addr_ton, @dest_addr_npi, @destination_addr, @esm_class, @protocol_id, @priority_flag, @schedule_delivery_time, @validity_period,
|
39
41
|
@registered_delivery, @replace_if_present_flag, @data_coding, @sm_default_msg_id, @sm_length, payload)
|
40
42
|
|
43
|
+
if @optional_parameters
|
44
|
+
pdu_body << optional_parameters_to_buffer(@optional_parameters)
|
45
|
+
end
|
46
|
+
|
41
47
|
seq ||= next_sequence_number
|
42
48
|
|
43
49
|
super(SUBMIT_SM, 0, seq, pdu_body)
|
@@ -70,8 +76,14 @@ class Smpp::Pdu::SubmitSm < Smpp::Pdu::Base
|
|
70
76
|
options[:data_coding],
|
71
77
|
options[:sm_default_msg_id],
|
72
78
|
options[:sm_length],
|
73
|
-
|
74
|
-
|
79
|
+
remaining_bytes = body.unpack('Z*CCZ*CCZ*CCCZ*Z*CCCCCa*')
|
80
|
+
|
81
|
+
short_message = remaining_bytes.slice!(0...options[:sm_length])
|
82
|
+
|
83
|
+
#everything left in remaining_bytes is 3.4 optional parameters
|
84
|
+
options[:optional_parameters] = optional_parameters(remaining_bytes)
|
85
|
+
|
86
|
+
Smpp::Base.logger.debug "SubmitSM with source_addr=#{source_addr}, destination_addr=#{destination_addr}"
|
75
87
|
|
76
88
|
new(source_addr, destination_addr, short_message, options, seq)
|
77
89
|
end
|
data/ruby-smpp.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{ruby-smpp}
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "0.2.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Ray Krueger", "August Z. Flatby"]
|
12
|
-
s.date = %q{2010-02-
|
12
|
+
s.date = %q{2010-02-11}
|
13
13
|
s.description = %q{Ruby implementation of the SMPP protocol, based on EventMachine. SMPP is a protocol that allows ordinary people outside the mobile network to exchange SMS messages directly with mobile operators.}
|
14
14
|
s.email = %q{raykrueger@gmail.com}
|
15
15
|
s.extra_rdoc_files = [
|
@@ -31,6 +31,7 @@ Gem::Specification.new do |s|
|
|
31
31
|
"examples/sample_smsc.rb",
|
32
32
|
"lib/smpp.rb",
|
33
33
|
"lib/smpp/base.rb",
|
34
|
+
"lib/smpp/optional_parameter.rb",
|
34
35
|
"lib/smpp/pdu/base.rb",
|
35
36
|
"lib/smpp/pdu/bind_base.rb",
|
36
37
|
"lib/smpp/pdu/bind_resp_base.rb",
|
@@ -51,7 +52,9 @@ Gem::Specification.new do |s|
|
|
51
52
|
"lib/smpp/transceiver.rb",
|
52
53
|
"lib/sms.rb",
|
53
54
|
"ruby-smpp.gemspec",
|
54
|
-
"test/
|
55
|
+
"test/optional_parameter_test.rb",
|
56
|
+
"test/smpp_test.rb",
|
57
|
+
"test/submit_sm_test.rb"
|
55
58
|
]
|
56
59
|
s.homepage = %q{http://github.com/raykrueger/ruby-smpp}
|
57
60
|
s.rdoc_options = ["--charset=UTF-8"]
|
@@ -60,7 +63,9 @@ Gem::Specification.new do |s|
|
|
60
63
|
s.rubygems_version = %q{1.3.5}
|
61
64
|
s.summary = %q{Ruby implementation of the SMPP protocol, based on EventMachine.}
|
62
65
|
s.test_files = [
|
63
|
-
"test/
|
66
|
+
"test/optional_parameter_test.rb",
|
67
|
+
"test/smpp_test.rb",
|
68
|
+
"test/submit_sm_test.rb",
|
64
69
|
"examples/sample_gateway.rb",
|
65
70
|
"examples/sample_smsc.rb"
|
66
71
|
]
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'test/unit'
|
3
|
+
require 'smpp'
|
4
|
+
|
5
|
+
class OptionalParameterTest < Test::Unit::TestCase
|
6
|
+
include Smpp
|
7
|
+
|
8
|
+
def test_symbol_accessor
|
9
|
+
op = OptionalParameter.new(0x2150, "abcd")
|
10
|
+
assert_equal "abcd", op[:value]
|
11
|
+
assert_equal 0x2150, op[:tag]
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_bad_data_does_not_puke
|
15
|
+
assert_raise RuntimeError do
|
16
|
+
OptionalParameter.from_wire_data("")
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_from_wire_data
|
21
|
+
data = "\041\120\000\002\001\177"
|
22
|
+
op, remaining_data = OptionalParameter.from_wire_data(data)
|
23
|
+
assert_not_nil op, "op should not be nil"
|
24
|
+
assert_equal 0x2150, op.tag
|
25
|
+
assert_equal "\001\177", op.value
|
26
|
+
assert_equal "", remaining_data
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'test/unit'
|
3
|
+
require 'smpp'
|
4
|
+
|
5
|
+
class SubmitSmTest < Test::Unit::TestCase
|
6
|
+
|
7
|
+
def test_this_is_not_a_real_test
|
8
|
+
value = [383 >> 8, 383 & 0xff]
|
9
|
+
optionals = {0x2150 => Smpp::OptionalParameter.new(0x2150, value.pack('cc'))}
|
10
|
+
pdu = Smpp::Pdu::SubmitSm.new('12345', '54321', "Ba Ba Boosh", {:optional_parameters => optionals})
|
11
|
+
Smpp::Base.hex_debug(pdu.data)
|
12
|
+
puts "PDU DATA", pdu.data.inspect
|
13
|
+
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_fixnum_optional_parameter
|
17
|
+
value = [383 >> 8, 383 & 0xff]
|
18
|
+
optionals = {0x2150 => Smpp::OptionalParameter.new(0x2150, value.pack('cc'))}
|
19
|
+
|
20
|
+
pdu = Smpp::Pdu::SubmitSm.new('12345', '54321', "Ba Ba Boosh", {:optional_parameters => optionals})
|
21
|
+
pdu_from_wire = Smpp::Pdu::Base.create(pdu.data)
|
22
|
+
|
23
|
+
assert optional = pdu_from_wire.optional_parameters[0x2150]
|
24
|
+
|
25
|
+
optional_value = optional[:value].unpack('n')[0]
|
26
|
+
assert_equal 383, optional_value
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_string_optional_parameter
|
30
|
+
optionals = {0x2150 => Smpp::OptionalParameter.new(0x2150, "boosh")}
|
31
|
+
|
32
|
+
pdu = Smpp::Pdu::SubmitSm.new('12345', '54321', "Ba Ba Boosh", {:optional_parameters => optionals})
|
33
|
+
pdu_from_wire = Smpp::Pdu::Base.create(pdu.data)
|
34
|
+
|
35
|
+
assert optional = pdu_from_wire.optional_parameters[0x2150]
|
36
|
+
|
37
|
+
optional_value = optional[:value].unpack("A*")[0]
|
38
|
+
assert_equal 'boosh', optional_value
|
39
|
+
end
|
40
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby-smpp
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ray Krueger
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2010-02-
|
13
|
+
date: 2010-02-11 00:00:00 -06:00
|
14
14
|
default_executable:
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
@@ -47,6 +47,7 @@ files:
|
|
47
47
|
- examples/sample_smsc.rb
|
48
48
|
- lib/smpp.rb
|
49
49
|
- lib/smpp/base.rb
|
50
|
+
- lib/smpp/optional_parameter.rb
|
50
51
|
- lib/smpp/pdu/base.rb
|
51
52
|
- lib/smpp/pdu/bind_base.rb
|
52
53
|
- lib/smpp/pdu/bind_resp_base.rb
|
@@ -67,7 +68,9 @@ files:
|
|
67
68
|
- lib/smpp/transceiver.rb
|
68
69
|
- lib/sms.rb
|
69
70
|
- ruby-smpp.gemspec
|
71
|
+
- test/optional_parameter_test.rb
|
70
72
|
- test/smpp_test.rb
|
73
|
+
- test/submit_sm_test.rb
|
71
74
|
has_rdoc: true
|
72
75
|
homepage: http://github.com/raykrueger/ruby-smpp
|
73
76
|
licenses: []
|
@@ -97,6 +100,8 @@ signing_key:
|
|
97
100
|
specification_version: 3
|
98
101
|
summary: Ruby implementation of the SMPP protocol, based on EventMachine.
|
99
102
|
test_files:
|
103
|
+
- test/optional_parameter_test.rb
|
100
104
|
- test/smpp_test.rb
|
105
|
+
- test/submit_sm_test.rb
|
101
106
|
- examples/sample_gateway.rb
|
102
107
|
- examples/sample_smsc.rb
|