class Smpp::Pdu::SubmitSm

Sending an MT message

Attributes

data_coding[R]
dest_addr_npi[R]
dest_addr_ton[R]
destination_addr[R]
esm_class[R]
optional_parameters[R]
priority_flag[R]
protocol_id[R]
registered_delivery[R]
replace_if_present_flag[R]
schedule_delivery_time[R]
service_type[R]
short_message[R]
sm_default_msg_id[R]
sm_length[R]
source_addr[R]
source_addr_npi[R]
source_addr_ton[R]
source_options[R]
udh[R]
validity_period[R]

Public Class Methods

from_wire_data(seq, status, body) click to toggle source
# 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
new(source_addr, destination_addr, short_message, options={}, seq = nil) click to toggle source

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

Calls superclass method Smpp::Pdu::Base::new
# 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

Public Instance Methods

to_human() click to toggle source

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

# 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