Некоторые особенности создания ПО для мобильных устройств

Создать новую статью

04.02.2009 12:00


Введение
Инициатива Mobilized Software (MSI) - проект разработки сетевых приложений, архитектура которых позволяет конечному пользователю продолжать работу вне зависимости от состояния соединения. Такое приложение, не имея постоянного соединения с сетью, должно автоматически определять момент обрыва связи или нестабильность соединения. В этих случаях оно должно в прозрачном для пользователя режиме переключаться на автономную работу, так чтобы в наименьшей мере ограничить возможности пользователя. Работа не должна прерываться ни при подключении или отключении от сети, ни при снижении или улучшении качества связи.


Решения на уровне архитектуры
Несмотря на то, что цель разработки приложений с эпизодическим сетевым подключением одна - обеспечить пользователю условия для полноценной работы, даже если сетевое подключение отсутствует - существуют самые разные способы ее достижения. В данной статье представлены некоторые из них. В качестве примера здесь будет использовано демонстрационное приложение компании Intel - Mobile Reference Application.

Для сценария при разработке данного приложения была выбрана деятельность компании по торговле недвижимостью. Оно позволяет агентам недвижимости отправлять и получать соответствующую информацию. Обмен информацией происходит между серверами и мобильными клиентскими устройствами. Приложение требует установки следующего ПО на компьютере разработчика:

  • Internet Information Server*
  • Microsoft Visual Studio .NET* 2003
  • Microsoft SQL Server*
  • Web Service Enhancements for Microsoft .NET* 1.0 (SP1)
  • Windows* Media Player 9
  • DirectX* 9.0a Software Development Kit
Следует заметить, что представленные здесь методы отнюдь не являются единственно возможными для разработки MSI приложений. Существует множество вариантов в зависимости от требований, связанных с теми или иными видами деятельности, используемых технологий и даже предпочтений разработчика.

До начала разработки MSI-приложения следует ответить на несколько важных вопросов:

  • Каким образом приложение будет определять режим работы - онлайн или офлайн?
  • Какими функциональными возможностями приложения можно будет продолжать пользоваться после потери связи с сетью? Какие функции невозможно использовать без подключения к серверу?
  • Необходима ли синхронизация данных клиентского приложения и сервера при восстановлении соединения? Каким образом будет выполняться синхронизация?
  • Каким образом будут сохраняться данные пользователя в том случае, если соединение с сетью отсутствует, а заряд аккумулятора мобильного устройства на исходе.
  • Имеется ли возможность снизить объем передаваемых данных путем использования методов сжатия или ограничения использования графики и файлов мультимедиа в случае нестабильности соединения или сокращения полосы пропускания?
Для разных групп разработчиков ответы на эти вопросы будут различаться. Одного варианта, который подошел бы всем, не существует.


Определение подключения
Одной из ключевых задач при разработке приложения с эпизодическим сетевым подключением является обеспечение возможности "прозрачного", незаметного для пользователя переключения между режимами онлайн и офлайн. Для решения этой задачи может оказаться полезной функция, определяющая наличие подключения к сети. К примеру, в Mobile Reference Application используется Web-сервис Ping, периодически вызываемый клиентом. Этот вызов производится в фоновом режиме и не мешает работе пользователя.

Сервер поддерживает функцию тестового опроса - Ping. Клиенты вызывают данную функцию для определения возможности соединения с Web-сервером. Если вызов принят, значит приложение находится в режиме онлайн, если нет - связь отсутствует. В последнем случае приложение переключается в автономный режим работы. A Метод тестового опроса (Ping) был использован в нашем приложении, так как он позволяет осуществить сразу две проверки. Он дает возможность, во-первых, удостовериться в наличии соединения клиента с сетью, и во-вторых, что более важно, в том, что клиент имеет возможность доступа к соответствующему Web-сервису при необходимости отправки и получения данных. Если может быть вызвана функция Ping, значит наиболее вероятно также может быть вызван и метод синхронизации.

Программный код метода Ping выглядит следующим образом:

[WebMethod]
public void Ping()
{
}


Несмотря на свою простоту, это простой и эффективный способ определить возможность соединения с Web-сервером.


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

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

К счастью, платформа .NET Framework* имеет встроенную поддержку вызова асинхронных Web-сервисов. Для любого имеющегося Web-метода в Visual Studio .NET* автоматически создаются методы Begin и End. К примеру, если Web-сервис поддерживает вызов метода CalculateTotal, доступны будут также соответственно BeginCalculateTotal и EndCalculateTotal.

