Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
Анд_Рей
3 / 4 / 1
Регистрация: 27.12.2009
Сообщений: 177
1

Udp connection

16.05.2017, 16:28. Просмотров 200. Ответов 4
Метки нет (Все метки)

Здравствуйте! Нужна Ваша помощь.

Есть прибор, к которому через протокол UDP подключается телефон и оправляет ему коннамды.

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

А вот с телефоном - беда...Телефон подключается к прибору через WiFi без проблем, отправляет комманды тоже без проблем(никаких timeoutexception), а вот с получением данных начинаются проблеммы - один раз ответ приходит, другой не приходит. в общем socket.receive работает не так стабильно, как на настольной программе очень часто выскакивает timeoutexception...

Вот код, которые отправляет коммаду и получает ответ...Может сможете подсказать, где тут косяк? Зарабее благодарен

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
private UdpResult sendCommand(byte[] command) {
        UdpResult udpResponse = new UdpResult();
        try {
            Thread.sleep(sleepFor);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        do {
            udpResponse.command = command;
            udpResponse.response = new byte[BUFFER_SIZE];
            DatagramSocket socket = null;
 
            try {
                socket = new DatagramSocket();
                socket.setSendBufferSize(BUFFER_SIZE);
                socket.setReceiveBufferSize(BUFFER_SIZE);
                socket.setSoTimeout(timeout);
                InetAddress inetAddress = InetAddress.getByName(ipAddress);
                DatagramPacket sendPacket = new DatagramPacket(udpResponse.command, BUFFER_SIZE, inetAddress, port);
                DatagramPacket receivePacket = new DatagramPacket(udpResponse.response, BUFFER_SIZE, inetAddress, port);
                socket.send(sendPacket);
                socket.receive(receivePacket);
                udpResponse.succeed = true;
            } catch (Exception e) {
                udpResponse.succeed = false;
            } finally {
                if (socket != null) {
                    socket.close();
                }
            }
            udpResponse.attempts++;
        } while (udpResponse.attempts < maxAttempts && !udpResponse.succeed);
        return udpResponse;
    }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.05.2017, 16:28
Ответы с готовыми решениями:

Interner Connection Online
Доброе утро. Ребята вот такая проблема, у меня приложение работает только...

Передача connection/statement во фрагмент
В моём приложении в одном активити можно вызвать несколько фрагментов, в каждом...

Не доходят пакет UDP
почему при передачи пакета от сервера к клиенту (используя udp) пакет...

Прием UDP пакетов
Здравствуйте. Сразу скажу, никогда не имел дело с сокетами, тем более с UDP....

Не приходит UDP сообщение
Здравствуйте. В моем приложении потребовалась широковещательная отправка...

4
Pablito
2731 / 2166 / 735
Регистрация: 12.05.2014
Сообщений: 7,583
Завершенные тесты: 1
16.05.2017, 16:33 2
- это запускается в отдельном потоке? как именно? где код?
- разрешения в манифесте есть? (да да, знаю что оно кое как работает, но все равно)
- полный лог ошибок
0
Анд_Рей
3 / 4 / 1
Регистрация: 27.12.2009
Сообщений: 177
16.05.2017, 16:41  [ТС] 3
Разрешения выставлены:
XML
1
2
3
4
5
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" />
sendCommand - запускается в AsynkTask вот таким образом:

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
private class GetStatus extends AsyncTask<byte[], Void, UdpResult> {
 
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            isPinging = true;
 
            if (udpSettingsListener != null) {
                udpSettingsListener.onPreGetStatus();
            }
        }
 
        @Override
        protected UdpResult doInBackground(byte[]... params) {
            UdpResult udpResult = sendCommand(params[0]);
            udpResult.opName = "GetStatus";
            udpResult.odDate = System.currentTimeMillis();
            udpResults.add(udpResult);
            return udpResult;
        }
 
        @Override
        protected void onPostExecute(UdpResult result) {
            super.onPostExecute(result);
            isPinging = false;
 
            if (udpSettingsListener != null) {
                if (result.succeed) {
                    udpSettingsListener.onGotStatus(new DeviceStatus(result.response));
                } else {
                    udpSettingsListener.onFailedToGetStatus(result.exception);
                }
            }
        }
    }
