powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / SMPP. прием ответов с смс-шлюза
10 сообщений из 10, страница 1 из 1
SMPP. прием ответов с смс-шлюза
    #38559562
true_revenant
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем доброго времени суток!

Собственно ситуация. Я реализовал сканер, который в потоке слушает смс-шлюз на предмет ответных сообщений (пакетов deliverySM). Но меня смущает его работа. Например вчера мной были отправлены порядка 100 сообщений.

Нарекания:
Например если сканер запустить сегодня то он примет все ответные пакеты, но если при его работе я отправлю сообщение то он по долгу висит и не принимает deliverySM. Если перезапустить сканер, то он снова примет пакеты за все вчерашние сообщения и ни слова о только что отправленном.

вот исходник моего класса ресивера
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
public class Receiver extends Thread
{
    private Session session = null;
    //private Event event;
    //private Debug debug;
    PrintStream err = null;
    PrintStream out = null;

    public Receiver()
    {
        initLog();
        System.out.println("init!");
        init();
    }

    private void init()
    {
        try
        {
            System.out.println("Инициализация соединения..");
            session = new Session(new TCPIPConnection("<address>", <port>));

            BindRequest breq = new BindReceiver();
            breq.setSystemId("<login>");
            breq.setPassword("<password>");

            Response resp = session.bind(breq);

            if (resp != null)
            {
                long commandStatus = resp.getCommandStatus();
                System.out.println("статус команды - " + resp.getCommandStatus());
                if (resp.getCommandStatus() != Data.ESME_ROK)
                {
                    System.out.println("Ошибка при инициализации!");
                    throw new IOException("Bind failed with error: " + commandStatus + ".");
                }

                System.out.println("Инициализация прошла успешно!");
                //break;
            }
        }
        catch (Exception ex)
        {
            System.out.println("Ошибка при инициализации!");
            Logger.getLogger(Receiver.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    @Override
    public void run()
    {
        System.out.println("**********Receiver Started***************");
        while (true)
        {
            System.out.println("receive!");
            PDU pdu = receive();
            if (pdu != null)
            {
                System.out.println(pdu.getClass().getName());
                if (pdu instanceof DeliverSM)
                {
                    System.out.println("DeliverSM");
                    //System.out.println("Command status = " + pdu.getCommandStatus());
                    DeliverSM deliverSm = (DeliverSM) pdu;
                    //DeliverSMResp resp = new DeliverSMResp();
                    //resp.setSequenceNumber(deliverSm.getSequenceNumber());
                    //System.out.println("Sending DeliverSmResp.");
                    System.out.println("Получатель: " + deliverSm.getSourceAddr().getAddress());
                    System.out.println(deliverSm.getShortMessage());
                    //System.out.println("Deliver response " + resp.debugString() + " MESSAGE ID : " + resp.getMessageId() + " CommandStatus: " + resp.getCommandStatus());
                }
                else
                {
                    System.out.println("SubmitSMResp");
                    SubmitSMResp s = (SubmitSMResp) pdu;
                    System.out.println(s.debugString());
                    System.out.println("MESSAGE ID: " + s.getMessageId());
                    System.out.println("Command status = " + s.getCommandStatus());
                }
            }
            try
            {
                Thread.sleep(2000);
            }
            catch (InterruptedException e)
            {
                e.printStackTrace();
            }
        }
    }

    private void initLog()
    {
        try
        {
            err = new PrintStream(new FileOutputStream(get_jar_location() + "/SMSLog_error.log", true));
            out = new PrintStream(new FileOutputStream(get_jar_location() + "/SMSLog_sys.log", true));
            System.setErr(err);
            System.setOut(out);
        }
        catch (FileNotFoundException ex)
        {
            Logger.getLogger(Receiver.class.getName()).log(Level.SEVERE, null, ex);
        }
        //        } finally {
        //            err.close();
        //            out.close();
    }

    private String get_jar_location()
    {
        ProtectionDomain pd = getClass().getProtectionDomain();
        CodeSource cs = pd.getCodeSource();
        String full = cs.getLocation().getPath();
        String res = "";
        //System.out.println("Каталог с программой = " + cs.getLocation().getPath());

        for (int i = full.length() - 1; i > 0; i--)
        {
            if (full.charAt(i) == '/')
            {
                res = full.substring(0, i + 1);
                break;
            }
        }
        return res;
    }

    private PDU receive()
    {
        PDU pdu = null;
        try
        {
            pdu = session.receive();
            // pdu = session.getReceiver().receive();
            if (pdu != null)
            {
                pdu.debugString();
                // System.out.println("Received PDU " + pdu.debugString());
            }
            else
            {
                // System.out.println("No PDU received this time.");
            }
        }
        catch (Exception e)
        {
            //event.write(e, "");
            //debug.write("Receiving failed. " + e);
            //System.out.println("Receiving failed. " + e);
        }
        finally
        {
            // debug.exit(this);
        }
        return pdu;
    }
}
...
Рейтинг: 0 / 0
SMPP. прием ответов с смс-шлюза
    #38559573
true_revenant
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
и в мейне соответственно вызываю метод старт.

спасибо заранее за ответы. если нужна еще информация то готов предоставить
...
Рейтинг: 0 / 0
SMPP. прием ответов с смс-шлюза
    #38560425
Alex Kuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
true_revenant,

А Вы спецификацию протокола внимательно читали?
Там ведь чётко написано, что для deliver_sm сервер ожидает ответ deliver_sm_resp.
А у Вас его почему-то не видно. Вот сервер и не удаляет у себя из очереди PDU пакеты, а шлёт их повторно...

PS. Про код ничего говорить не буду
...
Рейтинг: 0 / 0
SMPP. прием ответов с смс-шлюза
    #38560672
true_revenant
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я понял вас. переделал. сейчас метод, который слушает выглядит так:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
    @Override
    public void run()
    {
        System.out.println("**********Receiver Started***************");
        while (true)
        {
            System.out.println("receive!");
            PDU pdu = receive();
            System.out.println("received!");
            if (pdu != null)
            {
                System.out.println(pdu.getClass().getName());
                if (pdu instanceof DeliverSM)
                {
                    try 
                    {
                        System.out.println("DeliverSM");
                        //System.out.println("Command status = " + pdu.getCommandStatus());
                        DeliverSM deliverSm = (DeliverSM) pdu;
                        System.out.println("Получатель: " + deliverSm.getSourceAddr().getAddress());
                        System.out.println("Command ID = " + deliverSm.getCommandId());
                        System.out.println(deliverSm.getShortMessage());

                        //DeliverSMResp resp = new DeliverSMResp();
                        DeliverSMResp resp = session.deliver(deliverSm);
                        System.out.println("Deliver response " + resp.debugString() + " CommandStatus: " + resp.getCommandStatus() +
                            " BODY:" + resp.getBody());
                        //resp.setSequenceNumber(deliverSm.getSequenceNumber());
                        //System.out.println("Sending DeliverSmResp.");
                    }
                    catch (Exception ex)
                    {
                        Logger.getLogger(Receiver.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }
                else
                {
                    System.out.println("SubmitSMResp");
                    SubmitSMResp s = (SubmitSMResp) pdu;
                    System.out.println(s.debugString());
                    System.out.println("MESSAGE ID: " + s.getMessageId());
                    System.out.println("Command status = " + s.getCommandStatus());
                }
            }
            try
            {
                Thread.sleep(2000);
            }
            catch (InterruptedException e)
            {
                e.printStackTrace();
            }
        }
    }



Сейчас я обрабатывают пакеты, но сервер все равно продолжает повторно слать пакеты. Чего то еще не хватает?

ЗЫ Вы об этой спецификации? - http://ru.scribd.com/doc/68185006/54/Операция-“-DELIVER-SM-”
...
Рейтинг: 0 / 0
SMPP. прием ответов с смс-шлюза
    #38560918
no56892
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
имхо, протестировать лень, а так:
true_revenant
Ну если он шлет пакеты, значит if (pdu instanceof DeliverSM) => pdu не инстанс оф деливерСМ, pdu берется из pdu = session.receive();, что такое Session я не нашел. А где импорты вначале файла кстати?
...
Рейтинг: 0 / 0
SMPP. прием ответов с смс-шлюза
    #38560945
true_revenant
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сейчас скину еще раз java-файл полностью.

Вот.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
package sms_answer_receiver;

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.DeliverSM;
import com.logica.smpp.pdu.DeliverSMResp;
import com.logica.smpp.pdu.PDU;
import com.logica.smpp.pdu.Response;
import com.logica.smpp.pdu.SubmitSMResp;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintStream;
import java.security.CodeSource;
import java.security.ProtectionDomain;
import java.util.logging.Level;
import java.util.logging.Logger;

public class Receiver extends Thread
{
    private Session session = null;
    PrintStream err = null;
    PrintStream out = null;

    public Receiver()
    {
        initLog();
        System.out.println("init!");
        init();
    }

    private void init()
    {
        try
        {
            System.out.println("Инициализация соединения..");
            session = new Session(new TCPIPConnection("<address>", port));

            BindRequest breq = new BindReceiver();
            breq.setSystemId("<login>");
            breq.setPassword("<password>");

            Response resp = session.bind(breq);

            if (resp != null)
            {
                long commandStatus = resp.getCommandStatus();
                System.out.println("статус команды - " + resp.getCommandStatus());
                if (resp.getCommandStatus() != Data.ESME_ROK)
                {
                    System.out.println("Ошибка при инициализации!");
                    throw new IOException("Bind failed with error: " + commandStatus + ".");
                }

                System.out.println("Инициализация прошла успешно!");
                //break;
            }
        }
        catch (Exception ex)
        {
            System.out.println("Ошибка при инициализации!");
            Logger.getLogger(Receiver.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    @Override
    public void run()
    {
        System.out.println("**********Receiver Started***************");
        while (true)
        {
            System.out.println("receive!");
            PDU pdu = receive();
            System.out.println("received!");
            if (pdu != null)
            {
                System.out.println(pdu.getClass().getName());
                if (pdu instanceof DeliverSM)
                {
                    try 
                    {
                        System.out.println("DeliverSM");
                        //System.out.println("Command status = " + pdu.getCommandStatus());
                        DeliverSM deliverSm = (DeliverSM) pdu;
                        System.out.println("Получатель: " + deliverSm.getSourceAddr().getAddress());
                        System.out.println("Command ID = " + deliverSm.getCommandId());
                        System.out.println(deliverSm.getShortMessage());

                        //DeliverSMResp resp = new DeliverSMResp();
                        DeliverSMResp resp = session.deliver(deliverSm);
                        System.out.println("Deliver response " + resp.debugString() + " CommandStatus: " + resp.getCommandStatus() +
                            " BODY:" + resp.getBody());
                        //resp.setSequenceNumber(deliverSm.getSequenceNumber());
                        //System.out.println("Sending DeliverSmResp.");
                    }
                    catch (Exception ex)
                    {
                        Logger.getLogger(Receiver.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }
                else
                {
                    System.out.println("SubmitSMResp");
                    SubmitSMResp s = (SubmitSMResp) pdu;
                    System.out.println(s.debugString());
                    System.out.println("MESSAGE ID: " + s.getMessageId());
                    System.out.println("Command status = " + s.getCommandStatus());
                }
            }
            try
            {
                Thread.sleep(2000);
            }
            catch (InterruptedException e)
            {
                e.printStackTrace();
            }
        }
    }

    private void initLog()
    {
        try
        {
            err = new PrintStream(new FileOutputStream(get_jar_location() + "/SMSLog_error.log", true));
            out = new PrintStream(new FileOutputStream(get_jar_location() + "/SMSLog_sys.log", true));
            System.setErr(err);
            System.setOut(out);
        }
        catch (FileNotFoundException ex)
        {
            Logger.getLogger(Receiver.class.getName()).log(Level.SEVERE, null, ex);
        }
        //        } finally {
        //            err.close();
        //            out.close();
    }

    private String get_jar_location()
    {
        ProtectionDomain pd = getClass().getProtectionDomain();
        CodeSource cs = pd.getCodeSource();
        String full = cs.getLocation().getPath();
        String res = "";
        //System.out.println("Каталог с программой = " + cs.getLocation().getPath());

        for (int i = full.length() - 1; i > 0; i--)
        {
            if (full.charAt(i) == '/')
            {
                res = full.substring(0, i + 1);
                break;
            }
        }
        return res;
    }

    private PDU receive()
    {
        PDU pdu = null;
        try
        {
            pdu = session.receive();
            // pdu = session.getReceiver().receive();
            if (pdu != null)
            {
                pdu.debugString();
                // System.out.println("Received PDU " + pdu.debugString());
            }
            else
            {
                // System.out.println("No PDU received this time.");
            }
        }
        catch (Exception e)
        {
            //event.write(e, "");
            //debug.write("Receiving failed. " + e);
            //System.out.println("Receiving failed. " + e);
        }
        finally
        {
            // debug.exit(this);
        }
        return pdu;
    }
}
...
Рейтинг: 0 / 0
SMPP. прием ответов с смс-шлюза
    #38561090
Alex Kuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
true_revenantЯ понял вас. переделал. сейчас метод, который слушает выглядит так:

Код: java
1.
 ... skiped...



Сейчас я обрабатывают пакеты, но сервер все равно продолжает повторно слать пакеты. Чего то еще не хватает?

ЗЫ Вы об этой спецификации? - http://ru.scribd.com/doc/68185006/54/Операция-“-DELIVER-SM-”
Да, об этой спецификации, а именно про пункт 4.6.2 на стр.99 и пункт 2.6.1 на стр. 27.
В коде у Вас я не увидел отправки deliver_sm_resp.
...
Рейтинг: 0 / 0
SMPP. прием ответов с смс-шлюза
    #38561109
Alex Kuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
true_revenant,

Кстати, а почему для submit_sm также нет ответа???
...
Рейтинг: 0 / 0
SMPP. прием ответов с смс-шлюза
    #38562661
true_revenant
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
для submit_sm отправляется ответ в другом модуле, который отправляет смс на сервер. здесь исходник модуля который принимает и обрабатывает deliverySM с сервера.
...
Рейтинг: 0 / 0
SMPP. прием ответов с смс-шлюза
    #38562910
Alex Kuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
true_revenant,

тогда проверяйте как у Вас отрабатывает
вот этот кусок:
Код: java
1.
2.
3.
...
DeliverSMResp resp = session.deliver(deliverSm);
...


По всей вероятности вызов session.deliver(deliverSm) должен отправить подтверждение серверу...?
Т.е. создать PDU deliver_sm_resp , заполнить его и отправить на сервер...
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / SMPP. прием ответов с смс-шлюза
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]