2

我在使用 jsmpp 处理来自特定 SMSC 连接的 MO 请求时遇到问题。

有问题的连接已正确绑定并且非常适合 MT 请求;但是,当我们收到收到 MO 的回调时,PDU 的 short_message 属性读取为空白。这是我在日志中看到的打印内容:

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 获取数据;然而,当我们试图读出短消息时,它返回一个空字节数组。其他字段(如源地址和目标地址)返回正常。

此外,当我们让人们发送可变长度的 MO 时,命令长度是可变的 - 表明数据以某种方式存在,只是由于某种原因无法读取。

将不胜感激任何可能导致短消息字节数组作为空白和配置设置返回以尝试解决问题的事情的线索。

4

2 回答 2

1

这最终成为有问题的 SMSC 打包其响应的方式的问题。在他们的例子中,不是在 PDU 的 short_message 部分中发送消息数据,而是在 PDU 的可选 message_payload 部分中发送消息数据。

这是我们最终用来解析消息的代码

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("");
}
于 2016-05-04T05:41:57.293 回答
0

有同样的问题。我需要解决的只是升级到 jsmpp 2.2.jar。

另外,代码无法区分 SMSC_DELIVERY_RECEIPT 类型的消息和 MO 类型的消息。

所有这些“错误”?当我升级到较新的库时已修复。

谢谢。

于 2016-04-06T05:34:09.167 回答