2016-12-14 20 views
0

私はsmsゲートウェイを使用してSMSを送信するために使用されるjavaコードを書いています。 JAVA OpenSMPP APIは、SMPP要求を送信するロジックを実装するために使用されます。SmsはJava Webアプリケーションから受信していません

SMS_GATEWAY_USERNAME  906o2portt02  
SMS_GATEWAY_PORT   9205 S 
SMS_GATEWAY_IP_2   34.22.91.166  
SMS_GATEWAY_IP_1   80.77.67.145 

私はSMSを送信することが可能ですが、私は私がSMSを受信して​​いないどのような理由のために理解しない:私は、SMSゲートウェイに接続するために使用され、SMSを送信するために使用されている情報を下回る必要がありました。私はまた、エラーをチェックするために私のコードにデバッグステートメントを入れている。私はログファイルをチェックしたとき、私はSMSが送信されているという情報の下になっています。以前は別のポート番号、ユーザー名とパスワードを持っていました。同じJavaコードを使用してSMSを送受信できました。しかし、今私はこのゲートウェイにSMSを送信する必要があり、そのSMSも送信します。何らかの理由で私はSMSを受け取っていません。送信されたSMSに何が起こったかを確認する方法はありますか?以下は

enter image description here

私のコードです:

以下
public class SMSClient 
{ 
    private static final Logger logger = LoggerFactory 
      .getLogger(SMSClient.class); 

    @Autowired 
    private SMSSettings smsSettings; 

    @Autowired 
    private OracleSettings oracleSettings; 

    /** 
    * If the application is bound to the SMSC. 
    */ 
    boolean _bound = false; 

    public boolean send(String text, 
      List<AlertCommunicationAddress> toAddressesSMS) 
    { 
     List<String> toAddressesSMSString = new ArrayList<String>(); 
     for (AlertCommunicationAddress alertComAddr : toAddressesSMS) 
     { 
      List<AlertRecpGrpMember> recpMembers = alertComAddr 
        .getAlertRecipientsGroup().getAlertRecpGrpMembers(); 
      for (AlertRecpGrpMember recpMem : recpMembers) 
      { 
       // check here if the member belongs to the same environment on 
       // which SMS is being sent. 
       if ((recpMem.getIsDefault() != null && recpMem.getIsDefault() 
         .equalsIgnoreCase("Y")) 
         || (recpMem.getRunEnvironment() != null && recpMem 
           .getRunEnvironment().equalsIgnoreCase(
             oracleSettings.getRunEnv()))) 
       { 
        toAddressesSMSString.add(recpMem.getMember()); 
       } 
      } 

     } 

     logger.debug("Original SMS to be sent : " + text); 

     String smscHost1 = smsSettings.getHost1(); 
     Integer smscPort = smsSettings.getPort(); 

     if (toAddressesSMSString.isEmpty()) 
     { 
      return false; 
     } 

     for (String phoneNumber : toAddressesSMSString) 
     { 

      try 
      { 
       Session session = getSession(smscHost1, smscPort, 
         smsSettings.getUsername(), smsSettings.getPassword()); 
       if (session == null) 
       { 
        String smscHost2 = smsSettings.getHost2(); 
        logger.error("SMS --- Unable to get the session with Host 1 (" + smscHost1 + ":" + smscPort + ") , will try Host 2 (" + smscHost2 + ") now."); 
        session = getSession(smscHost2, smscPort, 
          smsSettings.getUsername(), 
          smsSettings.getPassword()); 

        if (session == null) 
        { 
         logger.error("SMS --- Unable to get the session with Host 1 (" + smscHost1 + ") and Host 2 (" + smscHost2 + "). Please check with the SMS Gateway."); 
         return false; 
        } 
       } 

       logger.debug("SMS --- Created Session object " + session); 

       SubmitSM request = new SubmitSM(); 
       request.setSourceAddr(new Address((byte) 5, (byte) 0, 
         "RM2Support")); 
       request.setDestAddr(createAddress(phoneNumber)); 

       request.setProtocolId((byte) 0); 
       request.setPriorityFlag((byte) 0); 
       request.setRegisteredDelivery((byte) 1); // we want delivery 
                  // reports 
       request.setDataCoding((byte) 0); 
       request.setSmDefaultMsgId((byte) 0); 
       // request.setScheduleDeliveryTime(deliveryTime); // you can 
       // skip 
       // this 
       request.setReplaceIfPresentFlag((byte) 0); 

       // Send the request 
       request.assignSequenceNumber(true); 

       // this is to send long messages 
       request.setEsmClass((byte) Data.SM_UDH_GSM); 

       String[] splittedMsg = splitMessage(text, 153); 

       int totalSegments = splittedMsg.length; 

       logger.debug("SMS : Number of splitted segments :: " 
         + totalSegments); 

       // iterating on splittedMsg array. Only Sequence Number and 
       // short 
       // message text will change each time 

       Random random = new Random(); 

       int randomInt = random.nextInt(); 

       logger.debug("SMS---- Reference Number : " + randomInt); 

       for (int i = 0; i < totalSegments; i++) 
       { 

        ByteBuffer ed = new ByteBuffer(); 

        ed.appendByte((byte) 5); // UDH Length 

        ed.appendByte((byte) 0x00); // IE Identifier 

        ed.appendByte((byte) 3); // IE Data Length 

        ed.appendByte((byte) randomInt); // Reference Number 

        ed.appendByte((byte) totalSegments); // Number of pieces 

        ed.appendByte((byte) (i + 1)); // Sequence number 

        ed.appendString(splittedMsg[i], Data.ENC_ASCII); 

        request.setShortMessageData(ed); 

        logger.debug("Hello...reached here...now about the submit the request::::"); 

        SubmitSMResp response = session.submit(request); 

        logger.debug("SMS --- Submit response " 
          + response.getCommandStatus()); 

        // response = smsSession.submitMulti(request); 
        logger.debug("SMS --- Submit response " 
          + response.getCommandStatus()); 
        String messageId = response.getMessageId(); 
        logger.debug("SMS --- Message ID = " + messageId); 

       } 

       enquireLink(session); 
       unbind(session); 

      } catch (Exception e) 
      { 
       logger.debug("Exception while sending SMS with Phone number :::" + phoneNumber + "::::" + e); 
       continue; 
      } 
     } 

     return true; 
    } 

