@uroot

Как отправить длинное SMS с помощью SMPP?

Я использую smpp.js, и я не могу найти информацию о разделении длинных сообщений. Когда я отправляю более длинное SMS, чем нужно, я просто вижу плохой статус и не вижу SMS в SMPP провайдере. Мой PDU в это время:

command_length: 17,
  command_id: 2147483652,
  command_status: 1,
  sequence_number: 3,
  command: 'submit_sm_resp',
  message_id: ''


Я не вижу никаких ошибок, потому что либа даже не отправляет мое SMS. Я думаю, что эта библиотека не может разделять SMS на автомате. А как тогда указать, что эти куски SMS это на самом деле одно SMS?
  • Вопрос задан
  • 124 просмотра
Пригласить эксперта
Ответы на вопрос 2
grantur5707
@grantur5707
Full Stack Web Developer
Для отправки длинных 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);
  }
});
Ответ написан
Vamp
@Vamp
Отправляйте текст через message_payload, а не short_message. В этом случае делением на сегменты будет заниматься провайдер.

Пример Данилы лучше не использовать. Нельзя втупую резать текст по 153 символа. А ещё там косяк с кодировкой.

Я не вижу никаких ошибок, потому что либа даже не отправляет мое SMS.

Дебажить SMPP - это боль и страдания (не зависит от используемого языка). Лучше всего снять дамп трафика и смотреть на сырые пдухи в wireshark. В идеале отправлять смски через другой протокол. Многие провайдеры предоставляют HTTP API.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы