smppex v0.3.1 SMPPEX.Pdu

Module for working with Pdu struct representing parsed SMPP PDU

Summary

Functions

Checks if Pdu is a bind request

Checks if Pdu is a bind response

Returns Pdu’s command_id

Returns Pdu’s symbolic command name as an atom or :unknown if Pdu’s command_id do not correspond to any real SMPP command

Returns Pdu’s command_status

Returns Pdu’s :destination_addr, :dest_addr_ton and :dest_addr_npi fields in a tuple

Get Pdu mandatory or optional(TLV) field by name or by integer id. If Pdu does not have the field or field name is unknown, nil is returned

Get Pdu mandatory field. If Pdu does not have the field, nil is returned

Get the whole set of mandatory fields as a map

Construct a new Pdu from header, mandatory fields and optional(TLV) fields

Get Pdu optional(TLV) field by name or by integer id. If Pdu does not have the field or field name is unknown, nil is returned

Get the whole set of optional(TLV) fields as a map

Returns Pdu’s unique reference ref

Checks if Pdu is a response Pdu

Checks if two Pdus are copies of the same Pdu

Returns Pdu’s sequence_number

Sets Pdu mandatory field. New Pdu is returned

Sets Pdu optional field. New Pdu is returned

Returns Pdu’s :source_addr, :source_addr_ton and :source_addr_npi fields in a tuple

Checks if Pdu is a successful response Pdu

Types

addr :: {String.t, byte, byte}
header ::
  {non_neg_integer, non_neg_integer, non_neg_integer} |
  non_neg_integer
t :: %SMPPEX.Pdu{command_id: non_neg_integer, command_status: non_neg_integer, mandatory: map, optional: map, ref: reference, sequence_number: non_neg_integer}

Functions

bind?(pdu)

Specs

bind?(t) :: boolean

Checks if Pdu is a bind request.

Examples

iex(1)> pdu = SMPPEX.Pdu.new(4)
iex(2)> SMPPEX.Pdu.bind?(pdu)
false
iex(3)> pdu = SMPPEX.Pdu.new(1)
iex(4)> SMPPEX.Pdu.bind?(pdu)
true
bind_resp?(pdu)

Specs

bind_resp?(t) :: boolean

Checks if Pdu is a bind response.

Examples

iex(1)> pdu = SMPPEX.Pdu.new(0x80000004)
iex(2)> SMPPEX.Pdu.bind_resp?(pdu)
false
iex(3)> pdu = SMPPEX.Pdu.new(0x80000001)
iex(4)> SMPPEX.Pdu.bind_resp?(pdu)
true
command_id(pdu)

Specs

command_id(t) :: non_neg_integer

Returns Pdu’s command_id.

Examples

iex(1)> pdu = SMPPEX.Pdu.new(1)
iex(2)> SMPPEX.Pdu.command_id(pdu)
1
command_name(pdu)

Specs

command_name(t) :: atom

Returns Pdu’s symbolic command name as an atom or :unknown if Pdu’s command_id do not correspond to any real SMPP command.

Examples

iex(1)> pdu = SMPPEX.Pdu.new(1)
iex(2)> SMPPEX.Pdu.command_name(pdu)
:bind_receiver
iex(3)> pdu = SMPPEX.Pdu.new(1111111)
iex(4)> SMPPEX.Pdu.command_name(pdu)
:unknown
command_status(pdu)

Specs

command_status(t) :: non_neg_integer

Returns Pdu’s command_status.

Examples

iex(1)> pdu = SMPPEX.Pdu.new({1, 4, 123})
iex(2)> SMPPEX.Pdu.command_status(pdu)
4
dest(pdu)

Specs

dest(t) :: addr

Returns Pdu’s :destination_addr, :dest_addr_ton and :dest_addr_npi fields in a tuple.

Examples

iex(1)> pdu = SMPPEX.Pdu.new(4, %{destination_addr: "to", dest_addr_ton: 1, dest_addr_npi: 2})
iex(2)> SMPPEX.Pdu.dest(pdu)
{"to", 1, 2}
field(pdu, id)

Specs

field(t, integer | atom) :: any

Get Pdu mandatory or optional(TLV) field by name or by integer id. If Pdu does not have the field or field name is unknown, nil is returned.

Examples

iex(1)> pdu = SMPPEX.Pdu.new(4, %{short_message: "hi"}, %{0x0424 => "hello"})
iex(2)> SMPPEX.Pdu.field(pdu, :message_payload)
"hello"
iex(3)> SMPPEX.Pdu.field(pdu, 0x0424)
"hello"
iex(4)> SMPPEX.Pdu.field(pdu, :short_message)
"hi"
iex(5)> SMPPEX.Pdu.field(pdu, :unknown_name)
nil
mandatory_field(pdu, name)

Specs

mandatory_field(t, atom) :: term

Get Pdu mandatory field. If Pdu does not have the field, nil is returned.

Examples

iex(1)> pdu = SMPPEX.Pdu.new({1, 4, 123}, %{system_id: "system_id"})
iex(2)> SMPPEX.Pdu.mandatory_field(pdu, :system_id)
"system_id"
iex(3)> SMPPEX.Pdu.mandatory_field(pdu, :short_message)
nil
mandatory_fields(pdu)

Specs

mandatory_fields(t) :: map

Get the whole set of mandatory fields as a map.

Examples

