繁体   English   中英

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

[英]How to access Windows Phone 7 specific network type (e.g. EDGE, 3G, etc.) without opening a socket?

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

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

我发现访问它的最有效方法是打开异步主机名解析请求并获取异步回调函数中的信息,如下所示(借用这篇文章: 我如何检查3G,wifi,EDGE,Cellular 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)。 就我的目的而言,我只记录尚未记录的变化并忽略倍数。 它不是理想的(而且似乎稍微不值得信赖),但我认为它总比没有好。

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

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

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

注册到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");

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM