如何在不打开套接字的情况下访问Windows Phone 7特定的网络类型(例如EDGE,3G等)?

时间:2012-01-03 23:10:53

标签: c# windows-phone-7.1 windows-phone-7

据我所知,在Mango SDK更新(7.1)之前,您只能通过属性NetworkInterface.NetworkInterfaceType访问相当广泛的网络类型。这将返回Wireless80211MobileBroadbandGSMMobileBroadbandCDMA等枚举。

Mango SDK发布后,我们现在可以使用类似于此的调用通过打开的套接字访问NetworkInterfaceSubtype:socket.GetCurrentNetworkInterface();返回的对象(NetworkInterfaceInfo.InterfaceSubtype)的属性将给出您可以使用更具体的网络信息,例如Cellular_EDGECellular_HSPACellular_EVDV。这是我需要的信息。

我发现访问它的最有效方法是打开异步主机名解析请求并获取异步回调函数中的信息,如下所示(借用此帖子:How can I check for 3G, wifi, EDGE, Cellular Networks in Windows Phone 7?):

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

我正在寻找的是一种访问此NetworkSubtype信息的方法,而无需实际打开数据连接。我需要一种被动方法来查询这些信息的原因是我需要知道网络类型何时发生变化,但是在循环中不断打开数据连接以查询这可能会阻止发生这种变化。

更新1:我通过测试发现,正如Richard Szalay建议的那样,当手机切换网络技术(即3G到EDGE,或WiFi到HSPA)时,DeviceNetworkInformation.NetworkAvailabilityChanged事件确实会触发,你确实有访问NetworkInterfaceSubtype。遗憾的是,我还发现,当从WiFi切换到蜂窝网络技术(例如HSPA,EDGE)时,所报告的网络子类型通常可能是不准确的。例如,如果您从WiFi切换到HSPA,事件参数可能会在触发时报告与WiFi的连接,并且不会触发报告HSPA的第二个事件。因此,您的连接类型错误。这种不可靠性可能使得使用此触发器最终无用,但我将进行一些网络测试(没有WiFi)以查看此问题是否仅限于WiFi切换。我希望这只是WiFi无线电的一个问题,并且准确报告了蜂窝网络切换。当我知道更多时,我会更新。

更新2:我已经通过大量(驾驶)测试发现,虽然DeviceNetworkInformation.NetworkAvailabilityChanged事件将使您获得网络更改,但似乎无法准确确定引发/触发事件的内容。例如,如果您在每次触发事件时都记录网络接口,您可能会得到以下结果:HSPA,EDGE,EDGE,EDGE,GPRS,GPRS,HSPA。事件参数对象有一个名为NotificationType的变量,它应该告诉你它被触发的原因,但在我的测试中总是设置为CharacteristicUpdate,所以我不知道为什么它会被触发多次使用相同的网络类型(例如EDGE,EDGE,EDGE)。就我的目的而言,我只记录尚未记录的变化并忽略倍数。它不是理想的(而且似乎稍微不值得信赖),但我认为它总比没有好。

2 个答案:

答案 0 :(得分:3)

我发布了你从中获取代码的答案,我对该问题进行了一些研究(包括浏览WP7框架的反映来源)。

不幸的是,NetworkSubType不会公开地从任何不是开放连接的位置公开,主机名解析最简单。

我唯一可以推荐的是进行测试,以确定当数据类型发生变化时(例如,从3G到H),是否会触发DeviceNetworkInformation.NetworkAvailabilityChanged。如果是这样,那么你可以在那时执行另一个解决方案(尽管这可能证明成本太高)。如果没有,我担心你运气不好。

答案 1 :(得分:0)

注册到DeviceNetworkInformation.NetworkAvailabilityChanged,然后以这种方式获取NetworkInterfaceSubtype列表:

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");