Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在不打开插座的情况下访问Windows Phone 7特定网络类型(如EDGE、3G等)?_C#_Windows Phone 7.1_Windows Phone 7 - Fatal编程技术网

C# 如何在不打开插座的情况下访问Windows Phone 7特定网络类型(如EDGE、3G等)?

C# 如何在不打开插座的情况下访问Windows Phone 7特定网络类型(如EDGE、3G等)?,c#,windows-phone-7.1,windows-phone-7,C#,Windows Phone 7.1,Windows Phone 7,据我所知,在Mango SDK更新(7.1)之前,您只能通过属性NetworkInterface.NetworkInterfaceType访问相当广泛的网络类型。这将返回一个枚举,如Wireless8021,MobileBroadbandGSM,或MobileBroadbandCDMA 芒果SDK发布后,我们现在可以通过一个开放的套接字访问NetworkInterface子类型,调用类似于以下内容:socket.GetCurrentNetworkInterface()返回对象的属性(Networ

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

芒果SDK发布后,我们现在可以通过一个开放的套接字访问NetworkInterface子类型,调用类似于以下内容:
socket.GetCurrentNetworkInterface()
返回对象的属性(
NetworkInterfaceInfo.InterfaceSubtype
)将为您提供更具体的网络信息,如
Cellular\u EDGE
Cellular\u HSPA
Cellular\u EVDV
。这就是我需要的信息

我找到的访问此文件的最有效方法是打开一个异步主机名解析请求,并获取异步回调函数中的信息,如下面所示(从本文借用:):

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

更新1:我通过测试发现,正如Richard Szalay所建议的,当手机切换网络技术(即3G到EDGE,或WiFi到HSPA)时,
DeviceNetworkInformation.NetworkAvailabilityChanged
事件确实会触发,并且您确实可以访问
网络接口子类型
。不幸的是,我还发现,当从WiFi切换到蜂窝网络技术(如HSPA、EDGE)时,报告的网络子类型往往不准确。例如,如果从WiFi切换到HSPA,事件参数可能在触发WiFi连接时仍会报告到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
。如果是这样的话,您可以在那个时候执行另一个解决方案(尽管这样做的成本可能太高)。如果没有,恐怕您运气不好。

注册到
设备网络信息。网络可用性已更改
,然后通过以下方式获取
网络接口子类型的列表:

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

这是一个非常好的建议,谢谢。我会尝试一下,如果它不起作用,我只能将就着微软提供的东西。感谢您花时间回复@开玩笑-没问题。你标记你觉得有用的问题/答案(即使是你没有问的问题),如果答案解决了你的问题,你可以单击“单击”将其标记为答案。感谢提示:-)我还不能标记(低代表),但如果它能达到我们希望的效果,我会将此标记为答案。通过测试,我发现NetworkAvailabilityChanged事件确实是在手机切换网络技术(即从3G切换到EDGE)时触发的。我将此响应标记为答案,因为它确实以我需要的方式为我提供了我需要的信息,尽管我确实需要做更多的测试来确定这是否可靠--到目前为止,我的结果显示报告的网络接口有些不准确。随着我了解更多,我将更新我的帖子。再次感谢你,理查德!
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");