farhadi / node-smpp Goto Github PK
View Code? Open in Web Editor NEWSMPP client and server implementation in node.js
License: MIT License
SMPP client and server implementation in node.js
License: MIT License
Is it possible to receive delivery reports in an asynchronous manner? I have tried the on pdu event but got nothing
Can You Please Help me Where we need to set short code
By default, it uses 5.0. How can I set it to 3.4?
Hi @farhadi ,
Need your help.
I am trying to send uni code message from node.js using your library.
I have set payload as :
var payload = {
destination_addr: '919999999999',
short_message: 'ರನ್!',
source_addr: 'IM-DEMO',
registered_delivery: '0',
data_coding: 8,
};
and submitting this payload.But unicode message is not properly sent to SMP3 server.It is receiving as some weird text.Please help.
I have your sample code which works fine with one SMPP server but in another case I am have having a problem. This is what I have:
var smpp = require('smpp');
var session = smpp.connect('smpp_server', 2775);
session.bind_transceiver({
system_id: 'smppclient1',
password: 'password'
}, function(pdu) {
if (pdu.command_status == 0) {
// Successfully bound
session.submit_sm({
destination_addr: '8475551212',
short_message: 'Hello!'
}, function(pdu) {
if (pdu.command_status == 0) {
// Message successfully sent
console.log(pdu.message_id);
}
});
}
});
Turns out I need to send TLV like this one:
abc42xyz_operator, 0x1520,1,5, 5,0x03,CUSTMR_13914533_TESTIPC_111_D
I looked at the GitHub page and I see you mention TLV as an Array but I don't see how it would be put into the javascript.
I see this in smpp.js but I am not sure how to apply that to the TLV:
exports.addTLV = function(tag, options) {
options.tag = tag;
defs.tlvs[tag] = options;
defs.tlvsById[options.id] = options;
};
Hello.
The last commit with bug-fix (268b055) is not included in the last release 0.1.0 and doesn't install from npm repository. Please update release.
Hello,
When Node-smpp receives sms, it replaces @ character with 0. I suppose it's because filters.message.decode() function but i'm not sure.
Do you have the same problem ?
Regards,
Hasan.
session.bind_transceiver({
system_id: 'system_id',
password: 'password'
}, function (pdu) {
if (pdu.command_status != smpp.errors.ESME_ROK) {
console.error('SMPP bind transceiver error: ' + pdu.command_status);
process.exit(1);
} else {
console.log('Connected');
}
});
session.on('close', function () {
console.log('SMPP connection is closed');
});
Output: Connected, SMPP connection is closed
Why is the session close event emitted after a successful bind_transceiver method?
Receiving an message submit_sm of this type:
new smpp.PDU('submit_sm', {
'data_coding': 8,
'short_message': new Buffer("0043006f0043006f0043006f0043006f0043006f", "hex")
});
the server decodes it with filters.message.decode (in defs.js) and decodes the message from UCS2 without changing data_coding field.
So we have 'data_coding': 8 and short_message coded as Buffer("436f436f436f436f436f", "hex"), that is not UCS2 coding, is it ok?
If we have to store the decoded PDU without re-encoding, the data_coding is wrong...
I want to insert an SMS to the database after submitting. How to pass extra data (custom data like client_id which is specific to my app) to submit_sm options.
Hi, source_addr(sender id) not working!
i try decode char: 0x40 with data_coding: 0 which is the '@' in ASCII table, but decode to '¡' when using encodings['ASCII'].decode()
i found ASCII decode using this table
encodings.ASCII = { // GSM 03.38
chars: '@£$¥èéùìòÇ\nØø\rÅåΔ_ΦΓΛΩΠΨΣΘΞ\x1BÆæßÉ !"#¤%&\'()*+,-./0123456789:;<=>?¡ABCDEFGHIJKLMNOPQRSTUVWXYZÄÖÑܧ¿abcdefghijklmnopqrstuvwxyzäöñüà',
is it decoded ASCII data using GSM 03.38 table?
Just curious if I could set the sender ID?
hi, how can I send SMS to more than one number? Do you have sample code?
Hi there,
As per SMPP specification the submit_sm_resp
command cannot have body if the status is not a zero. It's not respected by library and so you end up with:
../node_modules/smpp/lib/defs.js:70
value.copy(buffer, offset);
^
TypeError: Cannot call method 'copy' of undefined
at Object.types.cstring.write (../node_modules/smpp/lib/defs.js:70:10)
at PDU.toBuffer (../node_modules/smpp/lib/pdu.js:136:20)
at Session.send (../node_modules/smpp/lib/smpp.js:73:24)
at Session.onPdu (../main.js:152:23)
at Session.emit (events.js:95:17)
at Session._extractPDUs (../node_modules/smpp/lib/smpp.js:52:8)
at Socket.<anonymous> (../node_modules/smpp/lib/smpp.js:29:8)
at Socket.emit (events.js:95:17)
at Socket.<anonymous> (_stream_readable.js:748:14)
at Socket.emit (events.js:92:17)
I'm not sure yet what would be the best solution, but as a workaround i had to add a check to toBuffer
method and skip encoding.
We probably should add some kind of flag to commands that not allow the body when status is not a zero and add support for it to toBuffer
method.
I'm trying to send a long message but something going wrong and I see a stack trace:
TypeError: value is out of bounds
at TypeError (<anonymous>)
at checkInt (buffer.js:784:11)
at Buffer.writeUInt8 (buffer.js:794:5)
at Object.types.buffer.write (/home/qfox/repos/selfcare-tools/node_modules/smpp/lib/defs.js:84:11)
at PDU.toBuffer (/home/qfox/repos/selfcare-tools/node_modules/smpp/lib/pdu.js:137:20)
at Session.send (/home/qfox/repos/selfcare-tools/node_modules/smpp/lib/smpp.js:71:24)
at Session.createShortcut [as submit_sm] (/home/qfox/repos/selfcare-tools/node_modules/smpp/lib/smpp.js:94:15)
at Object.send (/home/qfox/repos/selfcare-tools/lib/smpp.js:133:24)
at module.exports.actions.check4g (/home/qfox/repos/selfcare-buddy/routes/api/usim.js:24:14)
at callbacks (/home/qfox/repos/selfcare-buddy/node_modules/express/lib/router/index.js:164:37)
'Абвгдеёжзий, кл мнопрс туфхцчшщъы ab ьэ юяабв гдеёжзий к лмноп рстуфхцчшщ. ъыьэюяабвгде ёж зийклмнопрст уфхцчшщ ъыьэю: abc.defghi'
is throwing that error while
'Абвгдеёжзий, кл мнопрс туфхцчшщъы ab ьэ юяабв гдеёжзий к лмноп рстуфхцчшщ. ъыьэюяабвгде ёж зийклмнопрст уфхцчшщ ъыьэю: abc.defg'
is works fine.
Is it a bug or i've just missed something? Thanks.
So it appears that when returning a submit_sm_resp PDU internally these messages are held in memory and then delivered to the client when available, if a client disconnects then some of these messages remain in memory. If a client is sending more messages in than it can receive, these messages build up on the server and it crashes
Can i send SMPP that server uses 3.4 protocal?
enquire link event is used to keep the server alive. In most servers this is defined with a timer. Eg: 60s where users must send a enquire_link to avoid the close of the session.
This could be integrated in this module with a config option. Since this feature will be the same for all the user.
I am bulding message_payload by concatenating bytes in the following way:
// UDH header
var session_id = new Buffer(4);
session_id.writeUInt8(5, 0);
session_id.writeUInt8(0, 1);
session_id.writeUInt8(3, 2);
session_id.writeUInt8(227, 3);
var message_part1 = new Buffer([2, 1]);
var message_part2 = new Buffer([2, 2]);
// message parts
var message1 = Array(153).join("A")
var message2 = Array(153).join("B")
var part1 = new Buffer(message1);
var part2 = new Buffer(message2);
// Setting message payload field inside the deliver_sm function
message_payload: session_id + message_part2 + part2
Setting byte to be larger than 127 causes trouble and the whole message gets messed up by encoding message body to UCS2 encoding
According to specs (3GPP TS 23.040) sequence number of a message can have range from 0 to 255, however I am not able to set it in node-smpp.
Am I misusing the library or is it a bug?
EDIT: I have tried to concatenate buffer (Buffer.concat) before assigning to message_payload and verifying it with Buffer.isBuffer function and the value I am providing to message_payload is a buffer. It looks that message_payload has a filter which checks whether field value is a buffer and should use unmodified value if true. But it seems it converts it anyway.
var bufferArr = [session_id, message_part2, part2];
var concatenatedBuf = Buffer.concat(bufferArr);
message_payload: concatenatedBuf
EDIT: I have removed filters.message for message_payload in defs.js and it worked, so the problem is somewhere in filters.message function.
Hi, there is any way to keep a connection opened? I have tried using setKeepAlive on the session socket returned by smpp.connect() without luck.
Thanks in advance!
Can you show me a simple example where you are using TLV params: sar_total_segments, sar_segment_seqnum, sar_msg_ref_num. When i try to use this options i have not some informations and errors.
P.S. How i can send a long sms without UDH?
E.g. file https://github.com/farhadi/node-smpp/blob/master/lib/smpp.js contains pull requests #17 and #14 but if install via npm install smpp
- this changes in node_modules/smpp/lib/smpp.js
not exists.
How do I get SMS status report?
using node js and express
To send binary messages is sufficient to establish the value data_coding - 4? I get an error:
[TypeError: Can not read property 'length' of indefinedsch
subtit_sm:
session.submit_sm({
destination_addr : message.phone,
message_payload : message.data,
registered_delivery : 1,
data_coding : 4
}, function(pdu) {
if (pdu.command_status == 0) {
...
} else {
...
}
});
I am trying to recieve deliver_sm and send deliver_sm_resp,
Is their any example which work for me.
Thanks
Is it possible to send Bulk SMSs using submit_multi method? I tried using your API but no luck :( . If possible to could you please share a code snippet to send Bulk SMS?
I used this :
session.on('enquire_link', function(pdu) { session.send(pdu.response()); console.log('.'); });
It looks like the callback is fired more and more times with each call...
Do I simply need to create one enquire link, calling it only once?
session.submit_multi({
dest_address: [
{destination_addr: 'DESTINATION NUMBER 1'},
{destination_addr: 'DESTINATION NUMBER 2'},
// ...
],
short_message: 'Hello!'
});
I did,
PDU {
command_length: 32,
command_id: 2147483681,
command_status: 13,
sequence_number: 2,
command: 'submit_multi_resp',
message_id:* 'Unknown command.' }* --> I get the error
I would be glad if a large sample of code or a large document, Greetings
Can you please advise how to properly add Optional Parameter to PDU?
Hi!!
When I use query_sm always return generic_nack.
pdu { command: 'query_sm',
command_length: 41,
command_id: 3,
command_status: 0,
sequence_number: 2,
message_id: '9066579236',
source_addr_ton: 1,
source_addr_npi: 1,
source_addr: '506848xxxxx' }
pdu { command_length: 16,
command_id: 2147483648,
command_status: 3,
sequence_number: 2,
command: 'generic_nack' }
Hi,
I got an issue sending SMS when I send an SMS with 280 chars. Is it possible to send message over 255 chars, If yes, Please help me how to fix it or show me what did I do wrong. Thank sa lot.
Here is my code to submit_sm:
session.submit_sm({
source_addr: 'TEST',
destination_addr: number,
short_message: message
}, function(pdu) {
if (pdu.command_status == 0) {
console.log("- submit_sm success",pdu.message_id);
session.close();
}
else{
console.log("- submit_sm fail:", pdu);
session.close();
}
});
Here is error log:
0|DMV-VNP: | TypeError: "value" argument is out of bounds
0|DMV-VNP: | at checkInt (buffer.js:1026:11)
0|DMV-VNP: | at Buffer.writeUInt8 (buffer.js:1074:5)
0|DMV-VNP: | at Object.write (/home/dmvit/testSMS/SMS/node_modules/smpp/lib/defs.js:86:11)
0|DMV-VNP: | at PDU.toBuffer (/home/dmvit/testSMS/SMS/node_modules/smpp/lib/pdu.js:175:20)
0|DMV-VNP: | at Session.send (/home/dmvit/testSMS/SMS/node_modules/smpp/lib/smpp.js:97:24)
0|DMV-VNP: | at Array.<anonymous> (/home/dmvit/testSMS/SMS/routes/index.js:42:18)
0|DMV-VNP: | at Session._extractPDUs (/home/dmvit/testSMS/SMS/node_modules/smpp/lib/smpp.js:69:40)
0|DMV-VNP: | at emitNone (events.js:86:13)
0|DMV-VNP: | at Socket.emit (events.js:185:7)
0|DMV-VNP: | at emitReadable_ (_stream_readable.js:432:10)
0|DMV-VNP: | at emitReadable (_stream_readable.js:426:7)
0|DMV-VNP: | at readableAddChunk (_stream_readable.js:187:13)
0|DMV-VNP: | at Socket.Readable.push (_stream_readable.js:134:10)
0|DMV-VNP: | at TCP.onread (net.js:548:20)
prompt, that would send a message session.submit_sm must be within session.bind_transceiver or can be placed outside?
for example, it will be clear what I mean https://gist.github.com/batazor/7679c14e08b7ae90f643
Hi,
Is there any idea to send flash SMS using this module?
Session doesn't emit error event (or any events) when connection breaks.
I run my app which basically does this:
enquire_link
After that I disconnect network, I continue enquiring link and submitting SMSes, it sends PDUs, doesn't receive any response, doesn't emit any error.
How can I detect network absence?
defs.filters.message.decode() function detects encoding simply encoding = this.data_coding & 0x0F;
But according documentation this is incorrect when data_coding carriers more information than only encoding ftp://www.3gpp.org/tsg_t/TSG_T/TSGT_04/Docs/PDFs/TP-99127.pdf
What about to change line encoding = this.data_coding & 0x0F;
to
var encoding = 0;
if (this.data_coding <= 0x0E) {
encoding = this.data_coding & 0x0F;
}
// Non-MWI Mode 1
else if ((this.data_coding & 0xF0) == 0xF0) {
encoding = (this.data_coding & 0x04) ? consts.ENCODING.BINARY : consts.ENCODING.ASCII; // grab bit 2
}
// Non-MWI Mode 0
else if ((this.data_coding & 0xC0) == 0x00) {
encoding = (this.data_coding & 0x0C) >> 2; // grab bit 3,2
if (encoding == 0) {
encoding = consts.ENCODING.ASCII;
} else if (encoding == 1) {
encoding = consts.ENCODING.BINARY;
} else if (encoding == 2) {
encoding = consts.ENCODING.UCS2;
} else { // 3 is reserved
//encoding = consts.ENCODING.ASCII;
}
}
// MWI Mode
else if ((this.data_coding & 0xC0) == 0xC0) {
encoding = ((this.data_coding & 0xE0) == 0xE0) ? consts.ENCODING.UCS2 : consts.ENCODING.ASCII;
}
Is it possible to use DCS=0x00?
SMPP server administrator asks to use explicitly DCS=0 for regular SMS instead of DCS=1 (SMPP Data Coding Scheme: IA5 (CCITT T.50/ASCII (ANSI X3.4) (0x01)
), which is default for latin-based SMS in my case.
Multipart SMS works fine (UDH packets), meaning it's related to characters limits on SMSC according to encoding, but I cannot use this flow as every MT SMS is chargeable.
SMPPSim suggests you do:
SMMPSim validity period parsing
logger.warning("SMPPSim currently only supports time component p=+. Value replaced with +");
According to SMPP documentation, tlvs may be returned in case of command failures, for example:
4.2.1.2 submit_sm_resp Syntax
4.2.5 Message Submission Response TLVs
The following table contains TLVs that can be returned in a submit_sm_resp or data_sm_resp PDU. All TLVs are relevant to transaction message mode only (ref. 4.2.10.4)
...
delivery_failure_reason Include to indicate reason for delivery failure
current code prevents this
sadly, wireshark also doesn't dissect these parameters in _resps
Does any of you tried this plugin with the mBlox SMPP interface ?
I know mBlox SMPP gateway supports v3.4 specification and should be backward compatible with SMPP v3.3, but I haven't try yet. Will this plugin work?
buffer.js:705
throw TypeError('value is out of bounds');
^
TypeError: value is out of bounds
at TypeError (<anonymous>)
at checkInt (buffer.js:705:11)
at Buffer.writeUInt32BE (buffer.js:748:5)
at PDU.<anonymous> (/var/node-demo/node_modules/smpp/lib/pdu.js:122:10)
at Array.forEach (native)
at PDU._initBuffer (/var/node-demo/node_modules/smpp/lib/pdu.js:121:16)
at PDU.toBuffer (/var/node-demo/node_modules/smpp/lib/pdu.js:144:20)
at Session.send (/var/node-demo/node_modules/smpp/lib/smpp.js:74:24)
at Session.<anonymous> (/var/node-demo/server-smpp.js:25:11)
at Session.emit (events.js:95:17)
Node: v0.10.31
"smpp": "^0.1.0"
There are no examples of sending a long SMS message when message_payload is not supported. @vchatterji suggests using "gsm" package in the issue "#4". But, I am not sure whether it works with CDMA providers.
Any suggestions or code examples?
How to send a specific UDH?
As a practical example, say I want to create a UDH to send a WAP Push, where the standard destination port for WAP pushes is 2948, the UDH will be:
06 05 04 0B 84 23 F0
where:
I've tried playing around with this example but can't quite figure out how to get what I need:
I will be sending a string in the payload.
This is an example of message:
xample message: abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXY00
Binary SMS with user data unencoded. Src port 8880 and Dest port is 8888.
PID - 0x00
DCS- 0x00
UDH- 0x0605040B8423F0
UD - 0x6162636465666768696A6B6C6D6E6F707172737475767778797A4142434445464748494A4B4C4D4E4F505152535455565758593030
According to the SMPP 3.4 docs, there are 10 message states:
0 SCHEDULED The message is scheduled for later sending.
1 ENROUTE The message is enroute.
2 DELIVERED The message was successfully delivered.
3 EXPIRED The SMSC was unable to deliver the message in a specified amount of time.For instance when the phone was turned off.
4 DELETED The message was deleted.
5 UNDELIVERABLE The SMS was unable to deliver the message.For instance, when the number does not exist.
6 ACCEPTED The SMS was accepted and will be send.
7 UNKNOWN Unknown error occured.
8 REJECTED The message was rejected.The provider could have blocked phonenumbers in this range.
9 SKIPPED The message was skipped.
But, only 6 of them are provided in defs.js file.
I need to run several instances of the application.
How can i use node-smpp in the cluster mode (manually or for example through pm2)? Or maybe use any loadbalancer (haproxy)?
Hi,
Thanks for the module. I am getting the below error. Please guide me on this.
events.js:72
throw er; // Unhandled 'error' event
^
Error: connect ECONNREFUSED
at errnoException (net.js:901:11)
at Object.afterConnect as oncomplete
Thanks,
Sabari.
var smpp = require('smpp');
var server = smpp.createServer(function(session) {
session.on('bind_transceiver', function(pdu) {
// we pause the session to prevent further incoming pdu events,
// untill we authorize the session with some async operation.
session.pause();
checkAsyncUserPass(pdu.system_id, pdu.password, function(err) {
if (err) {
session.send(pdu.response({
command_status: smpp.ESME_RBINDFAIL
}));
session.close();
return;
}
session.send(pdu.response());
session.resume();
});
});
});
server.listen(2775);
// Using This to create server please Hellp
Hello, Team I tried to send an SMS through the SMPP and I am getting this error,
ESME_RSUBMITFAIL with the status code, command_status: 69
Here is the code snippet,
var smpp = require('smpp');
var session = new smpp.Session({host: '150.120.36.58', port: 2775});
var didConnect = false;
session.on('connect', function(){
didConnect = true;
session.bind_transceiver({
system_id: 'my-system-id',
password: 'my-password',
}, function(pdu) {
console.log('pdu status', lookupPDUStatusKey(pdu.command_status));
// the above method is for handling errors
if (pdu.command_status == 0) {
console.log('Successfully bound')
}
});
})
function lookupPDUStatusKey(pduCommandStatus) {
for (var k in smpp.errors) {
if (smpp.errors[k] == pduCommandStatus) {
return k
}
}
}
function connectSMPP() {
console.log('smpp reconnecting');
session.connect();
}
session.on('close', function(){
console.log('smpp disconnected')
if (didConnect) {
connectSMPP();
}
})
session.on('error', function(error){
console.log('smpp error', error)
didConnect = false;
})
function sendSMS(from, to, text) {
from = '+' + from.toString();
to = '+' + to.toString();
session.submit_sm({
source_addr: from,
destination_addr: to,
short_message: text
}, function(pdu) {
console.log('sms pdu status', lookupPDUStatusKey(pdu.command_status));
if (pdu.command_status == 0) {
// Message successfully sent
console.log(pdu.message_id);
}
});
}
sendSMS(fromNumber, toNumber, 'text')
Now, when I send the message I am getting this error, ESME_RSUBMITFAIL
with the status code 69
There is no particular documentation on what to do on this, nor a particular response.
Sorry, if this should not be asked here. But, I am struck. :)
where to set both of them ?
Hi,
I looking for an node-smpp sample server and client... i's for send and recieve message.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.