Плавная передача Wi-Fi в Android

Мы разрабатываем небольшое приложение для Android, чтобы плавно переключаться между двумя различными точками беспроводного доступа в одной и той же сети (тот же SSID и одна и та же сетевая конфигурация, но с разными физическими местоположениями) с целью не отбрасывать существующие соединения после выполнения передачи обслуживания. Я читал несколько сообщений здесь, объясняя, как управлять wifi программно, и теперь у нас есть половина рабочего решения.

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

... // Some initializations and bestOne is the ScanResult with the best signal conf.BSSID = bestOne.BSSID; actualNid = mWifiManager.updateNetwork(conf); mWifiManager.enableNetwork(actualNid, false); mWifiManager.saveConfiguration(); conf = getWifiConfiguration(mWifiManager, conf); if(conf == null) { return; } if(!mWifiManager.enableNetwork(conf.networkId, true)) { return; } if (mWifiManager.reconnect()) { // Great } else { // Error } 

Проблема в том, что все выполнение выполняется через ожидаемый путь кода. Однако передача обслуживания на самом деле не выполняется, журналы показываются при повторном подключении, и возвращается true. Кроме того, никаких событий, полученных от SUPPLICANT_CONNECTION_CHANGE_ACTION или SUPPLICANT_STATE_CHANGED_ACTION, не происходит, поэтому кажется, что передача обслуживания даже не запускается.

Другим фактом является то, что если мы вставим mWifiManager.disconnect (), прежде чем включить сеть, фактически выполняется передача обслуживания. Тем не менее, это не вариант, поскольку запущенные приложения теряют связь, тем самым отбрасывая сеанс, чего мы хотим избежать.

Любое предложение более чем приветствуется.

Это может быть не просто проблема с программным обеспечением. Обычно сетевой адаптер (Wi-Fi) отвечает за отслеживание уровней сигнала и определяет, когда следует перемещаться и куда перемещаться. Эти алгоритмы специфичны для поставщиков, и, возможно, не удастся повлиять на них. Роуминг выполняется путем отправки фреймов (запросов) 802.11 с клиента, а процесс роуминга выполняется на уровне L2 (в вашем сценарии). Но процесс может быть не таким простым. Обе точки доступа должны знать, должен ли клиент перемещаться, а коммутатор, отправляющий кадры в эту точку доступа, должен иметь это обновление в своей таблице CAM. AP, с которой клиент перемещается, может буферизовать все фреймы, предназначенные для клиента, и отправлять их в новую точку доступа, когда клиент повторно связывается, в результате чего нет потери данных. Поскольку это не требуется стандартным роумингом стандарта 802.11, это может привести к потере данных и простому повторному подключению к точке доступа с более сильным сигналом, что приведет к падению соединения, поскольку это не просто роуминг, а полное отсоединение и повторное подключение к сети.

Вероятно, это не поможет вам решить вашу проблему, но я пытался указать, что это действительно то, что должно быть сделано на более низких уровнях (физическая, передача данных или транспорт), а не на уровне приложений. Погода, в которой роуминг будет практически полностью зависеть, зависит от используемого оборудования (с обеих сторон) и конфигурации сети, и вы не можете сделать это, чтобы изменить это. Единственное, что приходит в голову, это отправлять запросы зонда 802.11, чтобы клиент знал другие точки доступа с более сильными сигналами, которые вы уже делаете в своем коде, и оставляя решение бродить по сетевому адаптеру.

Intereting Posts
Получить первичное имя учетной записи для отправки почты в android 2.1 Перезагрузка Android-телефона при запуске приложения из eclipse Ошибка входа в Android для Facebook Ionic native-audio не работает на android Android – Подписанный apk не запускается на мобильном устройстве Xamarin Studio Android App «aapt.exe» вышел с кодом -1073741819 ошибка MSB6006: Window.open () возвращает undefined при вызове из setTimeout на Android Недопустимый вектор векторных меток – appcompat-v7: 24.1.1 129 и ошибка 133 из Rxble при операции чтения и записи Нет Реализация найдена для родного UnsatisfiedLinkError Exception Android JNI Java.lang.IllegalArgumentException: Плохой класс: класс java.util.GregorianCalendar Можно ли программно получить MAC-адрес устройства под управлением Android 6.0+? Требуется рабочее решение для использования экрана Android Pattern Lock в настраиваемом приложении (а не перенаправления исходного кода) Поддержка H.264 AVC для телефонов Android? Apt-зависимости в Android-градиенте – для чего он используется?