Share via


여러 PDP 컨텍스트를 사용하여 앱 개발

PDP(패킷 데이터 프로토콜) 컨텍스트는 디바이스와 모바일 네트워크가 IP 패킷을 교환할 수 있는 패킷 데이터 연결을 제공합니다. 3GPP 표준에 따라 디바이스는 한 번에 둘 이상의 PDP 컨텍스트를 활성화할 수 있습니다. Windows 8.1 및 Windows 10 여러 PDP 컨텍스트가 지원되며 앱이 Windows 8 지원된 인터넷 PDP 컨텍스트와 함께 특수 PDP 컨텍스트를 통해 모바일 네트워크에 통신할 수 있습니다. 이 기능을 사용하여 Windows에서 차별화된 환경과 혁신적인 서비스를 만들 수 있습니다. 또한 앱 개발자와 협력하여 고객을 위한 우수한 품질의 VOIP 및 비디오 스트리밍 환경을 개발할 수 있습니다.

다음은 Windows 8.1 및 Windows 10 여러 PDP 컨텍스트가 작동하는 방식을 보여 주는 그림입니다.

Windows 8.1 및 Windows 10 여러 PDP 컨텍스트가 작동하는 방식을 보여 주는 다이어그램

이 항목의 다음 섹션을 사용하여 여러 PDP 컨텍스트에 대해 자세히 알아봅니다.

주요 시나리오

여러 PDP 컨텍스트를 사용하여 프리미엄 서비스를 사용하도록 설정할 수 있습니다.

  • 차별화된 청구 – 여러 PDP 컨텍스트를 사용하여 데이터 또는 청구 제한을 변경할 수 있습니다. 예를 들어 Contoso는 고객을 위한 데이터 백업 앱을 개발한 통신사입니다. 통신사인 Contoso는 여러 PDP 컨텍스트를 만들고 프리미엄 구독자가 앱을 무료로 사용할 수 있도록 할 수 있습니다. 다른 모든 구독자는 이를 사용하기 위해 별도로 요금이 청구됩니다.

  • 리치 커뮤니케이션 서비스 – GSM 협회가 향상된 전화 번호부, 향상된 메시징 및 보강 통화와 같은 풍부한 통신 서비스를 제공하기 위해 만든 글로벌 이니셔티브입니다. Rich Communication Services는 통신사 간 상호 운용성을 제공하며 기존 자산 및 기능을 사용하여 고품질의 혁신적인 통신 서비스를 제공하는 새로운 방법을 제공합니다.

  • 스폰서 연결 – 이를 통해 사용자는 월별 데이터 사용량에 반하지 않고 특정 유형의 콘텐츠를 사용할 수 있습니다. 콘텐츠 공급자는 직접 지불, 수익 공유 거래 또는 기타 비즈니스 계약을 수행하여 통신사에 상환할 수 있도록 합니다.

  • 개인 핫스팟 – 일부 통신사는 연결이 개인 핫스팟으로 사용될 때 다른 요금을 청구합니다. 여러 PDP 컨텍스트를 사용하여 둘을 구분할 수 있습니다.

모바일 광대역 앱

UWP 모바일 광대역 앱은 여러 PDP 컨텍스트를 활용하여 특수 PDP 컨텍스트를 활성화하고 데이터 트래픽을 라우팅하는 규칙을 지정할 수 있습니다. 이러한 앱은 특정 대상 또는 모든 데이터 트래픽에 대한 규칙을 만들 수 있습니다.

모바일 광대역 앱이 네트워크와 데이터를 교환해야 하는 경우 사용 가능한 네트워크와 연결된 네트워크를 확인합니다. 모바일 광대역 앱에 이러한 네트워크에 대한 특수 규칙이 있는 경우 연결 관리자 API를 사용하여 특수 PDP 컨텍스트를 엽니다. 이 연결이 성공하면 PDP 컨텍스트는 이 연결에 대한 라우팅 규칙을 제공하고 네트워킹 API를 사용하여 데이터를 전송합니다. 모바일 광대역 앱은 NetworkStatusChanged 이벤트를 수신하는 경우 이를 반복하여 연결이 변경되었는지 여부와 새 연결에 대한 PDP 컨텍스트를 열어야 하는지 여부를 확인해야 합니다.

