Управление несущими
Управление несущими контролирует состояние подключения системы, позволяя пользователю запускать или останавливать интерфейсы или беспрепятственно перемещаться между точками доступа.
Обзор
API управления несущими контролирует состояние подключения системы. Это включает в себя простую информацию, такую как подключение устройства и количество интерфейсов, а также позволяет разработчику приложений запускать и останавливать сетевые интерфейсы и управлять другими параметрами подключения. В зависимости от возможностей платформы она может даже предоставлять управление сессиями, чтобы сетевой интерфейс оставался активным до тех пор, пока клиенты заинтересованы в нем, и одновременно оптимизировать время его активности.
Этот API не поддерживает управление самими конфигурациями сети. Платформа должна обеспечить инфраструктуру, позволяющую пользователю создавать, редактировать или удалять конфигурации сети.
Подробное описание API
Компьютерные системы управляют своими сетевыми интерфейсами с помощью набора конфигураций. Каждая конфигурация описывает набор параметров, которые указывают системе, как запустить конкретный сетевой интерфейс. Одним из самых простых примеров может быть конфигурация Ethernet, которая подключает сетевую карту к DHCP-серверу. Более сложным примером может быть конфигурация беспроводной локальной сети, которая может включать в себя такие данные о оборудовании, как адрес беспроводной карты, данные о точке доступа беспроводной сети (например, 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 следует использовать для определения функций платформы во время выполнения.
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/archives/qt-5.11/bearer-management.html