Class: Smpp::Pdu::SubmitSm

Inherits:
Base
  • Object
show all
Defined in:
lib/smpp/pdu/submit_sm.rb

Overview

Sending an MT message

Constant Summary

Constants inherited from Base

Base::BIND_RECEIVER, Base::BIND_RECEIVER_RESP, Base::BIND_TRANSCEIVER, Base::BIND_TRANSCEIVER_RESP, Base::BIND_TRANSMITTER, Base::BIND_TRANSMITTER_RESP, Base::CANCEL_SM, Base::CANCEL_SM_RESP, Base::DELIVER_SM, Base::DELIVER_SM_RESP, Base::ENQUIRE_LINK, Base::ENQUIRE_LINK_RESP, Base::ESME_RALYBND, Base::ESME_RBINDFAIL, Base::ESME_RCANCELFAIL, Base::ESME_RCNTSUBDL, Base::ESME_RINVBNDSTS, Base::ESME_RINVCMDID, Base::ESME_RINVCMDLEN, Base::ESME_RINVDESTFLAG, Base::ESME_RINVDLNAME, Base::ESME_RINVDSTADR, Base::ESME_RINVDSTNPI, Base::ESME_RINVDSTTON, Base::ESME_RINVESMCLASS, Base::ESME_RINVMSGID, Base::ESME_RINVMSGLEN, Base::ESME_RINVNUMDESTS, Base::ESME_RINVNUMMSGS, Base::ESME_RINVPASWD, Base::ESME_RINVPRTFLG, Base::ESME_RINVREGDLVFLG, Base::ESME_RINVREPFLAG, Base::ESME_RINVSERTYP, Base::ESME_RINVSRCADR, Base::ESME_RINVSRCNPI, Base::ESME_RINVSRCTON, Base::ESME_RINVSUBREP, Base::ESME_RINVSYSID, Base::ESME_RINVSYSTYP, Base::ESME_RMSGQFUL, Base::ESME_ROK, Base::ESME_RREPLACEFAIL, Base::ESME_RSUBMITFAIL, Base::ESME_RSYSERR, Base::ESME_RTHROTTLED, Base::ESME_RX_T_APPN, Base::GENERIC_NACK, Base::OPTIONAL_MESSAGE_STATE, Base::OPTIONAL_RECEIPTED_MESSAGE_ID, Base::PROTOCOL_VERSION, Base::QUERY_SM, Base::QUERY_SM_RESP, Base::REPLACE_SM, Base::REPLACE_SM_RESP, Base::SEQUENCE_MAX, Base::SUBMIT_MULTI, Base::SUBMIT_MULTI_RESP, Base::SUBMIT_SM, Base::SUBMIT_SM_RESP, Base::UNBIND, Base::UNBIND_RESP

Instance Attribute Summary collapse

Attributes inherited from Base

#body, #command_id, #command_status, #data, #sequence_number

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from Base

create, fixed_int, #fixed_int, handles_cmd, #logger, #next_sequence_number, next_sequence_number, optional_parameters_to_buffer, #optional_parameters_to_buffer, parse_optional_parameters

Constructor Details

#initialize(source_addr, destination_addr, short_message, options = {}, seq = nil) ⇒ SubmitSm

Note: short_message (the SMS body) must be in iso-8859-1 format



11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# File 'lib/smpp/pdu/submit_sm.rb', line 11

