2016-12-14 16 views
0

Я написал код Java, который используется для отправки смс с помощью шлюза sms. JAVA OpenSMPP API используется для реализации логики отправки запроса SMPP. Я нуждался ниже информации, которая используется для подключения к шлюзу смс и который используется для отправки смс:Sms не получает от java веб-приложения

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 

Я могу отправить смс, но я не понимаю, по какой причине я не получаю смс. Я также поместил инструкцию debug в свой код, чтобы проверить наличие ошибки. Когда я проверил файл журнала, я получаю ниже информацию, в которой говорится, что sms был отправлен. Раньше у меня был другой номер порта, имя пользователя и пароль, и я смог отправлять и получать sms с использованием одного и того же кода Java. Но теперь у меня есть требование отправить 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

Также я могу предложить вам использовать https://github.com/fizzed/cloudhopper-smpp вместо Java OpenSMPP. С моей точки зрения cloudhopper более современен и проще в использовании. – pringi

+0

. У меня есть требование использовать OpenSMPP. По этой причине я использовал этот api. – Andrew

ответ

1

Вы можете использовать следующий код для запроса сервер SMPP, чтобы проверить, что случилось с вами сообщение (от https://github.com/OpenSmpp/opensmpp/blob/master/client/src/main/java/org/smpp/test/SMPPTest.java):

/** 
    * 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

ok Спасибо, я попытаюсь проверить, что произошло с отправкой sms, используя приведенный выше код. – Andrew

+0

Я использовал ваш код, но до сих пор не понимаю, почему сообщение отправки не было получено. Мне может потребоваться использовать больше параметров для отправки/получения смс, но я не знаю, были ли эти параметры уже использованы JAVA OpenSMPP API, которые я использую. У вас есть идея об этом. Я упомянул параметры в коде – Andrew

+0

Я использую OpenSMPP v3.4 – Andrew

 Смежные вопросы

  • Нет связанных вопросов^_^