- Работа с сетью в Android: трафик, безопасность и батарейка
- Как сделать так, чтобы смартфон автоматически включал Wi-Fi дома или на работе
- Как включить функцию Wi-Fi Scanning
- Включение режимов «только 2G» или «только 3G» на Android
- В чем загвоздка?
- Выбор типа сети через инженерное меню
- «Продвинутое» инженерное меню
- Вывод
Работа с сетью в Android: трафик, безопасность и батарейка
На сегодняшний день в Google Play насчитывается более 800 тысяч приложений. Многие из них реализованы на основе клиент-серверного общения. При разработке таких приложений нужно учесть три основных момента, о которых пойдет речь в этой статье.
О чем нужно помнить при реализации сетевой части приложения
Первое – это трафик. Не всегда есть возможность работать по бесплатному Wi-Fi-соединению, а мобильный интернет всё еще дорогой, и об этом нужно помнить, потому что трафик – это деньги пользователя.
Второе – это лимит батарейки. Мобильные устройства необходимы пользователю для каких-то повседневных дел, совещаний, прогулок, бизнеса, и когда батарейка садится в самый неподходящий момент, пользователь негодует.
Третье – это безопасность. Так как все-таки речь идет о мобильных клиентах, и данные гуляют по сети от клиента к серверу и обратно, то их необходимо защищать.
Подходы по реализации сетевого взаимодействия
Для начала вспомним, какие способы реализации клиент-серверного общения существуют и популярны на сегодняшний день.
Первый подход — на основе сокетов (здесь я имею в виду работу непосредственно с Socket API). Он часто используется в приложениях, где важна скорость доставки сообщения, важен порядок доставки сообщений и необходимо держать стабильное соединение с сервером. Такой способ зачастую реализуется в мессенджерах и играх.
Второй подход — это частые опросы (polling): клиент посылает запрос на сервер и говорит ему: «Дай мне свежие данные»; сервер отвечает на запрос клиента и отдает все, что у него накопилось к этому моменту.
Минус такого подхода в том, что клиент не знает, появились ли свежие данные на сервере. По сети лишний раз гоняется трафик, в первую очередь из-за частых установок соединений с сервером.
Третий подход — длинные опросы (long polling) — заключается в том, что клиент посылает «ожидающий» запрос на сервер. Сервер смотрит, есть ли свежие данные для клиента, если их нет, то он держит соединение с клиентом до тех пор, пока эти данные не появятся. Как только данные появились, он «пушит» их обратно клиенту. Клиент, получив данные от сервера, тут же посылает следующий «ожидающий» запрос и т.д.
Реализация этого подхода достаточно сложна на мобильном клиенте в первую очередь из-за нестабильности мобильного соединения. Зато при этом подходе трафика расходуется меньше, чем при обычном polling’e, т.к. сокращается количество установок соединений с сервером.
Механизм long polling, или пуш-уведомлений (push notifications), реализован в самой платформе Android. И, наверное, для большинства задач будет лучше использовать его, а не реализовывать самим. Ваше приложение подписывается у сервиса Google Cloud Messaging (GCM) на получение пуш-уведомлений.
Тем самым разрывается связь непосредственно между сервером и клиентом за счет того, что сервер работает с сервисом GCM и отправляет свежие данные всегда на этот сервис, а он уже в свою очередь реализует всю логику доставки этих данных до вашего приложения. Плюсы этого подхода в том, что устраняется необходимость частых установок соединения с сервером за счет того, что вы точно знаете, что данные появились, и об этом вас оповещает сервис GCM.
Из этих четырех подходов наиболее популярными при разработке бизнес-приложений являются пуш-уведомления и частые опросы. При реализации этих подходов нам так или иначе придется устанавливать соединение с сервером и передавать данные. Далее речь пойдет об инструментах, которые есть в наличии у разработчика для работы по HTTP/HTTPS-протоколам.
HttpUrlConnection и HttpClient
В арсенале Android-разработчика есть два класса для работы по этим протоколам. Первый – это java.net.HttpURLConnection, второй – org.apache.http.client.HttpClient. Обе эти библиотеки включены в Android SDK. Далее будут подробно рассмотрены основные моменты, которые будут влиять на трафик, батарею и безопасность при работе с каждой из этих библиотек.
С HttpURLConnection все просто. Один класс и все. Это объясняется тем, что родительский класс URLConnection был спроектирован для работы не только по HTTP-протоколу, а еще по таким, как file, mailto, ftp и т.п.
HttpClient спроектирован более объектно-ориентированно. В нем есть четкое разделение абстракций. В самом простом случае мы будем работать с пятью разными интерфейсами: HttpRequest, HttpResponse, HttpEntity и HttpContext. Поэтому апачевский клиент намного тяжеловеснее HttpUrlConnection.
Как правило, на все приложение существует всего один экземпляр класса HttpClient. Это обусловлено его тяжеловесностью. Использование отдельного экземпляра на каждый запрос будет расточительным. Мы можем, к примеру, хранить экземпляр HTTP-клиента в наследнике класса Application.
В случае HttpUrlConnection следует создавать на каждый запрос новый экземпляр клиента.
Из чего складывается трафик?
Во время работы нашего приложения картинка будет примерно такая.
Количество и частота запросов будет зависеть от функционала и насыщенности UI – интерфейса приложения. Каждый такой запрос устанавливает TCP-соединение с сервером. В данном случае трафик, который будет потрачен, будет равняться сумме установок соединений и сумме переданных данных. Понизить расход трафика в данном случае можно за счет использования долгоживущего соединения (keep alive).
Основная идея keep alive-соединения заключается в использовании одного и то же TCP-соединения для отправки и приема HTTP-запросов. Главные преимущества — снижение трафика и времени выполнения запроса. Мной был проделан простенький тест, который заключался в том, что выполнялось последовательно 10 запросов на один и тот же хост. Данные представлены в таблице ниже. При выключенном keep alive видно, что среднее время выполнения запроса составляло примерно две секунды. В случае с включенным keep alive это время снизилось до 1,7 секунды, что на 16% быстрее. Это обуславливается в первую очередь тем, что устраняется необходимость частой установки соединения с сервером. При использовании защищенного HTTPS-соединения разница была бы заметнее, т.к. процедура SSL Handshake гораздо тяжелее процедуры TCP Handshake.
Важным параметром keep alive-cоединения является keep alive duration. Он означает временной интервал. Если приходит несколько HTTP-запросов в пределах этого интервала, то будет переиспользоваться уже установленное TCP-соединение.
Из рисунка видно, что время между четвертым и третьим запросом превысило keep alive duration, поэтому создается новое TCP-соединение с сервером.
Давайте посмотрим, как можно настроить вышеописанный параметр. В случае HttpClient все хорошо, в нашем распоряжении есть интерфейс ConnectionKeepAliveStrategy. Переопределив метод getKeepAliveDuration, мы можем вернуть нужное значение параметра keep alive duration.
Работая с HttpUrlConnection, нужно помнить о баге в платформе Android 2.2 и отключать keep alive на платформах = 4.0.3 (API Level 15) должна стоять точка в начале домена
Защищенное соединение (HTTPS)
В завершение данной статьи я рассмотрю, как включить HTTPS в Android. Насколько мне известно, на других мобильных платформах достаточно включить HTTPS-схему, механизм транспорта SSL — и все должно работать. В Android есть некоторые проблемы, которые следует учитывать и решать. Для начала вспомним, как устанавливается защищенное соединение. На проблемное место указывает красная стрелка – это проверка подлинности сертификата.
Источник
Как сделать так, чтобы смартфон автоматически включал Wi-Fi дома или на работе
Согласитесь, постоянно держать модуль Wi-Fi включенным — это не самая лучшая идея. В первую очередь потому, что он будет потихоньку «съедать» заряд батареи смартфона. При этом каждый раз отключать его, выходя из зоны беспроводной сети и включать, входя в нее снова — это тоже не сказать, чтобы удобный вариант. Однако вполне возможно настроить Android смартфоны таким образом, чтобы они самостоятельно включали Wi-Fi в определенных местах. Например, дома или на работе. Правда при работе этой функции будет постоянно работать GPS-модуль, который тоже может отнять какое-то количество заряда батареи.
Android-смартфон сам может определить, когда включить Wi-Fi
Стоит заметить, что эта функция доступна не на всех устройствах, а лишь на тех, которые имеют версию операционной системы Android 8.0 Oreo или выше. Так что имейте это ввиду. Функция автоматического включения Wi-Fi носит название Wi-Fi Scanning и принцип ее работы основан на том, что, во-первых, она функционирует на основе данных о местоположении, а, во-вторых, может самостоятельно переключаться между доверенными беспроводными сетями, даже если находится в зоне действия нескольких из них. Например, Wi-Fi Scanning будет выбирать ту, которая может предоставить лучшую скорость. То есть входя в определенную область, смартфон сам «поймет», есть ли тут сети и если есть, то подключится к ним. Ну а когда это произойдет, можете зайти на нашу страничку в Яндекс.Дзен и ознакомится с уникальными материалами из мира мобильных технологий.
Как включить функцию Wi-Fi Scanning
Стоит заметить, что в силу того, что многие производители смартфонов имеют свои оболочки операционной системы Android, расположение этой функции может немного отличаться от модели к модели. Но в большинстве случаев вам нужно будет проследовать в раздел «Настройки» — «Сеть и Интернет» — «Wi-Fi» — «Настройки Wi-Fi». Тут вы и обнаружите опцию «Автоматическое включение Wi-Fi». Ее (простите за тавтологию) необходимо включить.
После того, как эта опция заработает, вам нужно будет проследовать в настройки беспроводных сетей и выставить там домашнюю сеть. Это можно сделать, нажав на имя сети в списке и войдя в настройки. Там вы и обнаружите этот пункт. Также стоит заметить, что у вас на смартфоне должны быть включены все опции, связанные с геолокацией. В частности, определение местоположения. Если же эти опции были выставлены изначально и вы часто пользовались Google Maps для того, чтоб добраться, скажем, от дома до работы и обратно, то скорее всего эти места уже отмечены на картах.
Теперь вам больше не придется заботится о том, чтобы выключать Wi-Fi при выходе из дома
А значит и сети, «привязанные» к этим местам с большой долей вероятности имеют такие же GPS-координаты и после включения Wi-Fi Scanning все заработает «само». Если же этого не произошло, то вам необходимо в настройках каждой из сетей задать параметры в ручную. Не переживайте, вбивать широту и долготу не придется. Нужно просто перевести Wi-Fi сеть в разряд доверенных.
Источник
Включение режимов «только 2G» или «только 3G» на Android
Современные смартфоны и планшеты работают в нескольких диапазонах сотовой связи: 2G (GSM), 3G, 4G. Телефон автоматически сканирует радиочастоты и переключается на предпочтительную сеть. Казалось бы, все и так прекрасно работает и изменение настроек не требуется. Для большинства пользователей — да. Но в некоторых ситуациях активация режима «только 2G» или «только 3G» может улучшить работу устройства. Например, если телефон находится вне зоны покрытия сети 3G, то включение режима «только 2G» позволит сэкономить заряд аккумулятора, т.к. смартфон не будет сканировать частоты 3G-диапазона и пытаться подключиться к ним. Или другой пример: Необходимо подключиться к интернету через 3G, но из-за слабого сигнала устройство автоматически переключается на 2G. В этом случае активация режима «только 3G» даже при слабом, но устойчивом сигнале обеспечит стабильный доступ в интернет на относительно высокой скорости.
В чем загвоздка?
На некоторых Android-устройствах чтобы переключить режим работы сети достаточно открыть настройки,
выбрать пункт «Еще»,
и поставить переключатель.
В моем случае (защищенный китайский смартфон Iman X5 (Android 5.1)) при выборе типа сети 2G, телефон работал только в этом диапазоне, но при выборе пункта 3G устройство работало как в 2G, так и в 3G. На других же Android-устройствах (некоторых смартфонах Samsung точно) режимы называются «только 2G(GSM)» и «только 3G». Достаточно просто выбрать нужный режим и наслаждаться работой устройства. Мне же пришлось искать другой способ принудительного включения 3G.
Выбор типа сети через инженерное меню
Несмотря на кажущуюся сложность этого способа все просто — набираем на телефоне комбинацию *#*#4636#*#* (иногда может потребоваться нажать кнопку вызова)
и попадаем в инженерное меню.
Выбираем пункт «Информация о телефоне», прокручиваем до пункта «Настроить предпочтительный тип сети»,
выбираем «WCDMA only» (только 3g) или «GSM only» (только 2g). По умолчанию там обычно стоит «WCDMA preferred» (3g предпочтительно).
Используя этот способ стоит обратить внимание на то, что передача данных должна осуществляться через СИМ-карту №1, иначе режим может не переключиться. Обычно этот способ срабатывает, но у меня же режим переключался обратно на «WCDMA preferred». Пришлось искать другой способ.
«Продвинутое» инженерное меню
Это меню доступно на многих устройствах с процессором MTK (большинство китайских смартфонов и планшетов). Для доступа к нему нужно набрать комбинацию *#*#3646633#*#* (иногда еще нажать на «вызов»).
Попадаем в сложное и запутанное меню со множеством настроек и тестов. Имейте в виду, что внося какие-либо изменения в эти настройки, вы рискуете вывести свой аппарат из строя, поэтому осторожнее. Нам нужен пункт «Network Selecting»,
и выбираем режим «WCDMA only». У меня после этого все заработало как надо.
Стоит обратить внимание на еще один интересный пункт «BandMode»,
в котором можно отключить сканирование ненужных частот, что позволит сэкономить заряд батареи.
Вывод
Принудительное подключение устройства к 3G позволяет пользоваться интернетом в условиях слабого покрытия сети этого типа. Даже с минимальных уровнем сигнала 3G скорость соединения будет выше, чем при максимальном уровне 2G. С другой стороны, отключение режима 3G позволит существенно сэкономить заряд батареи, что может быть полезно во время продолжительного нахождения на природе.
Источник