사용 가능한 네트워크와 연결된 네트워크를 확인하는 모바일 광대역 앱의 프로세스를 보여 주는 순서도입니다.

네트워킹 API

특별한 PDP 컨텍스트를 사용하여 데이터를 전송하기 위해 Microsoft Store 앱은 데이터 전송에 사용하는 네트워킹 API에 따라 다른 논리를 사용해야 합니다.

HTTP 기반 API

XMLHTTPRequest, IXHR2, Windows.Web.SyndicationWindows.Web.AtomPub와 같은 HTTP 기반 API 및 JQuery 및 Windows.Web.Http와 같은 Windows HTTP 프로토콜을 기반으로 하는 API는 특정 인터페이스에 바인딩할 수 없습니다. 이러한 API의 경우 Windows는 정책을 사용하여 데이터를 특수 PDP 컨텍스트로 라우팅하는 작업을 처리합니다. 특수 PDP 컨텍스트가 활성화되면 앱은 대상 및 특수 PDP 컨텍스트에 따라 라우팅 규칙을 지정할 수 있습니다. 대상은 도메인 이름 또는 IP 주소(예: video.fabrikam.com, .contoso.com 또는 123.23.34.333)일 수 있습니다. 라우팅 규칙을 지정한 후 앱이 위의 HTTP API를 사용하여 데이터를 전송하는 경우 Windows는 라우팅 규칙에 따라 데이터를 특수 PDP 컨텍스트로 보냅니다. 앱이 데이터 전송을 완료하면 특수 PDP 컨텍스트의 연결을 끊고 경로 정책을 제거해야 합니다.

참고