def initialize(source_addr, destination_addr, short_message, options={}, seq = nil)
   
  @msg_body = short_message
  @source_options = options
  
  @udh = options[:udh]      
  @service_type            = options[:service_type]? options[:service_type] :''
  @source_addr_ton         = options[:source_addr_ton]?options[:source_addr_ton]:0 # network specific
  @source_addr_npi         = options[:source_addr_npi]?options[:source_addr_npi]:1 # unknown
  @source_addr             = source_addr
  @dest_addr_ton           = options[:dest_addr_ton]?options[:dest_addr_ton]:1 # international
  @dest_addr_npi           = options[:dest_addr_npi]?options[:dest_addr_npi]:1 # unknown 
  @destination_addr        = destination_addr
  @esm_class               = options[:esm_class]?options[:esm_class]:0 # default smsc mode
  @protocol_id             = options[:protocol_id]?options[:protocol_id]:0
  @priority_flag           = options[:priority_flag]?options[:priority_flag]:0
  @schedule_delivery_time  = options[:schedule_delivery_time]?options[:schedule_delivery_time]:''
  @validity_period         = options[:validity_period]?options[:validity_period]:''
  @registered_delivery     = options[:registered_delivery]?options[:registered_delivery]:1 # we want delivery notifications
  @replace_if_present_flag = options[:replace_if_present_flag]?options[:replace_if_present_flag]:0
  @data_coding             = options[:data_coding]?options[:data_coding]:3 # iso-8859-1
  @sm_default_msg_id       = options[:sm_default_msg_id]?options[:sm_default_msg_id]:0
  @short_message           = short_message
  payload                  = @udh ? @udh + @short_message : @short_message 
  @sm_length               = payload.length
  
  @optional_parameters     = options[:optional_parameters]
  
  # craft the string/byte buffer
  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,
  @dest_addr_ton, @dest_addr_npi, @destination_addr, @esm_class, @protocol_id, @priority_flag, @schedule_delivery_time, @validity_period,
  @registered_delivery, @replace_if_present_flag, @data_coding, @sm_default_msg_id, @sm_length, payload.force_encoding('US-ASCII')).force_encoding('binary')

  if @optional_parameters
    pdu_body << optional_parameters_to_buffer(@optional_parameters)
  end

  seq ||= next_sequence_number

  super(SUBMIT_SM, 0, seq, pdu_body)        
end

Instance Attribute Details

#data_codingObject (readonly)

Returns the value of attribute data_coding.



4
5
6
# File 'lib/smpp/pdu/submit_sm.rb', line 4

def data_coding
  @data_coding
end

#dest_addr_npiObject (readonly)

Returns the value of attribute dest_addr_npi.



4
5
6
# File 'lib/smpp/pdu/submit_sm.rb', line 4

def dest_addr_npi
  @dest_addr_npi
end

#dest_addr_tonObject (readonly)

Returns the value of attribute dest_addr_ton.



4
5
6
# File 'lib/smpp/pdu/submit_sm.rb', line 4

def dest_addr_ton
  @dest_addr_ton
end

#destination_addrObject (readonly)

Returns the value of attribute destination_addr.



4
5
6
# File 'lib/smpp/pdu/submit_sm.rb', line 4

def destination_addr
  @destination_addr
end

#esm_classObject (readonly)

Returns the value of attribute esm_class.



4
5
6
# File 'lib/smpp/pdu/submit_sm.rb', line 4

def esm_class
  @esm_class
end

#optional_parametersObject (readonly)

Returns the value of attribute optional_parameters.



4
5
6
# File 'lib/smpp/pdu/submit_sm.rb', line 4

def optional_parameters
  @optional_parameters
end

#priority_flagObject (readonly)

Returns the value of attribute priority_flag.



4
5
6
# File 'lib/smpp/pdu/submit_sm.rb', line 4

def priority_flag
  @priority_flag
end

#protocol_idObject (readonly)

Returns the value of attribute protocol_id.



4
5
6
# File 'lib/smpp/pdu/submit_sm.rb', line 4

def protocol_id
  @protocol_id
end

#registered_deliveryObject (readonly)

Returns the value of attribute registered_delivery.



4
5
6
# File 'lib/smpp/pdu/submit_sm.rb', line 4

def registered_delivery
  @registered_delivery
end

#replace_if_present_flagObject (readonly)

Returns the value of attribute replace_if_present_flag.



4
5
6
# File 'lib/smpp/pdu/submit_sm.rb', line 4

def replace_if_present_flag
  @replace_if_present_flag
end

#schedule_delivery_timeObject (readonly)

Returns the value of attribute schedule_delivery_time.



