/larvitsmpp

SMPP made simple

Primary LanguageJavaScriptMIT LicenseMIT

Build Status Dependencies Coverage Status

Larv IT SMPP

This is a simplified implementation of the SMPP protocol.

Installation

npm install larvitsmpp

Client

Simplest possible

This will setup a client that connects to localhost, port 2775 without username or password and send a message.

const larvitsmpp = require('larvitsmpp');

larvitsmpp.client(function(err, clientSession) {
	clientSession.sendSms({
		'from': '46701113311',
		'to': '46709771337',
		'message': 'Hello world'
	});

	// Gracefully close connection
	clientSession.unbind();
});

Some connection parameters and DLR

This will setup a client that connects to given host, port with username and password, send a password and retrieve a DLR and with a custom log driver, compatible with winston.

const larvitsmpp = require('larvitsmpp');
const LUtils = require('larvitutils');
const lUtils = new LUtils();
const log    = new lUtils.Log('debug');

larvitsmpp.client({
	'host':     'smpp.somewhere.com',
	'port':     2775,
	'username': 'foo',
	'password': 'bar',
	'log':      log
}, function(err, clientSession) {
	if (err) {
		throw err;
	}

	clientSession.sendSms({
		'from':    '46701113311',
		'to':      '46709771337',
		'message': '«baff»',
		'dlr':     true
	}, function(err, smsId, retPduObj) {
		if (err) {
			throw err;
		}

		console.log('Return PDU object:');
		console.log(retPduObj);
	});

	clientSession.on('dlr', function(dlr, dlrPduObj) {
		console.log('DLR received:');
		console.log(dlr);

		console.log('DLR PDU object:');
		console.log(dlrPduObj);

		// Gracefully close connection
		clientSession.unbind();
	});
});

Server

Simplest possible

This will setup a password less server on localhost, port 2775 and console.log() incomming commands.

const larvitsmpp = require('larvitsmpp');

larvitsmpp.server(function(err, serverSession) {
	if (err) {
		throw err;
	}

	serverSession.on('data', function(data) {
		console.log('command: ' + data.command);
	});
});

With auth and custom logging, returning smsId and DLR

Example code below:

const larvitsmpp = require('larvitsmpp');
const LUtils = require('larvitutils');
const lUtils = new LUtils();
const log    = new lUtils.Log('debug');

// This should of course be replaced with your preferred auth system
function checkuserpass(username, password, cb) {
	if (username === 'foo' && password === 'bar') {
		// The last parameter is just user meta data that will be attached to the session as "userData" and is optional
		cb(null, true, {'username': 'foo', 'userId': 123});
	} else {
		cb(null, false);
	}
}

larvitsmpp.server({
	'checkuserpass': checkuserpass,
	'log':           log
}, function(err, serverSession) {
	if (err) {
		throw err;
	}

	// Incoming SMS!
	serverSession.on('sms', function(sms) {
		// It is important to run the sms.resp() since this is a part of the protocol
		sms.sendResp(
			// Status code
			// Default is ESME_ROK == no error
			// See SMPP spec for all available status codes
			// For example: ESME_RINVDSTADR == "Invalid destination address".
			'ESME_ROK'
		);

		// Oh, the sms sender wants a dlr (delivery report), send it!
		if (sms.dlr === true) {
			sms.sendDlr(); // Equalent to sms.sendDlr('DELIVERED');

			// To send a negative delivery report for example do:
			sms.sendDlr('UNDELIVERABLE');
			// Possible values are:
			// SCHEDULED
			// ENROUTE
			// DELIVERED <-- Default
			// EXPIRED
			// DELETED
			// UNDELIVERABLE
			// ACCEPTED
			// UNKNOWN
			// REJECTED
			// SKIPPED
		}
	});
});

Session Events

connect

Triggered when the socket is connected to a client. This is server specific.

data

Triggered when data is comming in on the socket.

close

Triggered when the socket is closed.

error

Generic error event.

sms

Incoming SMS.

incomingPdu

Incoming PDU.

incomingPduObj

Incoming PDU Object. Same as incomingPdu, but it have been converted into an object instead of a buffer.

Session commands

send

Send a PDU to the remote.