Вот пример timeoutexception
XML
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
sendCommand: 
java.net.SocketTimeoutException
 at libcore.io.IoBridge.maybeThrowAfterRecvfrom(IoBridge.java:598)
 at libcore.io.IoBridge.recvfrom(IoBridge.java:556)
 at java.net.PlainDatagramSocketImpl.doRecv(PlainDatagramSocketImpl.java:163)
 at java.net.PlainDatagramSocketImpl.receive(PlainDatagramSocketImpl.java:171)
 at java.net.DatagramSocket.receive(DatagramSocket.java:274)
 at com.andreyserdyuk.gaash.helpers.UdpHelper.sendCommand(UdpHelper.java:326)
 at com.andreyserdyuk.gaash.helpers.UdpHelper.access$1400(UdpHelper.java:27)
 at com.andreyserdyuk.gaash.helpers.UdpHelper$SetRtc.doInBackground(UdpHelper.java:371)
 at com.andreyserdyuk.gaash.helpers.UdpHelper$SetRtc.doInBackground(UdpHelper.java:357)
 at android.os.AsyncTask$2.call(AsyncTask.java)
 at java.util.concurrent.FutureTask.run(FutureTask.java:237)
 at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java)
 at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
 at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
 at java.lang.Thread.run(Thread.java:818)
 Caused by: android.system.ErrnoException: recvfrom failed: EAGAIN (Try again)
 at libcore.io.Posix.recvfromBytes(Native Method)
 at libcore.io.Posix.recvfrom(Posix.java:185)
 at libcore.io.BlockGuardOs.recvfrom(BlockGuardOs.java:250)
 at libcore.io.IoBridge.recvfrom(IoBridge.java:553)
 at java.net.PlainDatagramSocketImpl.doRecv(PlainDatagramSocketImpl.java:163)*
 at java.net.PlainDatagramSocketImpl.receive(PlainDatagramSocketImpl.java:171)*
 at java.net.DatagramSocket.receive(DatagramSocket.java:274)*
 at com.andreyserdyuk.gaash.helpers.UdpHelper.sendCommand(UdpHelper.java:326)*
 at com.andreyserdyuk.gaash.helpers.UdpHelper.access$1400(UdpHelper.java:27)*
 at com.andreyserdyuk.gaash.helpers.UdpHelper$SetRtc.doInBackground(UdpHelper.java:371)*
 at com.andreyserdyuk.gaash.helpers.UdpHelper$SetRtc.doInBackground(UdpHelper.java:357)*
 at android.os.AsyncTask$2.call(AsyncTask.java)*
 at java.util.concurrent.FutureTask.run(FutureTask.java:237)*
 at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java)*
 at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)*
 at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)*
 at java.lang.Thread.run(Thread.java:818)*
0
Pablito
2731 / 2166 / 735
Регистрация: 12.05.2014
Сообщений: 7,583
Завершенные тесты: 1
16.05.2017, 16:45 4
socket.setSoTimeout(timeout);
чему равен таймаут?
0
Анд_Рей
3 / 4 / 1
Регистрация: 27.12.2009
Сообщений: 177
16.05.2017, 16:51  [ТС] 5
timeout = 1000, проблемма в том, что мы пробывали выставлять его до 10 секунд, и все-равно падало
0
16.05.2017, 16:51
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.05.2017, 16:51

Отправка пакета (UDP)
День добрый Как организовать передачу пакета (UDP) из любого участка кода?...

Не отправляется UDP пакет
в потоке устанавливаю соединение с сервером: @Override protected Void...

Не работает UDP сервер
Почему у меня вылетает приложение на ds.receive(dp);? В манифесте...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru