Для отправки длинных SMS необходимо вручную разбить сообщение на части и указать, что эти части составляют одно целое сообщение. Для этого нужно использовать механизм сегментирования сообщений, который реализуется через UDH (User Data Header).
Пример реализации такого скрипта согласно стандарту GSM:
const smpp = require('smpp');
const session = smpp.connect('smpp://your-smpp-server');
function splitMessage(message) {
const messageParts = [];
const partSize = 153;
for (let i = 0; i < message.length; i += partSize) {
messageParts.push(message.substring(i, i + partSize));
}
return messageParts;
}
function sendLongSms(session, destination, source, message) {
const parts = splitMessage(message);
const refNumber = Math.floor(Math.random() * 255);
const totalParts = parts.length;
parts.forEach((part, index) => {
const udh = Buffer.from([
0x05, // UDH length
0x00, // IEI (Information Element Identifier)
0x03, // Length of header
refNumber, // Reference number (randomized)
totalParts, // Total number of parts
index + 1, // Current part number
]);
const shortMessage = Buffer.concat([udh, Buffer.from(part, 'utf-8')]);
session.submit_sm({
destination_addr: destination,
source_addr: source,
short_message: shortMessage,
data_coding: 0,
}, (pdu) => {
if (pdu.command_status === 0) {
console.log('Message sent successfully.');
} else {
console.error('Message failed with status:', pdu.command_status);
}
});
});
}
session.bind_transceiver({
system_id: 'your_system_id',
password: 'your_password',
}, (pdu) => {
if (pdu.command_status === 0) {
console.log('Connected');
const longMessage = 'Your very long message goes here...';
sendLongSms(session, 'destination_number', 'source_number', longMessage);
} else {
console.error('Failed to connect:', pdu.command_status);
}
});