2014-01-13 12 views
1

SMS gateway Innovativetxt.com에 SMPP 클라우드 - 호퍼 라이브러리를 SMS 긴 메시지에 사용하고 있지만 긴 메시지를 따라 140 바이트로 나누는 것처럼 보입니다. 각 메시지의 문자 수는 134 자입니다.SMPP 긴 메시지 및 메시지 분할 제출

그러나 업계 표준은 GSM 인코딩 된 긴 메시지의 각 부분에 대해 153 자이어야합니다. 우리가 140 바이트를 통해 나눌 때 단지 134 자 밖에 갖지 못하면서 뭔가 잘못 됐습니까? 140 바이트보다 큰 메시지를 제출하려고하면 게이트웨이 공급자가 메시지의 크기가 큰 메시지 본문으로이를 거부합니다.

각 140 바이트 씩 메시지를 보내면서 SMSC로 sbumit 할 때마다 메시지를 153 자로 분할해야합니다.

긴 메시지를 분할하는 가장 좋은 방법은 무엇입니까? 메시지 크기, 즉 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 바이트 유니 코드 문자 왼쪽 (16 비트)

도 참조 http://www.nowsms.com/long-sms-text-messages-and-the-160-character-limit

UDH 귀하의 경우와 마찬가지로 Contextated 메시지 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. 

는 GSM 153 개에 문자를 볼 수있는 바와 같이 134 바이트 마이너스 1 비트 같다. 아마도이 134 개의 문자는 자바가 당신에게보고하는 것입니다. 그러나 일단 긴 텍스트 메시지를 분리하면 텍스트와 UDH를 모두 포함하는 바이너리 메시지로 끝납니다. 그리고 메시지를 바이너리로 처리해야합니다. 바이너리 덤프를 생성 된 부분에서 제거하고 조사하는 것이 좋습니다. 짧거나 긴 SMS 모두를 보내는

0

안녕하세요 참조 샘플 방법

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