SMPP提交长消息和消息拆分

时间:2014-01-13 18:28:15

标签: java sms sms-gateway smpp jsmpp

我们正在使用SMPP cloud-hopper库将短长消息发送到SMS gateway Innovativetxt.com,但似乎我们在长消息后拆分TO 140字节的每个部分。每条消息中的字符数达到134个字符。

然而,行业标准是一种153字符应为GSM编码长消息的每一部分。当我们通过140字节分割时,只有134个字符,我们做错了吗?如果我们尝试提交大于140字节的消息,网关提供商会使用消息超大邮件正文拒绝它。

应将消息拆分为每个153个字符,然后分配给SMSC,而不是每个消息140字节。

分割长消息的最佳方法是什么?消息大小,即140字节或消息字符数?

任何人都会通过cloudhopper或其他基于Java的库面临同样的问题。

2 个答案:

答案 0 :(得分:9)

这是一个常见的混乱。你正在做的一切正确。消息长度可以是160个字符(7位GSM 03.38),140个字符(8位拉丁语),70个字符(16位UCS-2)。注意:160 * 7 == 140 * 8 == 70 * 16.

当您拆分长消息时,其他信息(如总部件号和部件索引)将存储在消息正文中,即所谓的用户数据头(UDH)。此标题也会发生。因此,使用UDH,您可以使用153个GSM字符(7位),134个字符/字节(8位)有效负载或67个2字节 - unicode字符(16位)

另见http://www.nowsms.com/long-sms-text-messages-and-the-160-character-limit

对于8位连续消息,UDH的长度为6个字节,如您的情况。

UDH结构

0x05: Length of UDH (5 bytes to follow)
0x00: Concatenated message Information Element (8-bit reference number)
0x03: Length of Information Element data (3 bytes to follow)
0xXX: Reference number for this concatenated message
0xYY: Number of fragments in the concatenated message
0xZZ: Fragment number/index within the concatenated message
Total message length, bits: 160*7 = 140*8 = 1120
UDH length, bits: 6*8 = 48
Left payload, bits: 1120-48 = 1072
For GSM 03.38 you get 1072/7 = 153 GSM (7-bit) chars + 1 filling unused bit.
For Latin you get 1072/8 = 134 (8-bit) chars.
For UCS-2 you get 1072/16 = 67 (16-bit) chars.

如您所见,153个GSM字符等于134个字节减1位。这些134个字符可能就是Java报告的内容。但是,一旦分割了长文本消息,最终会得到包含文本和UDH的二进制消息。你应该将消息视为二进制。我建议你从结果部分中进行二进制转储并进行调查。

答案 1 :(得分:1)

您好请参阅发送短消息或长短消息的示例方法

    public synchronized String sendSMSMessage(String aMessage,
        String aSentFromNumber, String aSendToNumber,
        boolean requestDeliveryReceipt) {
    byte[] textBytes = CharsetUtil.encode(aMessage,
            CharsetUtil.CHARSET_ISO_8859_1);

    try {
        SubmitSm submitMsg = new SubmitSm();

        // add delivery receipt if enabled.
        if (requestDeliveryReceipt) {
            submitMsg
                    .setRegisteredDelivery(SmppConstants.REGISTERED_DELIVERY_SMSC_RECEIPT_REQUESTED);
        }
        submitMsg.setSourceAddress(new Address((byte) 0x03, (byte) 0x00,
                aSentFromNumber));
        submitMsg.setDestAddress(new Address((byte) 0x01, (byte) 0x01,
                aSendToNumber));
         if (textBytes != null && textBytes.length > 255) {
             submitMsg.addOptionalParameter(new Tlv(SmppConstants.TAG_MESSAGE_PAYLOAD, textBytes, "message_payload"));
         }else{
             submitMsg.setShortMessage(textBytes);
         }

        logger.debug("About to send message to " + aSendToNumber
                + ", Msg is :: " + aMessage + ", from :: "
                + aSentFromNumber);

        SubmitSmResp submitResp = smppSession.submit(submitMsg, 15000);

        logger.debug("Message sent to " + aSendToNumber
                + " with message id " + submitResp.getMessageId());
        return submitResp.getMessageId();
    } catch (Exception ex) {
        logger.error("Exception sending message [Msg, From, To] :: ["
                + aMessage + ", " + aSentFromNumber + ", " + aSendToNumber,
                ex);
    }

    logger.debug("Message **NOT** sent to " + aSendToNumber);
    return "Message Not Submitted to " + aSendToNumber;
}