2013-12-20 2 views
7

Мне нужно проверить мое приложение в следующем сценарии:Как имитировать проблемы сети на устройстве Android?

  • Подключите устройство к Wi-Fi (с интернетом).
  • имитирует интернет-перерыв (отсутствие Интернета, но устройство должно оставаться подключенным к сети Wi-Fi).
  • через несколько секунд Интернет должен быть активным снова.

Я мог бы имитировать это вытягивание кабеля adsl из моего ruter, но тогда он не будет повторно подключаться достаточно быстро. Это какой-либо способ имитировать это программно?

+0

Очень хороший вопрос! Я всегда делаю это с помощью своего маршрутизатора. Но это боль в заднице! –

+0

Возможный дубликат [Имитация низкой пропускной способности в android] (http://stackoverflow.com/questions/8693117/simulate-low-bandwidth-in-android) – starkej2

+0

@ blacksh33p Низкая пропускная способность! = Надежность (потеря пакетов, прерывание сети и т. Д.)). Этот другой вопрос кажется более уместным: http://stackoverflow.com/q/130354/489607, но я все еще не считаю его дубликат, рассматривая контекст и теги для этого конкретного вопроса. Хотя ответы, безусловно, пересекаются, этот вопрос должен/должен стимулировать другие, конкретные ответы. – davidcesarino

ответ

0

У меня пока нет реального решения, но я нашел обходное решение для этой задачи. Я использую маршрутизатор MikroTik, и его фильтр брандмауэра позволяет мне отключить доступ к Интернету для конкретного IP-адреса «на лету»:

6 X chain=forward action=drop protocol=tcp dst-address=192.168.1.20 
in-interface=Internet(modem) 
3

Если у вас есть Mac, вы можете сделать это с помощью Network Link Conditionner. Это действительно эффективное, смотрите здесь шаг, чтобы установить его:

http://nshipster.com/network-link-conditioner/

+0

Я не понимаю, как здесь работает Mac (или любая другая компьютерная ОС)? – Kristopher

+1

Ну, с вашим Mac вы можете поделиться своим Wi-Fi-подключением, подключить устройство к этому Wi-Fi, предоставляемому вашим Mac. Включите Network Link Conditionner, и там вы идете ... – Andros

+1

Извините, если я недостаточно ясен, с помощью этого инструмента вы можете обеспечить очень плохую сеть (например, бесплатный пакет на 100%) и через 1 секунду после того, как ставят очень хорошую сеть , – Andros

0

Если вам посчастливиться иметь другое устройство, вы можете создать точку доступа с ним и запретить сети мобильной связи Интернет. Тестирующее устройство будет подключено к горячей точке, но не сможет достичь нигде из-за отсутствия Интернета. Что касается соединения там, я думаю, что это быстрее, чем перезапуск маршрутизатора. Однако у вас должно быть другое устройство, чтобы это произошло ... В противном случае я не знаю, и я тоже хотел бы получить верный ответ.

+0

У меня есть другое устройство, но могу ли я «запретить доступ в Интернет» на лету? Без повторного подключения Wi-Fi? – Kristopher

+0

Я так считаю, это похоже на включение или выключение Интернета. Если я правильно понимаю ваш вопрос, то есть, я думаю, это так.Но имейте в виду, что если вы создадите точку доступа, вы не сможете использовать Wi-Fi на своем излучающем устройстве, а только в мобильных сетях. –

0

Попробуйте передать все сетевые запросы (я также использую его с транзакциями db) через android.os.Handler. Используйте Runnables (лучше реализовать собственный класс Runnable) для реализации действий для выполнения (добавьте обратные вызовы, протоколирование и другую логику в свой класс Runnable). Таким образом, вы можете легко зарегистрировать слушателей в вашем классе Runnable, чтобы делать какие-либо спящие или сбои, которые вас интересуют.

Вот какой-то код моего проекта. Класс M_ClientRunnable реализует Runnable и имеет дополнительные методы для регистрации «отмена», прослушивателей отказов и слушателей успеха.

class LooperThread extends Thread { 
    public Handler mHandler; 

    public LooperThread() { 
     super(); 
     start(); 
    } 

    public void run() { 
     Looper.prepare(); 
     mHandler = new Handler() { 
      public void handleMessage(Message msg) { 
       getLogger().info(TAG, msg.toString()); 
      } 
     }; 
     Looper.loop(); 
    } 

    public boolean post(M_ClientRunnable runnable) { 
     if(!isAlive()) { 
      start(); 
     } 
     if (mHandler!=null) { 
      return mHandler.post(runnable); 
     } else { 
      return false; 
     } 
    } 
}; 
private LooperThread looper = new LooperThread(); 
@Override 
public boolean post(M_ClientRunnable runnable) { 
    return looper.post(runnable); 
} 
Смежные вопросы