Вопрос по Smpp

  • Автор темы trueRevenant
  • Дата начала
T

trueRevenant

Всем доброго времени суток!

Недавно я разработал приложение для рассылки SMS-сообщений абонентам через шлюз SMPP.
Все работало хорошо, пока не возникла потребеность отправке более длинных сообщений (в моем случае более 70 русских символов). в документации по используемой мной библиотеке которую откопал в интернете я прочел чтобы удлинить передаваемое сообщение нужно записать его в поле message_payload и что оно не должно использоваться совместно с полем short_message. Путем примеров из различных источников я изменил метод отправки.
Для наглядности код ДО:
Код:
public void sendSMS(String number, String text) throws IOException, PDUException, ValueNotSetException, TimeoutException, WrongSessionStateException
02
{
SubmitSM submitSm = new SubmitSM();
SubmitSMResp response;
submitSm.setSourceAddr((byte) 5, (byte) 0, "Источник");
submitSm.setDestAddr((byte) 1, (byte) 1, number);
submitSm.setShortMessage(convert_str(text));
submitSm.setRegisteredDelivery((byte) 1);
submitSm.setDataCoding((byte) 8);
submitSm.assignSequenceNumber(true);
System.out.println("Submit request " + submitSm.debugString());
response = session.submit(submitSm);
System.out.println("Submit response " + response.debugString() + " MESSAGE ID : " + response.getMessageId());	  
}
метод convert_str перевод сообщение в кодировку UTF16_BE

код ПОСЛЕ:
Код:
public void sendSMS(String number, String text) throws IOException, PDUException, ValueNotSetException, TimeoutException, WrongSessionStateException
{
ByteBuffer buf = new ByteBuffer();
buf.appendByte((byte) 6);
buf.appendByte((byte) 5);
buf.appendByte((byte) 4);
buf.appendShort((short)0x1581);
buf.appendShort((short)0x0000);
buf.appendBytes(text.getBytes(Data.ENC_UTF16_BE), text.length());
SubmitSM submitSm = new SubmitSM();
SubmitSMResp response;
submitSm.setSourceAddr((byte) 5, (byte) 0, "Источник");
submitSm.setDestAddr((byte) 1, (byte) 1, number);
submitSm.setMessagePayload(buf);
submitSm.setRegisteredDelivery((byte) 1);
submitSm.setDataCoding((byte)0x0F5);
submitSm.setEsmClass((byte)(Data.SM_UDH_GSM));
submitSm.assignSequenceNumber(true);
System.out.println("Submit request " + submitSm.debugString());
response = session.submit(submitSm);
System.out.println("Submit response " + response.debugString() + " MESSAGE ID : " + response.getMessageId());
}
При данных изменениях Сообщение приходит на телефон адресата, но нечитаемо (Текст - "Сообщение невозможно прочитать").
Некоторые строки я брал их примеров и они до сих пор мне не понятны если честно. Проблема в том что я не смог в инете найти внятного описания и примеров как работать с полем message_payload.

Может кто-нибудь с этим сталкивался? Жду ваших комментариев. Заранее спасибо.
 
L

LuMee

Нашел вот в интернетах. Там в комментах приводится кусок кода для отправки длинных сообщеий. Ваш код, который ПОСЛЕ, судя по всему, основывается на примере из FAQ для отсылки рингтона, что, по всей видимости, не годится для текста.
 

dimat

Well-known member
31.07.2008
508
0
BIT
0
как вариант использовать другой шлюз, который сам разбивает сообщение на куски
 
T

trueRevenant

шлюз в моем распоряжении к сожалению только 1
 
T

trueRevenant

при дальнейшем поиске решения я наткнулся на новую проблему:
сейчас код отправки выглядит так:
Код:
			SubmitSM submitSm = new SubmitSM();
SubmitSMResp resp;
submitSm.setDataCoding((byte) 8);
submitSm.setRegisteredDelivery((byte) 1);
submitSm.setEsmClass((byte)(Data.SM_UDH_GSM));
submitSm.setSourceAddr((byte) 5, (byte) 0, "EATPBank");
submitSm.setDestAddr((byte) 1, (byte) 1, number);
ByteBuffer payload = new ByteBuffer();
System.out.println(text);
System.out.println(text.length());
payload.appendString(text, Data.ENC_UTF16_BE);
System.out.println("Submit request " + submitSm.debugString());
System.out.println(payload.length());
submitSm.setMessagePayload(payload);
resp = session.submit(submitSm);
System.out.println("Submit response " + resp.debugString() + " MESSAGE ID : " + resp.getMessageId());

но при отправке сообщения более 70 русских символов, сообщение просто не доходит до адресата. если 70 или менее то все нормально доходит и читается.
хотя поле для больших сообщений. чем это обусловлено пока понять не могу.
 
T

trueRevenant

В дополнение к моему последнему посту.
Ответ со шлюза возвращает ошибку в resp.getCommandStatus() = 192. перевел ее в HEX получил 0x000000C0. Почитал спецификацию протокола. 0x000000C0 - Error in the optional part of the PDU Body.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!