iex(1)> pdu = SMPPEX.Pdu.new(4, %{short_message: "hi"}, %{0x0424 => "hello"})
iex(2)> SMPPEX.Pdu.mandatory_fields(pdu)
%{short_message: "hi"}
new(header, mandatory_fields \\ %{}, optional_fields \\ %{})

Specs

new(header, map, map) :: t

Construct a new Pdu from header, mandatory fields and optional(TLV) fields.

Header may be either an integer, then it is treated as command id, or a tuple {command_id, command_status, sequence_number}

Each Pdu is created with a unique ref field, by which one can later trace Pdu’s identity.

Examples

iex(1)> SMPPEX.Pdu.new(1)
%SMPPEX.Pdu{command_id: 1, command_status: 0, mandatory: %{}, optional: %{},
ref: #Reference<0.0.3.215>, sequence_number: 0}
iex(2)> SMPPEX.Pdu.new({1, 0, 123}, %{system_id: "sid", password: "pass"}, %{})
%SMPPEX.Pdu{command_id: 1, command_status: 0,
mandatory: %{password: "pass", system_id: "sid"}, optional: %{},
ref: #Reference<0.0.3.219>, sequence_number: 123}
optional_field(pdu, id)

Specs

optional_field(t, integer | atom) :: any

Get Pdu optional(TLV) field by name or by integer id. If Pdu does not have the field or field name is unknown, nil is returned.

Examples

iex(1)> pdu = SMPPEX.Pdu.new(4, %{}, %{0x0424 => "hello"})
iex(2)> SMPPEX.Pdu.optional_field(pdu, :message_payload)
"hello"
iex(3)> SMPPEX.Pdu.optional_field(pdu, 0x0424)
"hello"
iex(4)> SMPPEX.Pdu.optional_field(pdu, :receipted_message_id)
nil
iex(5)> SMPPEX.Pdu.optional_field(pdu, :unknown_tlv_name)
nil
optional_fields(pdu)

Specs

optional_fields(t) :: map

Get the whole set of optional(TLV) fields as a map.

Examples

iex(1)> pdu = SMPPEX.Pdu.new(4, %{short_message: "hi"}, %{0x0424 => "hello"})
iex(2)> SMPPEX.Pdu.optional_fields(pdu)
%{0x0424 => "hello"}
ref(pdu)

Returns Pdu’s unique reference ref.

Examples

iex(1)> pdu = SMPPEX.Pdu.new({1, 4, 123})
iex(2)> is_reference SMPPEX.Pdu.ref(pdu)
true
resp?(pdu)

Specs

resp?(t) :: boolean

Checks if Pdu is a response Pdu.

Examples

iex(1)> pdu = SMPPEX.Pdu.new(4)
iex(2)> SMPPEX.Pdu.resp?(pdu)
false
iex(3)> pdu = SMPPEX.Pdu.new(0x80000004)
iex(4)> SMPPEX.Pdu.resp?(pdu)
true
same?(pdu1, pdu2)

Specs

same?(t, t) :: boolean

Checks if two Pdus are copies of the same Pdu.

Examples

iex(1)> pdu1 = SMPPEX.Pdu.new(4)
iex(2)> pdu2 = SMPPEX.Pdu.new(4)
iex(3)> SMPPEX.Pdu.same?(pdu1, pdu2)
false
iex(4)> SMPPEX.Pdu.same?(pdu1, pdu1)
true
sequence_number(pdu)

Specs

sequence_number(t) :: non_neg_integer

Returns Pdu’s sequence_number.

Examples

iex(1)> pdu = SMPPEX.Pdu.new({1, 4, 123})
iex(2)> SMPPEX.Pdu.sequence_number(pdu)
123
set_mandatory_field(pdu, name, value)

Specs

set_mandatory_field(t, atom, any) :: t

Sets Pdu mandatory field. New Pdu is returned.

Examples

iex(1)> pdu = SMPPEX.Pdu.new({1, 4, 123}, %{system_id: "system_id"})
iex(2)> pdu1 = SMPPEX.Pdu.set_mandatory_field(pdu, :password, "pass")
iex(3)> SMPPEX.Pdu.mandatory_field(pdu1, :password)
"pass"
set_optional_field(pdu, name, value)

Specs

set_optional_field(t, atom, any) :: t

Sets Pdu optional field. New Pdu is returned.

Examples

iex(1)> pdu = SMPPEX.Pdu.new(4)
iex(2)> pdu1 = SMPPEX.Pdu.set_optional_field(pdu, :message_payload, "hello")
iex(3)> SMPPEX.Pdu.optional_field(pdu1, 0x0424)
"hello"
source(pdu)

Specs

source(t) :: addr

Returns Pdu’s :source_addr, :source_addr_ton and :source_addr_npi fields in a tuple.

Examples

iex(1)> pdu = SMPPEX.Pdu.new(4, %{source_addr: "from", source_addr_ton: 1, source_addr_npi: 2})
iex(2)> SMPPEX.Pdu.source(pdu)
{"from", 1, 2}
success_resp?(pdu)

Specs

success_resp?(t) :: boolean

Checks if Pdu is a successful response Pdu.

Examples

iex(1)> pdu = SMPPEX.Pdu.new({0x80000004, 1, 0})
iex(2)> SMPPEX.Pdu.success_resp?(pdu)
false
iex(3)> pdu = SMPPEX.Pdu.new({0x80000004, 0, 0})
iex(4)> SMPPEX.Pdu.success_resp?(pdu)
true