Управление носителем
Управление носителем контролирует состояние подключения системы, позволяя пользователю запускать или останавливать интерфейсы или беспрепятственно переключаться между точками доступа.
Обзор
API управления носителем контролирует состояние подключения системы. Это включает простую информацию, такую как подключен ли прибор и сколько интерфейсов существует, а также позволяет разработчику приложений запускать, останавливать сетевые интерфейсы и влияет на другие детали, связанные с подключением. В зависимости от возможностей платформы она может даже предоставлять управление сессиями, чтобы сетевой интерфейс оставался активным до тех пор, пока клиенты проявляют к нему интерес, одновременно оптимизируя время активности интерфейса.
Этот API не поддерживает управление самими сетевыми конфигурациями. Платформа должна предоставлять инфраструктуру, которая позволяет пользователю создавать, редактировать или удалять сетевые конфигурации.
Подробное описание API
Компьютерные системы управляют своими сетевыми интерфейсами с помощью набора конфигураций. Каждая конфигурация описывает набор параметров, которые указывают системе, как запустить конкретный сетевой интерфейс. Одним из самых простых примеров может быть конфигурация Ethernet, которая связывает сетевую карту с сервером DHCP. Более сложным примером может быть конфигурация беспроводной локальной сети, которая может включать такие сведения о оборудовании, как адрес карты WLAN, сведения о точке доступа WLAN (например, ESSID, сведения об шифровании) и информацию о пользователе (например, имя пользователя и пароль). После того, как сетевой интерфейс был настроен и запущен в соответствии с конфигурацией, несколько приложений могут использовать это подключение/сессию канального уровня для своих операций сокетов. Обратите внимание, что объект QNetworkConfiguration предоставляет только ограниченную информацию о самих деталях конфигурации. Его основное назначение — служить идентификатором конфигурации, посредством которого можно создавать, разрушать и отслеживать подключения канального уровня.
QNetworkSession предоставляет два типа вариантов использования. Он позволяет отслеживать физические сетевые интерфейсы и управлять сетевыми сессиями. Сетевые сессии являются общей функцией на мобильных устройствах, где несколько приложений могут запросить сетевые сессии по своему усмотрению. Система объединяет и отслеживает активные сетевые сессии для одного сетевого интерфейса, поддерживая соединения канального уровня до тех пор, пока не будет закрыта последняя сессия. В следующей таблице перечислены основные функции QNetworkSession и то, как они соответствуют категориям управления сессиями и оборудованием:
Состояние сессии отражает состояние базовой точки доступа, а открытость сессии подразумевает доступное для текущего процесса сетевое/соединительное состояние.
Возможные варианты использования для управления интерфейсом — это приложения, связанные с управлением сетью, которые нацелены на мониторинг состояния подключения, но сами не участвуют в сетевом обмене. Любое приложение, которое хочет открыть сокет для удаленного адреса, обычно использует функции, связанные с управлением сессиями.
Сетевые службы
Некоторые мобильные платформы используют концепцию сгруппированных точек доступа (также называемых SNAP или точкой доступа к сетевым службам). В принципе, несколько конфигураций группируются вместе и, возможно, даже имеют приоритет друг перед другом. Это полезно в тех случаях, когда все конфигурации служат одной цели или контексту. Общим контекстом может быть предоставление доступа к общедоступному Интернету или, возможно, только к корпоративной интрасети. Предоставляя пул конфигураций, система может принимать решение на основе заданных приоритетов, которые обычно соответствуют таким факторам, как скорость, доступность и стоимость. Кроме того, система может автоматически переключаться с одной точки доступа на другую, гарантируя минимальное воздействие на пользовательский опыт.
Флаг QNetworkConfiguration::Type указывает, к какой категории относится конфигурация. Тип QNetworkConfiguration::InternetAccessPoint — наиболее распространенный пример. Он представляет конфигурацию, которая может использоваться для создания сессии. Упомянутое выше группирующее поведение обеспечивается конфигурациями QNetworkConfiguration::ServiceNetwork. Сетевые службы являются временными маркерами до момента, пока пользователь не попытается open() новую сессию. В этот момент система определяет, какую из конфигураций QNetworkConfiguration::children() лучше использовать. Алгоритм выбора предоставляется платформой и обычно управляется приложениями настроек сети. У сетевой службы может быть только один уровень косвенности, что означает, что дочерние элементы могут быть только типа QNetworkConfiguration::InternetAccessPoint.
Большинство систем позволяют пользователю определить системную конфигурацию по умолчанию. Обычно поведение по умолчанию — это либо сетевая служба, определенная точка доступа к Интернету, либо пользователь указывает платформе запросить пользователя, как только приложение запросит сеть. Взаимодействие с пользователем обычно реализуется с помощью некоторого диалогового окна системы, которое появляется в соответствующий момент времени. Приложению не нужно обрабатывать ввод пользователя. Этот API предоставляет вызов QNetworkConfigurationManager::defaultConfiguration(), который служит аналогичной цели. Следующий фрагмент кода предоставляет быстрый способ, с помощью которого приложение может быстро создать новую сетевую сессию без (или с минимальным) взаимодействием с пользователем:
// Set Internet Access Point
QNetworkConfigurationManager manager;
const bool canStartIAP = (manager.capabilities()
& QNetworkConfigurationManager::CanStartAndStopInterfaces);
// Is there default access point, use it
QNetworkConfiguration cfg = manager.defaultConfiguration();
if (!cfg.isValid() || (!canStartIAP && cfg.state() != QNetworkConfiguration::Active)) {
QMessageBox::information(this, tr("Network"), tr(
"No Access Point found."));
return;
}
session = new QNetworkSession(cfg, this);
session->open();
session->waitForOpened(-1); Для поддержки случая «Запрос пользователя» конфигурация по умолчанию может быть типа QNetworkConfiguration::UserChoice. Конфигурация выбора пользователя разрешается в рамках вызова QNetworkSession::open(). Обратите внимание, что конфигурация UserChoice возвращается только через QNetworkConfigurationManager::defaultConfiguration(), а не через QNetworkConfigurationManager::allConfigurations().
В системах, которые не поддерживают список defaultConfiguration(), возвращается недействительная конфигурация. Возможным решением может быть реализация пользовательского диалогового окна, заполненного на основе того, что возвращает QNetworkConfigurationManager::allConfigurations().
Управление сетевыми сессиями
Объект QNetworkSession разделяет условие state() и isOpen().
Атрибут state() позволяет разработчикам определять, поддерживает ли система в данный момент глобальную сетевую сессию для заданной QNetworkConfiguration. Если isOpen() возвращает true , то экземпляр QNetworkSession по крайней мере был одним из субъектов, запрашивающих глобальную сетевую сессию. Это различие необходимо для поддержки понятия регистрации сессий. До тех пор, пока существует один или несколько открытых экземпляров QNetworkSession, базовый сетевой интерфейс не закрывается. Поэтому состояние сессии state() можно использовать для мониторинга состояния сетевых интерфейсов.
Открытая сессия создается с помощью вызова QNetworkSession::open() и закрывается с помощью QNetworkSession::close(), соответственно. Если сессия находится в состоянии отключено в момент вызова open(), базовый интерфейс запускается; в противном случае увеличивается только счётчик ссылок на глобальную сессию. Противоположное поведение наблюдается при использовании close().
В некоторых случаях может потребоваться выключить интерфейс, несмотря на открытые сессии. Это можно сделать, вызвав stop(). Пример варианта использования — приложение типа сетевого менеджера, позволяющее пользователю контролировать общее состояние подключения устройства.
Глобальная (межпроцессная) поддержка сессий зависит от платформы и может быть обнаружена с помощью QNetworkConfigurationManager::SystemSessionSupport. Если система не поддерживает глобальную сессию, вызов close() никогда не останавливает интерфейс.
Переключение
Переключение — это процесс повторного подключения устройства от одной сети к другой с минимизацией воздействия на приложение. Система уведомляет приложение о изменениях канального уровня, чтобы можно было выполнить необходимую подготовку. Наиболее распространённой реакцией было бы повторное инициализировать сокеты и переговорить о состоянии с другими сторонами. В наиболее крайних случаях приложения даже могут предотвратить переключение вообще.
Переключение инициируется, когда система определяет, что для пользователя становится доступна более подходящая точка доступа. В целом такое решение основано на стоимости, скорости сети или типе сети (доступ к определённым частным сетям может быть предоставлен только через определённые точки доступа). Почти все устройства, поддерживающие переключение, имеют какое-то глобальное приложение конфигурации, позволяющее пользователю определять такие группы точек доступа (сетевые службы) и приоритеты.
Этот API поддерживает два типа роуминга. Роуминг на уровне приложения (ALR) предоставляет максимальный контроль над процессом. Приложения будут уведомлены о предстоящих изменениях уровня связи и получат возможность проверить новую точку доступа. В конечном итоге они могут отклонить или принять изменения уровня связи. Второй тип роуминга называется принудительным роумингом. Система просто меняет уровень связи, не консультируясь с приложением. Приложению необходимо обнаружить, что некоторые его внутренние сокеты могут стать недействительными. Вследствие этого ему необходимо повторно инициализировать эти сокеты и восстановить предыдущую сессию пользователя без каких-либо прерываний. Принудительный роуминг имеет преимущество, что приложениям не нужно самостоятельно управлять всем процессом роуминга.
QNetworkSession — это центральный класс для управления проблемами, связанными с роумингом.
Возможности платформ
Некоторые функции API недоступны на всех платформах. QNetworkConfigurationManager::Capability следует использовать для определения возможностей платформы во время выполнения. В следующей таблице перечислены различные платформенные API, используемые этим API. Это может помочь в определении поддержки функций:
| Платформа | Возможности бэкенда |
|---|---|
| Linux® | Linux использует API NetworkManager и ConnMan / oFono, которые поддерживают уведомления об интерфейсах и запуск/остановку сетевых интерфейсов. Поддерживается версия Network Manager 0.9 и выше. |
| Windows® XP | Эта платформа поддерживает уведомления об интерфейсах без активного опроса. |
| Windows XP SP2+Hotfixes, Windows XP SP3, Windows Vista, Windows 7 | В дополнение к стандартному Windows XP, мониторинг точек доступа Wi-Fi был улучшен, что включает возможность запуска и остановки Wi-Fi интерфейсов. Для этого требуется, чтобы Windows управляла Wi-Fi интерфейсами. |
| Mac OS® | Эта платформа полностью поддерживается CoreWLAN, предлагаемой в Mac OS 10.6. Предыдущие версии Mac OS — 10.5 и 10.4 — имеют ограниченную поддержку. |
| Все остальные платформы (*nix, Windows Mobile) | Этот бэкенд является резервным вариантом для всех платформ и поддерживает уведомления о сетевых интерфейсах только с помощью активного опроса. |
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/archives/qt-5.6/bearer-management.html