未从java web应用程序接收Sms

未从java web应用程序接收Sms,sms,java,opensmpp,Sms,Java,Opensmpp,我已经编写了java代码,用于使用sms网关发送smsJAVA OpenSMPP API用于实现发送SMPP请求的逻辑。我需要以下用于连接sms网关和发送sms的信息: 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 我可以发送

我已经编写了java代码,用于使用sms网关发送sms
JAVA OpenSMPP API
用于实现发送
SMPP
请求的逻辑。我需要以下用于连接sms网关和发送sms的信息:

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 
我可以发送短信,但我不明白为什么我没有收到短信。我还将调试语句放在代码中,以检查是否有任何错误。当我检查日志文件时,我得到以下信息,说明短信已发送。以前我有不同的端口号、用户名和密码,我能够使用相同的java代码发送和接收短信。但是现在我需要在这个网关上发送短信,而且它也发送短信。但由于某些原因,我没有收到短信。有没有办法检查我发送的短信发生了什么

下面是我的代码:

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
是否使用以下设置:


您可以使用以下代码查询SMPP服务器,以检查您收到的消息(来自):


您能告诉我们发送/接收的代码吗?我也建议您使用Java OpenSMPP代替。从我的观点来看,cloudhopper更为最新,更易于使用,请立即查找相关的附件代码。我需要使用OpenSMPP。出于这个原因,我使用了这个api。您知道SMPP服务器中使用的是什么版本吗?Java Open SMPP仅支持版本3.0我不知道SMPP服务器中使用的版本。但这不应该是个问题,对吗?因为在使用其他连接网关详细信息时,我能够发送/接收短信。谢谢。我将尝试使用上述代码检查发送短信的情况。我使用了您的代码,但仍然不理解为什么没有收到发送消息。我可能需要使用更多的参数来发送/接收sms,但我不知道我正在使用的JAVA OpenSMPP API是否已经使用了这些参数。你知道这件事吗。我在代码中提到了参数我正在使用OpenSMPP v3.4您可以捕获PDU(例如wireshark)并查看发送的内容。在OpenSmpp源代码()中设置了TON和NPI。它是从您指定的地址派生的。我在前面提到的答案中使用了您的代码,并添加了一些调试语句,现在我可以在日志文件中看到错误消息。此消息为DEBUG SMSClient:220-发送手机号码为:004917691454555:::java.lang.NullPointerException的短信时出现异常。它会生成文本,在连接网关时不会显示错误,但在向手机号码发送短信时会显示错误
/**
     * 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);
        }
}