Как уже ранее говорилось, сервер Mobile Reference Application поддерживает метод Ping. Для асинхронного вызова данного метода в этом приложении используются методы BeginPing и EndPing. При вызове BeginPing обратно должен быть передан типизированный указатель на функцию обратного вызова, определяющий, какая именно процедура должна быть выполнена по окончании вызова метода.

private void tmrPing_Tick(object sender, System.EventArgs e)
{
System.AsyncCallback myCallback = new
AsyncCallback(PingCallback);
pingWebService.BeginPing(myCallback, Connectivity.Online);
}


AsyncCallback - многоадресный делегат, используемый для указания на метод обратного вызова, выполняемый по завершении асинхронной операции. Процедура обратного вызова завершает асинхронную операцию вызовом метода EndPing.

private void PingCallback(IAsyncResult e)
{
try
{
pingWebService.EndPing(e);
Connectivity.Online = true;
}
catch
{
Connectivity.Online = false;
}
finally
{
this.Invoke(new SetPingStatusDelegate(SetPingStatus),
new object[] {Connectivity.Online, e.AsyncState});
}
}


Логическая переменная Connectivity.Online, используется для регистрации состояния соединения - онлайн или офлайн. Стоит также обратить внимание на то, что весь код метода обратного вызова заключен в блок обработки ошибок. Из того, что этот метод активизирован, еще не значит, что вызов Web-сервиса был успешным. Обратный вызов осуществляется при успешном выполнении Web-метода или по истечении заданного времени вызова. Единственный способ определить, успешно ли был завершен вызов или нет- вызвать метод EndPing. При неуспешном завершении этот метод сгенерирует исключительную ситуацию.


Синхронизация данных
Приложение Mobile Reference Application (MRA) позволяет агентам добавлять новые и вносить изменения в имеющиеся данные о недвижимости. Все изменения вначале записываются в базе данных клиентского мобильного устройства. Когда MRA находится в режиме онлайн, они немедленно передаются на сервер. Если же оно работает в автономном режиме, то должно ожидать установления соединения для отправки изменений. Этот процесс называется синхронизацией.

Для осуществления синхронизации в MRA предусмотрена процедура SetPingStatus. Она имеет два параметра, представленные логическими переменными. Первый параметр, online, определяет, находится ли приложение в режиме онлайн. Второй, previousState, указывает на то, в каком режиме находилось приложение, когда метод Ping был вызван в последний раз.

Иными словами значения этих двух переменных определяют, было ли соединение разорвано ранее, и восстановлено ли оно на данный момент.

private void SetPingStatus(bool online, bool previousState)
{
if (online == true)
{
statusBar1.Panels[1].Text = "Online";
Application.DoEvents();
if (previousState == false)
{
DataAccess._dataAccess.SyncUp();
}
}
else
statusBar1.Panels[1].Text = "Offline";
}


Если переменная online принимает значение "истина", а previousState - "ложь", это значит, что соединение недавно было восстановлено. В базе данных могут быть записи, которые должны быть обновлены. Приложение определяет такие записи путем проверки полей статуса и отметки даты и времени. Эти поля обновляются каждый раз при изменении записи в клиентской базе данных, что упрощает определение записей, необходимых к загрузке.


Резюме
Инициатива Mobile Software (MSI) - новая модель для разработки клиент-серверных или многоуровневых приложений. С распространением новых мобильных технологий в последнее время постоянно увеличивается число пользователей, выбравших в качестве основного компьютера ноутбук или иное мобильное устройство. Даже те, кто сохранил приверженность настольным системам, хотели бы тем не менее иметь возможность работать также и в отрыве от традиционного рабочего места. Основная цель MSI, таким образом - создать все условия для того, чтобы и не имея связи с сетью, пользователь мог бы выполнять свою работу без потери производительности.

Нами были рассмотрены несколько наиболее важных тем, связанных с созданием приложений с эпизодическим сетевым соединением: определение режима работы приложения (онлайн или офлайн), асинхронное взаимодействие с Web-сервисами, а также синхронизация данных. Однако кроме описанных здесь, имеется и много других полезных методов, применяемых при создании MSI-приложений для мобильных ПК.


Дополнительные ресурсы