2016-02-24 9 views
1

У меня возникла проблема с обработкой запросов МО из определенного соединения SMSC с помощью jsmpp.JSMPP - MO Получено, но короткое сообщение Байт-массив Пусто

Соответствующее соединение правильно связано и отлично работает для запросов MT; однако, когда мы получаем обратный вызов, который получен MO, свойство short_message PDU читается как пустое. Вот распечатка из того, что я вижу в журналах:

02:05:47,255 DEBUG [SmppConnectionManagerImpl] onAcceptDeliverSm: From: 9178386944 To: 2184 ESM: 0 Msg: 
02:05:47,255 DEBUG [SmppConnectionManagerImpl] BYTE ARRAY LENGTH 
02:05:47,256 DEBUG [SmppConnectionManagerImpl] 0 
02:05:47,256 DEBUG [SmppConnectionManagerImpl] COMMAND STATUS 
02:05:47,256 DEBUG [SmppConnectionManagerImpl] 0 
02:05:47,256 DEBUG [SmppConnectionManagerImpl] DATA CODING 
02:05:47,256 DEBUG [SmppConnectionManagerImpl] 0 
02:05:47,256 DEBUG [SmppConnectionManagerImpl] COMMAND LENGTH 
02:05:47,256 DEBUG [SmppConnectionManagerImpl] 114 
02:05:47,256 DEBUG [SmppConnectionManagerImpl] - 
02:05:47,256 DEBUG [SmppConnectionManagerImpl] 
02:05:47,256 DEBUG [SmppConnectionManagerImpl] - 
02:05:47,256 DEBUG [SmppConnectionManagerImpl] 
02:05:47,256 DEBUG [SmppConnectionManagerImpl] - 
02:05:47,256 DEBUG [SmppConnectionManagerImpl] 
02:05:47,256 DEBUG [SmppConnectionManagerImpl] - 
02:05:47,256 DEBUG [SmppConnectionManagerImpl] 
02:05:47,256 DEBUG [SmppConnectionManagerImpl] - 
02:05:47,256 DEBUG [SmppConnectionManagerImpl] 
02:05:47,256 DEBUG [SmppConnectionManagerImpl] ======== 

И код, который произвел его:

LOG.debug("onAcceptDeliverSm: From: {} To: {} ESM: {} Msg: {}", deliverSm.getSourceAddr(), 
deliverSm.getDestAddress(), deliverSm.getEsmClass(), new String(deliverSm.getShortMessage())); 
LOG.debug("BYTE ARRAY LENGTH"); 
LOG.debug(Integer.toString(deliverSm.getShortMessage().length)); 
LOG.debug("COMMAND STATUS"); 
LOG.debug(Integer.toString(deliverSm.getCommandStatus())); 
LOG.debug("DATA CODING"); 
LOG.debug(Integer.toString(new Byte(deliverSm.getDataCoding()).intValue())); 
LOG.debug("COMMAND LENGTH"); 
LOG.debug(Integer.toString(deliverSm.getCommandLength())); 
LOG.debug("-"); 
LOG.debug(new String(deliverSm.getShortMessage(), Charset.forName("US-ASCII"))); 
LOG.debug("-"); 
LOG.debug(new String(deliverSm.getShortMessage(), Charset.forName("ISO-8859-1"))); 
LOG.debug("-"); 
LOG.debug(new String(deliverSm.getShortMessage(), Charset.forName("UTF-16BE"))); 
LOG.debug("-"); 
LOG.debug(new String(deliverSm.getShortMessage(), Charset.forName("UTF-16LE"))); 
LOG.debug("-"); 
LOG.debug(new String(deliverSm.getShortMessage(), Charset.forName("UTF-16"))); 

Как вы можете видеть, мы получаем данные от SMSC; однако, когда мы пытаемся прочитать короткое сообщение, он возвращает пустой массив байтов. Другие поля (например, адрес источника и dest) возвращаются в порядке.

Кроме того, когда у нас есть люди, отправляющие переменную длину MOs, длина команды является переменной - это указывает на то, что данные есть, так или иначе, она просто не может быть прочитана по какой-либо причине.

Поблагодарили бы за какие-либо выводы о том, что может привести к тому, что массив байтов коротких сообщений будет возвращен как пустой и настройки конфигурации, чтобы попытаться исправить проблему.

ответ

0

Это в конечном итоге было проблемой с тем, как рассматривался SMSC в его ответах. В их случае вместо отправки данных сообщения в короткой части сообщения PDU данные сообщения отправлялись в необязательной части сообщения_пайпа PDU.

Вот код, который мы закончили с, чтобы разобрать сообщение

private String getMessageBody(DeliverSm deliverSm) { 
    byte[] bytes = Optional.ofNullable(deliverSm.getOptionalParameter(OptionalParameter.Message_payload.class)) 
     .map(x -> x.getValue()) 
     .filter(x -> x != null && x.length > 0) 
     .orElse(deliverSm.getShortMessage()); 

    return Optional.ofNullable(bytes) 
      .filter(x -> x != null && x.length > 0) 
      .map(x -> new String(x, UTF8)) 
      .orElse(""); 
} 
0

Был такой же проблема. Все, что мне нужно было решить, это перейти на jsmpp 2.2.jar.

Кроме того, код не может различать сообщения типа SMSC_DELIVERY_RECEIPT и сообщения типа MO.

Все эти «ошибки»? были исправлены, когда я обновился до новой библиотеки.

Спасибо.