我们正在使用SMPP cloud-hopper库将SMS长消息短信发送到SMS网关 Innovativetxt.com,但看起来我们拆分后的长消息TO 140字节各部分.每条消息中的字符数达到134个字符.
但是行业标准是一种153字符应为GSM编码长消息的每一部分.当我们通过140字节分割时,只有134个字符,我们做错了吗?如果我们尝试提交大于140字节的消息,网关提供商会使用消息超大邮件正文拒绝它.
应将消息拆分为每个153个字符,然后再分配给SMSC,而不是每个消息140字节.
拆分长消息的最佳方法是什么?通过消息大小,即140字节或消息字符计数?
任何人都可以通过cloudhopper或其他基于Java的库来解决相同的问题.
这是一个常见的混乱.你正在做的一切正确.消息长度可以是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
对于Contatenated消息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的二进制消息.你应该将消息视为二进制.我建议你从结果部分中进行二进制转储并进行调查.