4
5
6
# File 'lib/smpp/pdu/submit_sm.rb', line 4

def schedule_delivery_time
  @schedule_delivery_time
end

#service_typeObject (readonly)

Returns the value of attribute service_type.



4
5
6
# File 'lib/smpp/pdu/submit_sm.rb', line 4

def service_type
  @service_type
end

#short_messageObject (readonly)

Returns the value of attribute short_message.



4
5
6
# File 'lib/smpp/pdu/submit_sm.rb', line 4

def short_message
  @short_message
end

#sm_default_msg_idObject (readonly)

Returns the value of attribute sm_default_msg_id.



4
5
6
# File 'lib/smpp/pdu/submit_sm.rb', line 4

def sm_default_msg_id
  @sm_default_msg_id
end

#sm_lengthObject (readonly)

Returns the value of attribute sm_length.



4
5
6
# File 'lib/smpp/pdu/submit_sm.rb', line 4

def sm_length
  @sm_length
end

#source_addrObject (readonly)

Returns the value of attribute source_addr.



4
5
6
# File 'lib/smpp/pdu/submit_sm.rb', line 4

def source_addr
  @source_addr
end

#source_addr_npiObject (readonly)

Returns the value of attribute source_addr_npi.



4
5
6
# File 'lib/smpp/pdu/submit_sm.rb', line 4

def source_addr_npi
  @source_addr_npi
end

#source_addr_tonObject (readonly)

Returns the value of attribute source_addr_ton.



4
5
6
# File 'lib/smpp/pdu/submit_sm.rb', line 4

def source_addr_ton
  @source_addr_ton
end

#source_optionsObject (readonly)

Returns the value of attribute source_options.



4
5
6
# File 'lib/smpp/pdu/submit_sm.rb', line 4

def source_options
  @source_options
end

#udhObject (readonly)

Returns the value of attribute udh.



4
5
6
# File 'lib/smpp/pdu/submit_sm.rb', line 4

def udh
  @udh
end

#validity_periodObject (readonly)

Returns the value of attribute validity_period.



4
5
6
# File 'lib/smpp/pdu/submit_sm.rb', line 4

def validity_period
  @validity_period
end

Class Method Details

.from_wire_data(seq, status, body) ⇒ Object



60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
# File 'lib/smpp/pdu/submit_sm.rb', line 60

def self.from_wire_data(seq, status, body)
  options = {}

  options[:service_type], 
  options[:source_addr_ton], 
  options[:source_addr_npi], 
  source_addr, 
  options[:dest_addr_ton], 
  options[:dest_addr_npi], 
  destination_addr, 
  options[:esm_class], 
  options[:protocol_id],
  options[:priority_flag], 
  options[:schedule_delivery_time], 
  options[:validity_period], 
  options[:registered_delivery], 
  options[:replace_if_present_flag], 
  options[:data_coding], 
  options[:sm_default_msg_id],
  options[:sm_length], 
  remaining_bytes = body.unpack('Z*CCZ*CCZ*CCCZ*Z*CCCCCa*')

  short_message = remaining_bytes.slice!(0...options[:sm_length])

  #everything left in remaining_bytes is 3.4 optional parameters
  options[:optional_parameters] = parse_optional_parameters(remaining_bytes)

  Smpp::Base.logger.debug "SubmitSM with source_addr=#{source_addr}, destination_addr=#{destination_addr}"

  new(source_addr, destination_addr, short_message, options, seq) 
end

Instance Method Details

#to_humanObject

some special formatting is needed for SubmitSm PDUs to show the actual message content



54
55
56
57
58
# File 'lib/smpp/pdu/submit_sm.rb', line 54

def to_human
  # convert header (4 bytes) to array of 4-byte ints
  a = @data.to_s.unpack('N4')       
  sprintf("(%22s) len=%3d cmd=%8s status=%1d seq=%03d (%s)", self.class.to_s[11..-1], a[0], a[1].to_s(16), a[2], a[3], @msg_body[0..30])
end