백그라운드 전송 APIHTTP 클라이언트(C#) API는 경로 정책을 사용할 수 없습니다.

특수 PDP 컨텍스트를 통해 데이터를 보내기 위해 HTTP 기반 API를 사용하는 프로세스를 보여 주는 다이어그램

소켓 기반 API

TCP, UDP 및 스트림 소켓과 같은 Windows.Networking.Sockets 네임스페이스에서 사용할 수 있는 소켓 기반 API는 특정 인터페이스에 바인딩하는 메커니즘을 제공합니다. 앱이 소켓 API를 사용하는 경우 데이터를 특수 PDP 컨텍스트로 라우팅하기 위해 특정 인터페이스에 바인딩해야 합니다. 특수 PDP 컨텍스트가 활성화되면 AcquireConnectionAsync API는 앱에 인터페이스 정보를 제공합니다. 이 정보를 사용하여 특정 인터페이스에 바인딩하고 데이터 전송을 시작할 수 있습니다.

특수 PDP 컨텍스트를 통해 데이터를 보내기 위해 소켓 기반 API를 사용하는 프로세스를 보여 주는 다이어그램

여러 PDP 콘텐츠 API 정보

Windows 8.1 및 Windows 10 여러 PDP 컨텍스트를 지원하기 위해 다음 API를 추가했습니다.

  • 셀룰러ApnContext 이 클래스에는 네트워크에서 액세스 지점을 지정하는 데 사용되는 속성이 포함되어 있습니다. 특정 액세스 지점에 대한 연결을 설정하기 위해 AcquireConnectionAsync 호출과 함께 CellularApnContext 개체가 전달됩니다.

  • ConnectivityManager::AcquireConnectionAsync 이 API는 지정된 APN(액세스 지점 이름) 또는 PDP 컨텍스트에 대한 새 연결을 활성화합니다. 이 비동기 메서드를 사용하면 앱이 적절한 구성 정보를 사용하여 특정 APN 또는 PDP 컨텍스트에 대한 연결을 요청할 수 있습니다. 특수 APN이 활성화되면 Windows 및 앱에 대한 새 가상 인터페이스로 표시됩니다.

  • ConnectivityManager::AddHttpRoutePolicy 이 메서드는 데이터를 특수 PDP 컨텍스트로 라우팅하기 위해 HTTP 스택 트래픽에서 사용할 정책을 추가합니다. 앱은 도메인 이름, IP 주소 및 특수 PDP 컨텍스트 프로필과 같은 대상을 기반으로 정책을 지정할 수 있습니다. Windows HTTP 스택은 앱이 정책을 만든 후 데이터를 특수 PDP 컨텍스트로 라우팅하는 정책을 사용합니다.

  • ConnectivityManager::RemoveHttpRoutePolicy 이 메서드는 이전에 추가한 HTTP 경로 정책을 제거합니다.

다음 코드에서는 HTTP 기반 데이터 전송에 이러한 API를 사용하는 방법을 보여 줍니다.

var connectivity = Windows.Networking.Connectivity;
var currentRoutePolicy = null;
var currentConnectionSession = null;

//  Create PDP context/APN data
var apnContext                      =   new connectivity.CellularApnContext();
apnContext.accessName               =   "myAPN.com";
apnContext.userName                 =   "APNusername"
apnContext.password                 =   "[PLACEHOLDER]";
apnContext.isCompressionEnabled     =   false;
apnContext.authenticationType       =   connectivity.CellularApnAuthenticationType.none;

//  Request a connection to Windows
connectivity.ConnectivityManager.acquireConnectionAsync(apnContext).done(onConnectionSucceeded, onConnectionFailed);


//  On successful Activation of APN, Windows returns a ConnectionSession object that encapsulates the new connection profile

function onConnectionSucceeded(result
{
    // keep the connectionSession in scope
    currentConnectionSession= result;

    //  create a route policy for the new connection
    currentRoutePolicy = new connectivity.routePolicy(currentConnectionSession.ConnectionProfile, new hostName("video.mydomain.com"),Windows.Networking.DomainNameType.suffix);

    //  indicate the new route policy to the Http stack
    connectivity.connectivityManager.addHttpRoutePolicy(currentRoutePolicy);

    // Backend data interaction with appropriate HTTP APIs (IXHR, Open IFrame etc.)


    // After completing the data transfer remove the Route Policy
    connectivity.connectivityManager.removeHttpRoutePolicy(currentRoutePolicy);
    currentRoutePolicy = null;

    // Disconnect the PDP Context to free up resources
    currentConnectionSession.close();
}

다음 코드에서는 소켓 기반 데이터 전송에 이러한 API를 사용하는 방법을 보여 줍니다.

// Connect to Special PDP Context
var connectivity = Windows.Networking.Connectivity;
var currentRoutePolicy = null;
var currentConnectionSession = null;

// Create PDP Context/APN Data
var apnContext = new connectivity.CellularApnContext();

// Create PDP context/APN data
var apnContext = new connectivity.CellularApnContext();
apnContext.accessName = "myAPN.com";
apnContext.userName = "APNusername"
apnContext.password = "[PLACEHOLDER]";
apnContext.isCompressionEnabled = false;
apnContext.authenticationType = connectivity.CellularApnAuthenticationType.none;

// Request the connection to Windows
connectivity.ConnectivityManager.acquireConnectionAsync(apnContext).done(onConnectionSucceeded, onConnectionFailed);

// On successful activation of an APN, Windows returns a ConnectionSession object that encapsulates the new connection profile
                function onConnectionSucceeded(result) {

// keep the connectionSession in scope
currentConnectionSession = result;

var socket = new Windows.Networking.Sockets.StreamSocket();
var hostName = new Windows.Networking.HostName("www.contoso.com");
var portNumber = "1234";

// Bind the socket to new Special PDP Context Connection
socket.connectAsync(hostName, portNumber, SocketProtectionLevel.PlainSocket, currentConnectionSession.connectionProfile.networkAdapter).done(onSocketConnectionSucceeded, onSocketConnectionFailed);

function onSocketConnectionSucceeded(result)
{
    // Start transferring data using socket APIs

}

// Closing the sockets
socket.close();

// Disconnect the PDP Context to free up resources
currentConnectionSession.close();

앱은 특별한 PDP 컨텍스트 연결에서 네트워크 전환을 처리하려면 NetworkStatusChanged 이벤트를 처리해야 합니다.

시나리오: 프리미엄 모바일 광대역 앱은 특수 APN을 사용하여 무료 데이터 액세스를 제공합니다.

이 시나리오에서 모바일 광대역 앱은 특별한 PDP 컨텍스트를 사용하여 무료 데이터 액세스를 제공합니다. 앱은 무료인 경우 Wi-Fi 네트워크와 같은 연결된 네트워크를 사용하거나 특정 운영자 네트워크에 연결된 경우 특수 APN을 사용합니다. 다음 샘플 코드는 무료 네트워크가 연결되지 않은 경우 앱이 특수 PDP 컨텍스트에서 데이터를 전송하기 위해 여러 PDP 컨텍스트 API를 사용하는 방법을 보여 줍니다.

// Reference the namespace
var connectivity = Windows.Networking.Connectivity;

// Current route policy
var currentRoutePolicy = null;
var currentConnectionSession = null;

function onLoad()
{
  // Register for network status change
  connectivity.networkInformation.addEventListener("networkstatuschanged", OnNetworkStatusChange);
  // Process the current status
  handleNetworkChange();
}

//  Handle newtork status changes
function onNetworkStatusChange()
{
  HandleNetworkChange();
}

// On network status change:
//  if there is no connectionPolicy, evaluate a new one
//  if there is a current connectionPolicy ==> verify it is still valid
//      evaluate a new one if the current connectionPolicy is not valid
function handleNetworkChange()
{
  if (isCurrentPolicyStillValid())
  {
    //the current policy is still valid.
    return;
  }

  //  No policy or current policy is not good anymore
  //  cleanup any previous configuration
  if (currentRoutePolicy)
  {
    connectivity.ConnectivityManager.removeHttpRoutePolicy(currentRoutePolicy);
    currentRoutePolicy = null;
  }

  //  if a different APN was connected, disconnect it to free up resources
  if (connectionConnectionSession != null)
  {
    connectionConnectionSession.close();
    connectionConnectionSession = null;
  }

  // evaluate connection policy
  startEvaluateConnectionPolicy();
}

//  evaluate if the current connectionPolicy is still valid
function isCurrentPolicyStillValid()
{
  if (null != currentRoutePolicy)
  {
    // a policy is currently in place, let's verify if it is still valid
    var currentProfile = currentRoutePolicy.connectionProfile();
    if (NetworkConnectivityLevel.none != currentProfile.GetNetworkConnectivityLevel())
    {
      // current policy is still good. bail out
      return true;
    }
  }
  return false;
}

// starts the evaluation of a new connection policy
function startEvaluateConnectionPolicy()
{
  // first try to get a free network if it is available
  var queryFilter = new connectivity.connectionProfileFilter();
  queryFilter.networkCostType = connectivity.networkCostType.unrestricted;
  queryFilter.isConnected = true;

  connectivity.networkInformation.findConnectionProfilesAsync(queryFilter).done(onSuccess, onFailure);
}

//  Succesfully retrieved at least one free connection profile
function onSuccess(results)
{
  if(results.count > 0)
  {
  //  Enfore the route to the http stack
  enforceHttpRoutePolicy(results[0]);

  // Backend data interaction with appropriate APIs(Open IFrame etc.)

  }
  else
  {
    onFailure();
  }
}

//  there are no free networks available at this time
function onFailure()
{
  //  create a request to connect a specific APN on the network
  // no free network available, connect
  var apnContext                      =   new connectivity.CellularApnContext();
  apnContext.accessPointName          =   "myAPN.com";
  apnContext.userName                 =   "APNusername"
  apnContext.password                 =   "[PLACEHOLDER]";
  apnContext.isCompressionEnabled     =   false;
  apnContext.authenticationType       =   connectivity.CellularApnAuthenticationType.none;

  //
  //  request the connection to Windows
  connectivity.connectivityManager.acquireConnectionAsync(apnContext).done(onConnectionSucceeded, onConnectionFailed);
}

//  on success Windows returns a ConnectionSession object that encapsulates the new connection profile
function onConnectionSucceeded(result)
{
  // keep the connectionSession in scope
  currentConnectionSession= result;
  //  create a route policy for the new connection
  enforceHttpRoutePolicy(currentConnectionSession.ConnectionProfile,new hostName("video.mydomain.com"),Windows.Networking.DomainNameType.suffix);

  // Backend data interaction with appropriate APIs(Open IFrame etc.)

}

//  Windows was not able to connect the specified APN
function onConnectionFailed()
{
  // display error message and just wait for Network Status Change event to try again
}

//  utility function to enforce a route policy
function enforceHttpRoutePolicy(connectionProfile,targetSuffix)
{
  //  Keep the route request global so we can close it later
  currentRoutePolicy= new connectivity.routePolicy(connectionProfile, targetSuffix);
  //  Indicate the new route policy to the Http stack
  connectivity.connectivityManager.addHttpRoutePolicy(currentRoutePolicy);
}

//  cleanup on shutdown
function onShutdown()
{
  //  Remove the route policy from HttpStack
  connectivity.connectivityManager.removeHttpRoutePolicy(currentRoutePolicy);
  currentRoutePolicy = null;

  //  If a different APN was connected, disconnect it to free up resources
  if(currentConnectionSession!= null)
  {
    currentConnectionSession.close();
  }
}

시나리오: 모바일 광대역 앱에는 구독 구매 및 프로비저닝을 위한 특별한 PDP 컨텍스트가 필요합니다.

이 시나리오에서 모바일 광대역 앱에는 구독 구매 및 프로비저닝을 위한 특별한 PDP 컨텍스트가 필요합니다. 이 앱은 연결된 네트워크에 관계없이 특별한 PDP 컨텍스트를 활성화합니다.

var connectivity = Windows.Networking.Connectivity;
var currentRoutePolicy = null;
var currentConnectionSession = null;

function onLoad()
{
  // Register for network status change
  connectivity.networkInformation.addEventListener("networkstatuschanged", OnNetworkStatusChange);
  // Process the current status
  handleNetworkChange();
}

function onNetworkStatusChange()
{
  HandleNetworkChange();
}

//  Create the PDP Context/APN Data
var apnContext                      =   new connectivity.CellularApnContext();
apnContext.providerId               =   "23545";
apnContext.accessPointName          =   "myAPN.com";
apnContext.userName                 =   "APNusername"
apnContext.password                 =   "[PLACEHOLDER]";
apnContext.isCompressionEnabled     =  false;
apnContext.authenticationType       =   connectivity.CellularApnAuthenticationType.none;

//  Request the connection to Windows
connectivity.connectivityManager.acquireConnectionAsync(apnContext).done(onConnectionSucceeded, onConnectionFailed);

//  On successful connection to PDP Context,  Windows returns a ConnectionSession object that incapsulate the new connection profile
function onConnectionSucceeded(result)
{
  // keep the connectionSession in scope
  currentConnectionSession= result;

  //  create a route policy for the new connection
  currentRoutePolicy = new connectivity.routePolicy(currentConnectionSession.ConnectionProfile, new hostName("video.mydomain.com"),Windows.Networking.DomainNameType.suffix);

  //  indicate the new route policy to the Http stack
  connectivity.connectivityManager.addHttpRoutePolicy(currentRoutePolicy);

  // Backend data interaction with appropriate APIs(Open IFrame etc.)

  // After completing the data transfer remove the Route Policy
  connectivity.connectivityManager.removeHttpRoutePolicy(currentRoutePolicy);
  currentRoutePolicy = null;

  // Disconnect the PDP Context to free up resources
  currentConnectionSession.close();

}

function handleNetworkChange()
{
  // App behavior to handle network
  var currentProfile = currentRoutePolicy.connectionProfile();
  if (NetworkConnectivityLevel.none != currentProfile.GetNetworkConnectivityLevel())
  {
    // The special PDP Context is disconnected, app should handle this. It can request another connection to special PDP Context or it can show error to the user.
  }
}

모바일 광대역 앱에 대한 고려 사항

모바일 광대역 앱은 각 PDP 컨텍스트에 대한 로컬 데이터 사용량 정보를 얻고 특별한 PDP 컨텍스트에 대한 정책으로 Windows에 영향을 줄 수 있습니다.

로컬 데이터 사용량

Windows 8 모바일 광대역 앱을 통해 현재 데이터 사용량을 표시할 수 있는 사용자와 지속적인 구독 기반 관계를 제공합니다. 사용자는 현재 데이터 사용량을 보고 청구 주기 또는 세션 종료 날짜를 이해하여 적절한 결정을 내릴 수 있습니다. 네트워크의 부하를 최대한 줄이려면 네트워크와 데이터 사용량을 주기적으로 검사 합니다. Windows는 사용자에게 현재 데이터 사용량을 표시하기 위해 데이터 사용량과 결합하는 데 사용할 수 있는 로컬 데이터 사용량 API를 제공합니다.

특별한 PDP 컨텍스트는 데이터 액세스 요금을 특정 앱 또는 서비스와 구분하는 기능을 제공합니다. 각 PDP 컨텍스트는 로컬 데이터 사용 카운터에 대해 다른 프로필로 처리됩니다. 모바일 광대역 앱은 인터넷 PDP 컨텍스트가 Windows 8 작동하는 방식과 유사하게 특정 기간 동안 각 PDP 컨텍스트에 대한 로컬 데이터 사용량을 쿼리할 수 있습니다. 이 정보를 사용하여 사용자에게 적절한 데이터 사용 환경을 표시할 수 있습니다.

다음 샘플 코드에서는 네트워킹 API를 사용하여 모든 PDP 컨텍스트에 대한 로컬 데이터 사용량을 읽는 방법을 보여 줍니다.

// Get the network account ID.
IReadOnlyList<string> networkAccIds = Windows.Networking.NetworkOperators.MobileBroadbandAccount.AvailableNetworkAccountIds;

if (networkAccIds.Count == 0)
{
  rootPage.NotifyUser("No network account ID found", NotifyType.ErrorMessage);
  return;
}

// For the sake of simplicity, assume we want to use the first account.
// Refer to the MobileBroadbandAccount API's how to select a specific account ID.
string networkAccountId = networkAccIds[0];

// Create mobile broadband object for specified network account ID
var mobileBroadbandAccount = Windows.Networking.NetworkOperators.MobileBroadbandAccount.CreateFromNetworkAccountId(networkAccountId);

// Get all connection profiles associated with this network account ID
var connectionProfiles = mobileBroadbandAccount.GetConnectionProfiles();

// Collect local usages for last one hour
DateTime endTime = DateTime.Now;
TimeSpan timeDiff = TimeSpan.FromHours(1);
DateTime startTime = endTime.Subtract(timeDiff);
string message = string.Empty;

foreach (var connectionProfile in connectionProfiles)
{
  // Display local usages for each connection profiles
  DataUsage localUsage = connectionProfile.GetLocalUsage(startTime, endTime);
  message += "Connection Profile Name:  " + connectionProfile.ProfileName + "\n\n";
  message += "Local Data Usage from " + startTime.ToString() + " to " + endTime.ToString() + ":\n";
  message += " Bytes Sent     : " + localUsage.BytesSent + "\n";
  message += " Bytes Received : " + localUsage.BytesReceived + "\n\n";
}

// Print the message string

정책

일부 연산자는 특수 PDP 컨텍스트에 제한된 대역폭이 있음을 표시했습니다. 특수 PDP 컨텍스트를 활성화하지만 특수 PDP 컨텍스트를 사용할 수 있는 액세스 권한이 없는 앱은 서비스 거부 공격을 만들 수 있습니다. 특수 APN의 사용을 비즈니스 관계가 있는 특정 앱으로 제한해야 합니다. 특별한 APN 이름을 가진 UWP 앱 목록을 Windows에 제공할 수 있습니다. Windows는 해당 정보를 사용하여 특수 APN에 대한 액세스를 제한합니다. 목록을 제공하지 않으면 Windows는 모든 앱에 대해 특수 PDP 컨텍스트가 열려 있다고 가정합니다.

참고

이는 특수 PDP 컨텍스트에서 추가 트래픽을 방지하기 위한 것입니다. 앱을 특수 PDP 컨텍스트로 제한하기 위한 보안 메커니즘으로 사용할 수 없습니다. 특수 PDP 컨텍스트에 대한 액세스를 제한하려면 네트워크에서 일부 인증 또는 보안 메커니즘을 구현해야 합니다. 예를 들어 특정 PDP 컨텍스트에 대해 특정 IP 주소만 허용하는 필터를 사용할 수 있습니다.

일부 모바일 네트워크는 여러 PDP 컨텍스트를 지원하지 않습니다. 네트워크에서 여러 PDP 컨텍스트를 지원하는지 여부를 프로비전할 수 있습니다. 네트워크에서 여러 PDP 컨텍스트를 지원하지 않는 경우 Windows는 앱이 특수 APN에서 주문형 연결을 만드는 것을 허용하지 않아야 합니다. 기본적으로 Windows는 여러 PDP 컨텍스트를 지원합니다.

다음 샘플 XML 파일은 Windows 프로비저닝 메타데이터를 사용하여 특수 PDP 컨텍스트에 허용되는 앱 목록을 제공하는 방법을 보여 줍니다.

<?xml version="1.0" encoding="utf-8"?>
<CarrierProvisioning xmlns="http://www.microsoft.com/networking/CarrierControl/v1">
  <Global>
    <!-- Adjust the Carrier ID to fit your own ID. Refer to the documentation about Carrier ID's. -->
    <CarrierId>{11111111-1111-1111-1111-111111111111}</CarrierId>
    <!-- Adjust the Susbscriber ID. Refer to the documentation about Subscriber ID's. -->
    <SubscriberId>1234567890</SubscriberId>
  </Global>
  <Extensions>
    <Extensions_v2 xmlns="http://www.microsoft.com/networking/CarrierControl/v2">
      <AdditionalPDPContexts>
        <MultiplePDPContextPolicies MultiplePDPContextSupport="true">
          <PDPContextPolicy>
            <!-- Adjust the profile name -->
            <Name>Contoso1</Name>
            <Context>
              <!-- Adjust the access string to your APN. -->
              <AccessString>Contoso.Contoso1</AccessString>
              <!-- Adjust the UserLogonCred to fit your UserLogonCred. Refer to the documentation about UserLogonCred's. -->
              <UserLogonCred>
                <UserName>user1</UserName>
                <Password>[PLACEHOLDER]</Password>
              </UserLogonCred>
            </Context>
            <AppIDList>
              <!-- Adjust the AppId to your AppId -->
              <AppID>Contoso.Sample1.CS_dsarewaj</AppID>
              <AppID>Contoso.Sample2.CPP_dsarewaj</AppID>
            </AppIDList>
          </PDPContextPolicy>
          <PDPContextPolicy>
            <!-- Adjust the profile name -->
            <Name>Contoso2</Name>
            <Context>
              <!-- Adjust the access string to your APN. -->
              <AccessString>Contoso.Contoso2</AccessString>
              <!-- Adjust the UserLogonCred to fit your UserLogonCred. Refer to the documentation about UserLogonCred. -->
              <UserLogonCred>
                <UserName>user2</UserName>
                <Password>[PLACEHOLDER]</Password>
              </UserLogonCred>
            </Context>
            <AppIDList>
              <!-- Adjust the AppId to your AppId -->
              <AppID>Contoso.Sample3.CS_dsarewaj</AppID>
              <AppID>Contoso.Sample4.CPP_dsarewaj</AppID>
            </AppIDList>
          </PDPContextPolicy>
        </MultiplePDPContextPolicies>
      </AdditionalPDPContexts>
    </Extensions_v2>
  </Extensions>
</CarrierProvisioning>

오디오 및 비디오 스트리밍

오디오 스트리밍 앱은 특수 PDP 컨텍스트를 사용하여 오디오 또는 비디오 스트림을 재생할 수 있습니다. HTTP API와 마찬가지로 앱은 다음 논리를 사용하여 오디오 또는 비디오 태그를 <사용하여 오디오> 또는 <비디오를> 재생할 수 있습니다.

특수 PDP 컨텍스트를 사용하는 스트리밍 앱의 워크플로를 보여 주는 다이어그램

WinInet API를 기반으로 비디오 프레임워크를 사용할 수 있습니다.

InstantGo

InstantGo는 사용자가 휴대폰에서 기대하는 즉각적인 사용자 환경을 제공합니다. 휴대폰에서와 마찬가지로 InstantGo를 사용하면 적절한 네트워크를 사용할 수 있을 때마다 시스템이 신선하고 최신 상태이며 연결할 수 있습니다. 저전력 PC 플랫폼의 InstantGo는 특정 Windows 인증 요구 사항을 충족해야 합니다.

InstantGo에서 지원되는 시나리오는 다음과 같습니다.

  • 새 콘텐츠로 라이브 타일 업데이트

  • 전자 메일 수신

  • 웹 사이트에서 파일 다운로드 또는 업로드

  • 웹 사이트의 사진과 같은 콘텐츠 공유

  • 인스턴트 메시지 수신

  • VoIP 호출 수신

  • 실시간으로 통신

  • 배경 오디오 및 음악 재생

InstantGo에 대한 자세한 내용은 InstantGo 소개를 참조하세요.

모바일 광대역 앱은 이러한 InstantGo 시나리오 중 일부를 사용하도록 설정하기 위해 특별한 PDP 컨텍스트를 사용할 수 있습니다. 다음 논리를 사용하여 적용 범위를 벗어났기 때문에 연결이 끊어진 경우 특수 PDP 컨텍스트에 다시 연결해야 합니다. 디바이스가 연결된 대기 전원 상태가 되면 Windows는 10분 후에 특수 PDP 컨텍스트에 대한 모든 연결을 끊고 앱에서 연결을 다시 요청해야 합니다.

InstantGo 시나리오에서 특수 PDP 컨텍스트에 다시 연결하는 프로세스를 보여 주는 순서도입니다.

백그라운드에서 오디오 스트리밍

오디오 스트리밍 앱은 특수 PDP 컨텍스트를 사용하여 백그라운드 및 연결된 대기 전원 상태에서 오디오를 사용할 수 있습니다. 백그라운드에서 오디오를 재생하는 방법에 대한 자세한 내용은 백그라운드에서 오디오를 재생하는 방법을 참조하세요.

실시간 통신 앱

VoIP 또는 채팅 앱과 같은 실시간 통신 앱은 특수 PDP 컨텍스트에서 절전 모드 해제 트리거를 받을 수 있습니다. 절전 모드 해제 트리거를 사용하면 시스템이 연결된 대기 상태일 때를 포함하여 항상 앱을 트리거할 수 있습니다.

이 시나리오를 사용하도록 설정하려면 모바일 광대역 디바이스는 MBIM(모바일 광대역 인터페이스 모델) 사양에 명시된 대로 특수 PDP 컨텍스트에서 절전 모드 해제 필터를 지원해야 합니다.

모바일 광대역 디바이스

여러 PDP 컨텍스트를 지원하려면 모바일 광대역 디바이스의 펌웨어가 MBIM 사양에 정의된 대로 여러 PDP 컨텍스트를 지원해야 합니다. 또한 여러 PDP 컨텍스트와 관련된 모든 Windows 하드웨어 인증 키트 테스트를 통과해야 합니다.

이 기능은 운영자별로 지정되므로 모바일 광대역 디바이스의 경우 선택 사항입니다. 이 기능이 필요한 경우 다음과 같은 연산자 요구 사항에 여러 PDP 컨텍스트 기능을 추가해야 합니다.

  • 디바이스 펌웨어는 MBIM 사양의 섹션 10.5.12.1에 설명된 대로 여러 IP 데이터 스트림을 지원해야 합니다. 여기에는 여러 PDP 컨텍스트를 완전히 지원하기 위해 CID 및 IP 데이터 스트림의 모든 제어 구현을 지원하는 것이 포함됩니다.

  • 디바이스 펌웨어는 Windows에서 사용하기 위해 여러 이중 전달자(IPv4 & IPv6) PDP 컨텍스트를 지원해야 합니다.

    • 여기에는 요구 사항에 따라 인터넷 연결에 대한 1개와 모바일 광대역 앱에 대한 추가 PDP 컨텍스트가 포함됩니다.

    • 펌웨어가 SMS 및 기타 관리 컨텍스트에 사용할 수 있는 디바이스 관리 PDP 컨텍스트는 필요하지 않습니다.

  • 디바이스 펌웨어는 펌웨어에서 이미 내부적으로 디바이스 관리되는 PDP 컨텍스트에 대해 호스트 운영 체제 요청을 정상적으로 활용할 수 있어야 합니다.

  • 디바이스 펌웨어는 SMS PDP 컨텍스트를 계속 추상화하고 아래에 사용된 전달자에 관계없이 SMS CID를 통해 라우팅해야 합니다.