2011-03-16 15 views

Respuesta

6

Si puede utilizar el Mango (7.1) SDK, y si su escenario implica el uso de tomas de corriente, hay una manera trivial para obtener la información/subtipo NetworkInterfaceType para la conexión que acaba de hacer:

NetworkInterfaceInfo netInterfaceInfo = socket.GetCurrentNetworkInterface(); 
    var type = netInterfaceInfo.InterfaceType; 
    var subType = netInterfaceInfo.InterfaceSubtype; 

No hay necesidad para usar la propiedad NetworkInterface.NetworkInterfaceType (que notoriamente toma hasta 30 segundos para regresar); no es necesario activar una resolución de nombre de host solo para determinar el tipo de red; no es necesario escuchar eventos de cambio de red.

Por supuesto, esto funciona mejor junto con DeviceNetworkInformation.IsNetworkAvailable o NetworkInterface.GetIsNetworkAvailable() - esas llamadas regresan inmediatamente ya sea que esté en una red o no. Si es así, primero conecte el zócalo y haga preguntas cuando esté conectado :-)

Una última nota: cuidado con la información de Device Network de Mango.IsWiFiEnabled - Pensé que volvería si estuviese en una red wifi, pero en cambio vuelve si wifi está encendido o apagado en la configuración del teléfono ... no muy útil.

+0

Diría lo mismo para DeviceNetworkInformation.IsCellularDataEnabled. Devuelve verdadero aunque no haya una tarjeta SIM en el teléfono. Parece que solo se trata del estado de la antena, no de la conexión real. – djcouchycouch

+2

¿Cómo obtener un socket? – Yoda

1

Desafortunadamente las API no proporcionan muy limitado información sobre el tipo de conexión de red que tiene. Puede saber si tiene 3G, celular o Ethernet (es decir, conexión USB a PC), pero esa es toda la información que obtiene.

Salida esto para más información Better way to check for an network connection on WP7

+0

¿Cómo puedo saber si estoy en 3G? –

2

A partir de la liberación del mango (beta 2 y RC), esta información ya está disponible, pero que requiere que usted realmente hacer una conexión, presumiblemente debido a que no se comprueba hasta algo lo necesita

Puede realizar una resolución DNS (consulte a continuación) o utilizar el método de extensión WebRequest GetCurrentNetworkInterface, que arrojará una InvalidOperationException si la solicitud aún no se ha conectado.

También hay algunos eventos a seguir en el espacio de nombre Microsoft.Phone.Net.NetworkInformation, pero no me sorprendería si esos eventos no se activaran hasta que se establezca una conexión.

Curiosamente, parece que también puede preferir o requerir por conexión utilizando los métodos de extensión SetNetworkPreference y SetNetworkRequirement, aunque no va más allá de wifi vs celular.

DeviceNetworkInformation.ResolveHostNameAsync(
      new DnsEndPoint("microsoft.com", 80), 
      new NameResolutionCallback(nrr => 
       { 
        var info = nrr.NetworkInterface; 

        var type = info.InterfaceType; 
        var subType = info.InterfaceSubtype; 
       }), null); 

Los valores de enumeración para NetworkInterfaceType (wifi/GSM) y NetworkInterfaceSubType (borde/3g) están disponibles en MSDN.

2

Sin conector:

var currentList = new NetworkInterfaceList().Where(i => i.InterfaceState == ConnectState.Connected).Select(i => i.InterfaceSubtype); 
if (currentList.Contains(NetworkInterfaceSubType.WiFi)) 
    Debug.WriteLine("WiFi"); 
if (currentList.Intersect(new NetworkInterfaceSubType[] 
{ 
    NetworkInterfaceSubType.Cellular_EVDO, 
    NetworkInterfaceSubType.Cellular_3G, 
    NetworkInterfaceSubType.Cellular_HSPA, 
    NetworkInterfaceSubType.Cellular_EVDV, 
}).Any()) 
    Debug.WriteLine("3G"); 
if (currentList.Intersect(new NetworkInterfaceSubType[] 
{ 
    NetworkInterfaceSubType.Cellular_GPRS, 
    NetworkInterfaceSubType.Cellular_1XRTT, 
    NetworkInterfaceSubType.Cellular_EDGE, 
}).Any()) 
    Debug.WriteLine("2G"); 
+0

Mistyped en algunos lugares NetworkInterfaceSubtype debe ser NetworkInterfaceSubType – giacoder

+0

Espero que se solucione ahora. –

0

para obtener datos de red para aplicaciones de Windows Phone es decir que está conectado a una Ethernet, WiFi o red celular que también consigue el subtipo siguiente programa de la red 3G es decir 2G o se puede utilizar.

Using Microsoft.Phone.Net.NetworkInformation 

Using Microsoft.Phone.net.NetworkInfromation 

var Newlist = new NetworkInterfaceList(); 

foreach (NetworkInterfaceInfo x in Newlist) 

{ 

if(x.InterfaceState==ConnectState.Connected) 

{ 

if(x.InterfaceSubtype.Equals(NetworkInterfaceSubType.WiFi)) 

{ 

Interface = x.InterfaceType.ToString(); 

SubInterface = x.InterfaceSubtype.ToString(); 

break; 

} 

else if(x.InterfaceSubtype.Equals(NetworkInterfaceSubType.Cellular_EVDO) || x.InterfaceSubtype.Equals(NetworkInterfaceSubType.Cellular_3G) || x.InterfaceSubtype.Equals(NetworkInterfaceSubType.Cellular_HSPA) || x.InterfaceSubtype.Equals(NetworkInterfaceSubType.Cellular_EVDV)) 

{ 

Interface = x.InterfaceType.ToString(); 

SubInterface= “3G Network”; 

break; 

} 

else if(x.InterfaceSubtype.Equals(NetworkInterfaceSubType.Cellular_GPRS) || x.InterfaceSubtype.Equals(NetworkInterfaceSubType.Cellular_1XRTT) || x.InterfaceSubtype.Equals(NetworkInterfaceSubType.Cellular_EDGE)) 

{ 

Interface = x.InterfaceType.ToString(); 

SubInterface= “2G Network”; 

break; 

} 

else 

{ 

Interface = “Ethernet”; 

SubInterface= “Unknown” ; 

break; 

} 

} 

else 

{ 

Interface=”not connected”; 

SubInterface=”unknown”; 

} 

Aquí, Interface y SubInterface proporcionan la información de la red.