我们正在使用SMPP cloud-hopper库将短长消息发送到SMS gateway Innovativetxt.com,但似乎我们在长消息后拆分TO 140字节的每个部分。每条消息中的字符数达到134个字符。
然而,行业标准是一种153字符应为GSM编码长消息的每一部分。当我们通过140字节分割时,只有134个字符,我们做错了吗?如果我们尝试提交大于140字节的消息,网关提供商会使用消息超大邮件正文拒绝它。
应将消息拆分为每个153个字符,然后分配给SMSC,而不是每个消息140字节。
分割长消息的最佳方法是什么?消息大小,即140字节或消息字符数?
任何人都会通过cloudhopper或其他基于Java的库面临同样的问题。
答案 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;
}