2014-01-13 58 views
1

我们使用SMPP云料斗库很长很长的邮件短信SMS gateway Innovativetxt.com,但它似乎是,当我们分开的长消息到140个字节的每个部分下面。每封邮件中的字符数达到134个字符。SMPP提交长消息和消息拆分

但是行业标准是一种153字的应是GSM编码长消息的每个部分。当我们通过140个字节进行分割时,只有134个字符,这是否有问题?如果我们试图提交大于140字节的消息,网关提供商会用超大的消息体来拒绝它。

应被该消息被划分到153字符的每个到sbumit到SMSC,代替经由每个140个字节吐涎的消息。

什么是拆分长信息的最佳方式?按消息大小即140字节或消息字符计数?

任何人都面临着通过cloudhopper或其它基于Java的库,我们怎么办同样的问题。

回答

8

这是一个普遍的混乱。你做的一切都是正确的。消息长度可以是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

的UDH Continentated消息8位长度为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的二进制消息。你应该把这个消息当作二进制。我建议你从结果部分中进行二进制转储并进行调查。

0

用于发送两个短或长SMS你好见样品的方法

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; 
}