    private Session getSession(String smscHost, int smscPort, 
      String smscUsername, String smscPassword) throws Exception 
    { 
     try 
     { 

      TCPIPConnection connection = new TCPIPConnection(smscHost, smscPort); 
      connection.setReceiveTimeout(6000); 
      connection.setIOBufferSize(8188); 
      connection.setReceiveBufferSize(8188); 
      Session session = new Session(connection); 

      // bind now 

      if (_bound) 
      { 
       logger.debug("Already bound, unbind first."); 
       return session; 
      } 

      BindRequest request = new BindTransmitter(); 
      request.setSystemId(smscUsername); 
      request.setPassword(smscPassword); 
      // request.setSystemType(systemType); 
      // request.setAddressRange(addressRange); 
      request.setInterfaceVersion((byte) 0x34); // SMPP protocol version 

      logger.debug("SMS --- Bind request :: " + request.debugString()); 

      logger.debug("SMS --- Created Session object :: " + session); 

      BindResponse response = session.bind(request); 
      logger.debug("Bind response " + response.debugString()); 

      if (response.getCommandStatus() == Data.ESME_ROK) 
      { 
       logger.debug("SMS --- Binded with SMSC Server"); 
       _bound = true; 

      } else 
      { 
       logger.error("SMS --- Unable to bind with SMSC Server :: Code :: " 
         + response.getCommandStatus()); 
      } 
      Integer respCode = new Integer(response.getCommandStatus()); 
      logger.debug("SMS -- Response Code ::" + respCode); 
      response.setCommandStatus(respCode); 
      Integer comLength = new Integer(response.getCommandLength()); 
      logger.debug("SMS -- CommandLength ::" + comLength); 
      response.setCommandLength(comLength); 
      logger.debug("SMS --- Response from SMSC" + response.toString()); 

      return session; 
     } catch (WrongLengthOfStringException e) 
     { 
      logger.error("SMS -- Wrong length string exception" 
        + e.getMessage()); 

     } catch (ValueNotSetException e) 
     { 
      logger.error("SMS -- Value not set exception" + e.getMessage()); 

     } catch (TimeoutException e) 
     { 
      logger.error("SMS -- Timeout exception " + e.getMessage()); 

     } catch (PDUException e) 
     { 
      logger.error("SMS -- PDU exception " + e.getMessage()); 

     } catch (WrongSessionStateException e) 
     { 
      logger.error("SMS -- Wrong Session exception " + e.getMessage()); 

     } catch (IOException e) 
     { 
      logger.error("SMS --- Could not able to connect the host/port or Check the Username/Password for connection ::" 
        + e.getMessage()); 
     } catch (Exception e) 
     { 
      logger.error("SMS -- Error while sending SMS :: " + e.getMessage()); 
     } 
     return null; 
    } 

    private Address createAddress(String address) 
      throws WrongLengthOfStringException 
    { 
     Address addressInst = new Address(); 
     addressInst.setTon((byte) 5); // national ton 
     addressInst.setNpi((byte) 0); // numeric plan indicator 
     addressInst.setAddress(address, Data.SM_ADDR_LEN); 
     logger.debug("SMS -------- Address :: " + addressInst); 
     return addressInst; 
    } 

