Home > smpp34pdu

smpp34pdu

Smpp34pdu is a project mainly written in Erlang, it's free.

SMPP 3.4 PDU library in erlang

smpp34pdu is an erlang library for the SMPP 3.4 wire protocol

Brief History

This library is a take two of a ad-hoc implementation of just the wire protocol packing and unpacking routines. It is inspired in part by OSERL's approach and my desire to implement this from first principles after the lessons learnt implementing this in an ad-hoc style, it will eventually replace the version used in my SMPP library.

Another goal of this library is to be fully tested and provably "trustworthy".

The hidden goal of this library is to serve as boiler plate on my research into binary protocol compiler compilers, which is one of my current areas of interest, as I want to implement this from first principles without too much refactorings, so I can see how easy it would be to autogenerate all this code based on an EBNF type grammar.

I choosen to support SMPP 3.4 since its the most widely deployed variant of the protocol currently, and SMPP is designed to be backwardly compatible, so any compliant system speaking SMPP 5 will accept and work with SMPP 3.4 systems.

Note that this library assumes a familiarity with the SMPP 3.4 PDU specification, and is a one-to-one mapping of the PDUs onto erlang.

Uhh... typically, this familarity comes from reading the spec :)

Building

smpp34pdu is built with rebar, the awesome erlang build tool.

There is a Makefile wrapping up its use, so it plays nice with other build environments.

First clone the sources from git hub:

$ git clone git://github.com/essiene/smpp34pdu.git

Then build: $ cd smpp34pdu $ make

To run the unittests: $ make tests

To run dialyzer analysis: $ make analyze

Installation

Deploy like any other erlang library

Usage/Examples

-module(smpp34pdu_example). -export([start/0]).

% Include the resource file defining all the % Records

-include_lib("smpp34pdu/include/smpp34pdu.hrl").

start() -> % Create a bind_receiver PDU record BindReceiverBody = #bind_receiver{system_id="abcdefghij", password="abcd", system_type="", interface_version=?VERSION, addr_ton=2, addr_npi=1,address_range=""},

% Pack this PDU into binary
% Note that this calculates all the neccessary header fields
% like command_id, command_length, command_status and builds a complete
% PDU

PackedBinary = smpp34pdu:pack(?ESME_ROK, 1, BindReceiverBody),

{ok, [Pdu], <<>>} = smpp34pdu:unpack(PackedBinary),

Pdu#pdu.body = BindReceiverBody,

io:format("PDU packing/unpacking works properly").

Docs

A more complete documentation will be included soon

Current Status

This is currently pre-alpha software and is not yet feature complete. I am working through an earlier implementation and reimplementing here. This situation shouldn't last for too long though.

Supported PDUs:
    GENERIC_NACK
    BIND_RECEIVER
    BIND_RECEIVER_RESP
    BIND_TRANSMITTER
    BIND_TRANSMITTER_RESP
    QUERY_SM
    QUERY_SM_RESP
    SUBMIT_SM
    SUBMIT_SM_RESP
    DELIVER_SM
    DELIVER_SM_RESP
    UNBIND
    UNBIND_RESP
    REPLACE_SM
    REPLACE_SM_RESP
    CANCEL_SM
    CANCEL_SM_RESP
    BIND_TRANSCEIVER
    BIND_TRANSCEIVER_RESP
    OUTBIND
    ENQUIRE_LINK
    ENQUIRE_LINK_RESP
    ALERT_NOTIFICATION

Unsupported PDUs:
    SUBMIT_MULTI
    SUBMIT_MULTI_RESP
    DATA_SM
Previous:wiki2rest