Кирилл Данилов (donz_ru) wrote,
Кирилл Данилов
donz_ru

Category:

Удержание GPRS-сессии

Несколько обобщил заголовок, но, думаю, понятно, что речь о мобильном интернете (EDGE, 3G и т.д.)
ОСС "в связи с кризисом" на неинтернеториентированных тарифах ввели округление до 100Кб при завершении каждой GPRS-сессии. Неважно, десять байт вы скачали или девяносто килобайт - цена будет одинакова. Соответственно, чтобы пользователи не платили за воздух, каждый разработчик сетевого приложения должен позаботиться об удержании сессии. То есть, чтобы не создавать новое GPRS-подключение на каждый коннект к серверу, а работать в одной большой сессии до закрытия программы или другого явного действия по окончанию работы с интернетом.
В J2ME явных способов управления GPRS-сервисом нет, значит надо держать высокоуровневый коннект. Вначале в голову лезли всякие мысли о создании мелкого демона на сервере, с которым клиент будет перекидываться парой байт каждые несколько минут. Вариант осложнялся тем, что сервер должен одновременно держать несколько тысяч соединений. Коннекты очень легкие, но все равно виден геморрой в такой реализации.
После некоторых раздумий пришел к простому решению: открываем коннект к веб-серверу и забываем про него. То есть, банальное SocketConnection holdingConnection = ( HttpConnection )Connector.open( "http://mywebserver.xyz" ); Приличный веб-сервер со своей стороны закроет соединение через несколько секунд, а значит нагрузка на него нулевая. Но мобильный телефон не получает инструкции holdingConnection.close() от программы, а значит соединение хоть и закрыто, но мобила думает, что оно еще понадобится пользователю. Поэтому телефон не инициирует закрытие GPRS-сессии со своей стороны. ОСС в свою очередь думает, что GPRS-сессия еще понадобится телефону, который думает, что хттп-соединение еще понадобится пользователю. И это работает.
Опытным путем было выяснено, что московские операторы зыкрывают сессии без проявления сетевой активности через:
Мегафон - 1 час
Билайн - 1.5 часа
МТС - 4 часа

Этого уже вполне достаточно, чтобы обеспечить непрерывность GPRS-сессии. Если пользователь битый час не использует интернет, может он ему действительно не нужен?
Но хочется все по-чесноку, поэтому при каждой полезной сетевой активности проверяется, что удерживающий коннект не слетел, а если слетел, то он восстанавливается. А каждые полчаса без полезной сетевой активности создается новое удерживающее соединение после чего сразу же закрывается старое. Делать надо именно в порядке "сначала открыл - потом закрыл", чтобы мобила не успела увидеть полное отсутствие коннтеков, иначе может и GPRS-сессию прикрыть. Сам процесс соединения с сервером уже дает активность в канале передачи данных, так что обмениваться байтами на высоком уровне не надо.
Конечного тестирования еще не прошло, но вижу, что все работает. На Билайне сессия держалась около четырех часов, после чего я ушел домой. Завтра посмотрю, протерпит ли всю ночь. Навряд ли, так как операторы специально накрывают длительные сессии, чтобы народ не забывал платить за округления.
Вот, что удалось узнать от ОСС:
1)МТС. Клятвенно заверили, что GPRS-сессии по инициативе оператора не закрываются вообще, только если технические неполадки или "вне зоны действия". Пока точно известно, что есть четыре часа для неактивной сессии и более четырех для активной
2)Билайн. Так как неосторожно ляпнул про уже проверенные 90 минут на неактивной сессии, мне это число и назвали в качестве максимального времени, не забыв упомянуть, что это "в целях вашей же безопасности". Точно известно про 90 минут на неактивной сессии и более четырех часов на активной
3)Мегафон. Дозванивался 15 минут - песец. Говорят, что обрубают каждые сутки где-то между полуночью и часом ночи. Реально проверено, что час при неактивной сессии и более четырех при активной.
Tags: j2me, mobile, билайн, мегафон, мтс, полезное, программирование
Subscribe

  • Post a new comment

    Error

    default userpic

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 2 comments