如何在不打开套接字的情况下访问Windows Phone 7特定的网络类型(例如EDGE, 3G等)
本文关键字:类型 网络 例如 EDGE 3G Phone 套接字 Windows 访问 情况下 | 更新日期: 2023-09-27 18:19:17
据我所知,在Mango SDK更新(7.1)之前,您只能通过属性NetworkInterface.NetworkInterfaceType
访问相当广泛的网络类型。这将返回一个类似Wireless80211
、MobileBroadbandGSM
或MobileBroadbandCDMA
的枚举。
在Mango SDK发布之后,我们现在能够通过一个开放的套接字访问NetworkInterfaceSubtype,使用类似于以下的调用:socket.GetCurrentNetworkInterface();
返回对象(NetworkInterfaceInfo.InterfaceSubtype
)的属性将为您提供更具体的网络信息,如Cellular_EDGE
, Cellular_HSPA
或Cellular_EVDV
。这就是我需要的信息。
我发现访问这个最有效的方法是打开一个异步主机名解析请求,并在异步回调函数中获取信息,如下所示(从这篇文章中借用:我如何在Windows Phone 7中检查3G, wifi, EDGE,蜂窝网络?):
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");