Клиент Java для получателя SMPP

Я создал Java-программу для прослушивания SMPP-сервера и захвата SMS, отправленного на этот сервер, он работает нормально, но через определенные промежутки времени я получаю разные типы ошибок, как показано ниже.

Также может кто-нибудь сказать мне, как внести изменения, чтобы этот Java-код фиксировал только сообщения, отправленные вам конкретным SC

ERROR: com.logica.smpp.pdu.EnquireLink cannot be cast to com.logica.smpp.pdu.DeliverSM ERROR:com.logica.smpp.pdu.Unbind cannot be cast to com.logica.smpp.pdu.DeliverSM

И мой код выглядит следующим образом:

import com.logica.smpp.Data;
import com.logica.smpp.Session;
import com.logica.smpp.TCPIPConnection;
import com.logica.smpp.pdu.BindReceiver;
import com.logica.smpp.pdu.BindRequest;
import com.logica.smpp.pdu.BindResponse;
import com.logica.smpp.pdu.DeliverSM;
import com.logica.smpp.pdu.PDU;

public class SimpleSMSReceiver {
/** * Parameters used for connecting to SMSC (or SMPPSim)*/
    private Session session = null;
    private String ipAddress = "localhost";
    private String systemId = "smppclient1";
    private String password = "password";
    private int port = 2775;

/** * @param args */
    public static void main(String[] args) {
        System.out.println("Sms receiver starts");
        SimpleSMSReceiver objSimpleSMSReceiver = new SimpleSMSReceiver();
        objSimpleSMSReceiver.bindToSmsc();
        while(true) {
            objSimpleSMSReceiver.receiveSms();
        }
    }
    private void bindToSmsc() {
        try {
            // setup connection
            TCPIPConnection connection = new TCPIPConnection(ipAddress, port);
            connection.setReceiveTimeout(20 * 1000);
            session = new Session(connection);
            // set request parameters
            BindRequest request = new BindReceiver();
            request.setSystemId(systemId);
            request.setPassword(password);
            // send request to bind
            BindResponse response = session.bind(request);
            if (response.getCommandStatus() == Data.ESME_ROK) {
                System.out.println("Sms receiver is connected to SMPPSim.");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    private void receiveSms() {
        try {
            PDU pdu = session.receive(1500);
            if (pdu != null) {
                DeliverSM sms = (DeliverSM) pdu;
                if ((int)sms.getDataCoding() == 0 ) {
                    //message content is English
                    System.out.println("***** New Message Received *****");
                    System.out.println("From: " + sms.getSourceAddr().getAddress());
                    System.out.println("To: " + sms.getDestAddr().getAddress());
                    System.out.println("Content: " + sms.getShortMessage());
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Пожалуйста, отформатируйте свой код; удалить пустые строки; и свести к минимуму только актуальность вопроса.

soufrk 05.06.2018 11:38

Да, сделал это, это первый раз, когда я публикую вопрос, пожалуйста, не обращайте внимания, если появляются какие-либо крошечные ошибки :)

Anjay Ranjith 05.06.2018 11:45
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
1 003
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

PDU не всегда может быть DeliverSM.

Попробуй это:

PDU pdu = session.receive(1500);
if ((pdu != null) && (pdu instanceof DeliverSM)) {
    ...
    DeliverSM sms = (DeliverSM) pdu;

Как видите, SMSC отправляет Heartbeats (EnquireLink), поэтому вы также должны положительно ответить на них. В случае, если вы не подтверждаете сердцебиение, сервер решит, что соединение отключено, и закроет его (Unbind).

Другие вопросы по теме