    private Session unbind(Session session) 
    { 
     try 
     { 
      if (!_bound) 
      { 
       System.out.println("Not bound, cannot unbind."); 
       return session; 
      } 

      // send the request 
      logger.debug("Going to unbind."); 
      if (session.getReceiver().isReceiver()) 
      { 
       logger.debug("SMS --- Unbinding --- It can take a while to stop the receiver."); 
      } 
      UnbindResp response = session.unbind(); 
      logger.debug("Unbind response " + response.debugString()); 
      _bound = false; 

     } catch (Exception e) 
     { 
      logger.debug("Unbind operation failed. " + e); 
     } 
     return session; 
    } 

    /** 
    * Creates a new instance of <code>EnquireSM</code> class. This PDU is used 
    * to check that application level of the other party is alive. It can be 
    * sent both by SMSC and ESME. 
    * 
    * See "SMPP Protocol Specification 3.4, 4.11 ENQUIRE_LINK Operation." 
    * 
    * @see Session#enquireLink(EnquireLink) 
    * @see EnquireLink 
    * @see EnquireLinkResp 
    */ 
    private void enquireLink(Session session) 
    { 
     try 
     { 
      EnquireLink request = new EnquireLink(); 
      EnquireLinkResp response; 
      logger.debug("SMS ---- Enquire Link request " 
        + request.debugString()); 
      response = session.enquireLink(request); 
      logger.debug("SMS --- Enquire Link response " 
        + response.debugString()); 
     } catch (Exception e) 
     { 
      logger.debug("SMS ---- Enquire Link operation failed :: " + e); 
     } 
    } 

    private String[] splitMessage(String s, int size) 
    { 
     if (s == null || size <= 0) 
      return null; 
     int chunks = s.length()/size + ((s.length() % size > 0) ? 1 : 0); 
     String[] arr = new String[chunks]; 
     for (int i = 0, j = 0, l = s.length(); i < l; i += size, j++) 
      arr[j] = s.substring(i, Math.min(l, i + size)); 
     return arr; 
    } 
} 

は私が送信が/ SMSを受信しながら、検討する必要があるパラメータです。しかし、私は本当にJAVA OpenSMPP APIは、この設定を使用するかどうか知らない:

enter image description here

+1

をすることができます送受信のコードを教えてください。 – pringi

+0

また、Java OpenSMPPの代わりにhttps://github.com/fizzed/cloudhopper-smppを使用することをお勧めします。私の視点からは、ヒョウチョウは最新で使いやすくなっています – pringi

+0

問題のアタッチされたコードを見つけてください。私はOpenSMPPを使う必要があります。この理由から私はこのAPIを使用しました。 – Andrew

答えて

1

あなたはあなたに(https://github.com/OpenSmpp/opensmpp/blob/master/client/src/main/java/org/smpp/test/SMPPTest.javaから)メッセージを起こったかどうか確認するためにSMPPサーバーを照会するには、次のコードを使用することができます。

/** 
    * Creates a new instance of <code>QuerySM</code> class, lets you set 
    * subset of fields of it. This PDU is used to fetch information 
    * about status of already submitted message providing that you 'remember' 
    * message id of the submitted message. The message id is assigned 
    * by SMSC and is returned to you with the response to the submision 
    * PDU (SubmitSM, DataSM etc.). 
    * 
    * See "SMPP Protocol Specification 3.4, 4.8 QUERY_SM Operation." 
    * @see Session#query(QuerySM) 
    * @see QuerySM 
    * @see QuerySMResp 
    */ 
    private void query() { 
     debug.enter(this, "SMPPTest.query()"); 
     try { 
      QuerySM request = new QuerySM(); 
      QuerySMResp response; 

      // input values 
      messageId = getParam("Message id", messageId); 
      sourceAddress = getAddress("Source", sourceAddress); 

      // set values 
      request.setMessageId(messageId); 
      request.setSourceAddr(sourceAddress); 

      // send the request 
      System.out.println("Query request " + request.debugString()); 
      if (asynchronous) { 
       session.query(request); 
      } else { 
       response = session.query(request); 
       System.out.println("Query response " + response.debugString()); 
       messageId = response.getMessageId(); 
      } 

     } catch (Exception e) { 
      event.write(e, ""); 
      debug.write("Query operation failed. " + e); 
      System.out.println("Query operation failed. " + e); 
     } finally { 
      debug.exit(this); 
     } 
} 
+0

ありがとう、私は上記のコードを使用してSMSを送信すると何が起きたのか確認しようとします – Andrew

+0

私はあなたのコードを使用しましたが、まだ送信メッセージが受信されていない理由を理解していません。私はSMSを送受信するためのより多くのパラメータを使用する必要があるかもしれませんが、私はこのパラメータがJAVA OpenSMPP APIで既に使用されているかどうかはわかりません。あなたはこれについて考えていますか?私はコード内のパラメータを言及しました – Andrew

+0

私はOpenSMPP v3.4を使用しています – Andrew

関連する問題