如何使用节点smpp发送长消息?

时间:2018-01-02 12:15:47

标签: node.js buffer smpp pdu smscaster

exports.sendSMS = function (session, to, text, sourceAddress, jsonMessageHistoryIds, callback) {

     console.log('messege',text);

    session.submit_multi({
        source_addr: sourceAddress,
        dest_address: to,
        short_message: text

    }, function (pdu) {
        console.log('submit_multi: ', pdu.command_status);
        console.log("PDU", pdu);
        if (pdu.command_status == 0) {
            // insert into sms smpp logs
            var values = {
                type: 'bulk',
                message: text,
                numbers: JSON.stringify(to)
            };

        console.log(pdu.message_id);
            callback(null, pdu.message_id);
        }
    });
};

如果messege低于160个字符则为okey .Messege将被发送,但如果messege超过160个字符,那么如果sms messege太长,它将抛出新的TypeError值参数超出buffer.js的范围。请帮助。非常感谢任何帮助

2 个答案:

答案 0 :(得分:1)

通过这个问题解决了这个问题..希望有一天能帮助某人

npm install gsm
The above module also splits the message into parts:

//We need to split the message and send it in many parts
var gsm = require('gsm');

var info = gsm("Your message string here");

//This is a unique id present in each message part
var concat_ref = this.concat_ref++; 

var part_id = 0;
info.parts.forEach(function(part) {
    part_id++;
    var udh = new Buffer(6);
    udh.write(String.fromCharCode(0x5), 0); //Length of UDF
    udh.write(String.fromCharCode(0x0), 1); //Indicator for concatenated message
    udh.write(String.fromCharCode(0x3), 2); //  Subheader Length ( 3 bytes)
    udh.write(String.fromCharCode(concat_ref), 3); //Same reference for all concatenated messages
    udh.write(String.fromCharCode(info.sms_count), 4); //Number of total messages in the concatenation
    udh.write(String.fromCharCode(part_id), 5); //Sequence number ( used by the mobile to concatenate the split messages)

    var submit_pdu = {
        source_addr:msg.from,
        destination_addr: msg.to,
        short_message: { udh:udh, message:part },
        registered_delivery:1 //If you want a delivery report
    };

    this.getSession().submit_sm(submit_pdu, function(pdu) {
        if (pdu.command_status == 0) {
            console.log("SMPP Gateway[" + this.getOptions().address + "] - SUMBIT[" + submit_pdu.source_addr + ">>>" + submit_pdu.destination_addr + "] - " + pdu.message_id);
        }
        if(callback) {
            callback(pdu);
        }
    }.bind(this));
}.bind(this));

答案 1 :(得分:0)

您可以使用官方 SMPP 的 specification 中所述的 message_payload 参数(字段名称)来发送超过 254 个八位字节的消息。

message_payload 定义:

<块引用>

包含扩展的短消息用户数据。最多 64K 个八位字节 传送。

官方文档说:

<块引用>

需要发送超过 254 个八位字节的消息的应用程序应该 使用 message_payload 参数。在这种情况下 sm_length 字段 应设置为零。

短消息数据应该插入到short_message 或 message_payload 字段。不得同时使用这两个字段 同时。

我用 node-smpp 做了一个测试,它工作正常。无需串联。