Added support for sending long messages via splitted short_message parameter

This commit is contained in:
2015-05-10 15:35:12 +02:00
parent 931dac203d
commit 0d5ba73e8a
4 changed files with 122 additions and 36 deletions
+69 -19
View File
@@ -1,9 +1,9 @@
'use strict';
var log = require('winston'),
events = require('events'),
smppUtils = require('./utils'),
defs = require('./defs');
var log = require('winston'),
events = require('events'),
utils = require('./utils'),
defs = require('./defs');
/**
* Generic session function
@@ -57,7 +57,7 @@ function session(sock) {
*/
returnObj.sockWrite = function(pdu, closeAfterSend) {
if ( ! Buffer.isBuffer(pdu)) {
smppUtils.objToPdu(pdu, function(err, buffer) {
utils.objToPdu(pdu, function(err, buffer) {
if (err) {
log.warn('larvitsmpp: lib/session.js: session() - sockWrite() - Could not convert PDU to buffer');
returnObj.closeSocket();
@@ -96,7 +96,7 @@ function session(sock) {
// Make sure the pdu is an object
if (Buffer.isBuffer(pdu)) {
smppUtils.pduToObj(pdu, function(err, pduObj) {
utils.pduToObj(pdu, function(err, pduObj) {
if (err) {
callback(err);
return;
@@ -180,7 +180,7 @@ function session(sock) {
closeAfterSend = undefined;
}
smppUtils.pduReturn(pdu, status, params, function(err, retPdu) {
utils.pduReturn(pdu, status, params, function(err, retPdu) {
if (err) {
log.error('larvitsmpp: lib/session.js: session() - returnObj.sendReturn() - Could not create return PDU: ' + err.message);
returnObj.closeSocket();
@@ -200,6 +200,53 @@ function session(sock) {
});
};
/**
* Send a longer SMS than 1120 bits
*
* @param obj smsOptions
* from - alphanum or international format
* to - international format
* message - string
* dlr - boolean defaults to false
* @param func callback(err, smsId, retPduObj)
*/
returnObj.sendLongSms = function(smsOptions, callback) {
var msgs = utils.splitMsg(smsOptions.message),
encoding = defs.encodings.detect(smsOptions.message); // Set encoding once for all message parts
function sendPart(i) {
var pduObj = {
'cmdName': 'submit_sm',
'params': {
'source_addr_ton': 1, // Default to international format
'esm_class': 0x40, // This indicates that there is a UDH in the short_message
'source_addr': smsOptions.from,
'destination_addr': smsOptions.to,
'data_coding': defs.consts.ENCODING[encoding],
'short_message': msgs[i],
'sm_length': msgs[i].length
}
};
// Request DLRs!
if (smsOptions.dlr) {
pduObj.params.registered_delivery = 0x01;
}
log.debug('larvitsmpp: lib/session.js: returnObj.sendLongSms() - pduObj: ' + JSON.stringify(pduObj));
returnObj.send(pduObj, function(err, retPduObj) {
if (typeof callback === 'function' && msgs[i + 1] === undefined) {
callback(err, retPduObj.params.message_id, retPduObj);
} else if (msgs[i + 1] !== undefined) {
sendPart(i + 1);
}
});
}
sendPart(0);
};
/**
* Send an SMS
*
@@ -215,6 +262,7 @@ function session(sock) {
pduObj.cmdName = 'submit_sm';
pduObj.params = {
'source_addr_ton': 1, // Default to international format
'source_addr': smsOptions.from,
'destination_addr': smsOptions.to,
'short_message': smsOptions.message
@@ -225,6 +273,13 @@ function session(sock) {
pduObj.params.registered_delivery = 0x01;
}
// Check if we must split this message into multiple
if (utils.bitCount(smsOptions.message) > 1120) {
returnObj.sendLongSms(smsOptions, callback);
return;
}
log.debug('larvitsmpp: lib/session.js: returnObj.sendSms() - pduObj: ' + JSON.stringify(pduObj));
returnObj.send(pduObj, function(err, retPduObj) {
@@ -243,7 +298,6 @@ function session(sock) {
*/
returnObj.sendDlr = function(sms, status, callback) {
var shortMessage = 'id:' + sms.smsId + ' sub:001 ',
err,
dlrPduObj;
if (typeof status === 'function') {
@@ -261,8 +315,8 @@ function session(sock) {
shortMessage += 'dlvrd:0 ';
}
shortMessage += 'submit date:' + smppUtils.smppDate(sms.submitTime);
shortMessage += ' done date:' + smppUtils.smppDate(new Date());
shortMessage += 'submit date:' + utils.smppDate(sms.submitTime);
shortMessage += ' done date:' + utils.smppDate(new Date());
if (status) {
shortMessage += ' stat:DELIVRD err:0 text:xxx';
@@ -298,15 +352,12 @@ function session(sock) {
dlrPduObj.seqNr = 323;
console.log('before:');
console.log(dlrPduObj);
smppUtils.objToPdu(dlrPduObj, function(err, pdu) {
utils.objToPdu(dlrPduObj, function(err, pdu) {
if (err) {
throw err;
}
smppUtils.pduToObj(pdu, function(err, newObj) {
utils.pduToObj(pdu, function(err, newObj) {
if (err) {
throw err;
}
@@ -316,14 +367,13 @@ function session(sock) {
});
});
return;
returnObj.send(dlrPduObj, function(err, retPduObj) {
console.log('WHATTA WHATTA');
console.log(retPduObj);
/*if (typeof callback === 'function') {
if (typeof callback === 'function') {
callback(err, retPduObj.params.message_id, retPduObj);
}*/
}
});
};
@@ -423,7 +473,7 @@ function session(sock) {
log.silly('larvitsmpp: lib/session.js: session() - sock.on(data) - Incoming PDU: ' + pduBuf.toString('hex'));
smppUtils.pduToObj(pduBuf, function(err, pduObj) {
utils.pduToObj(pduBuf, function(err, pduObj) {
if (err) {
log.warn('larvitsmpp: lib/session.js: session() - Invalid PDU. ' + err.message);