zoukankan      html  css  js  c++  java
  • Windows Phone 同步方式获取网络类型

      在Windows Phone 开发中有时候需要获取设备当前连接网络的类型,是Wifi,还是2G,3G,或者4G,SDK中提供获取网络类型的API(Microsoft.Phone.Net.NetworkInformation. DeviceNetworkInformation),通过此API我们可以方便的获取相关信息。但是此API是基于异步回调的方式获取的,如果需要同步获取,那么就需要做一些特殊的处理。

      以下代码定义网络类型信息类,用于存储获取的网络类型信息。

     1     /// <summary>
     2     /// 网络类型
     3     /// </summary>
     4     public enum NetworkType
     5     {
     6         None = 0,
     7         Wifi = 1,       //Wifi
     8         Mobile2G = 2,   //2G网络
     9         Mobile3G = 3,   //3G网络
    10         Mobile4G = 4    //4G网络
    11     }
    12 
    13     /// <summary>
    14     /// 网络类型信息
    15     /// </summary>
    16     public class NetworkInfo
    17     {
    18         /// <summary>
    19         /// 网络接口的名称
    20         /// </summary>
    21         public string InterfaceName { get; set; }
    22 
    23         /// <summary>
    24         /// 网络接口的说明
    25         /// </summary>
    26         public string Description { get; set; }
    27 
    28         /// <summary>
    29         /// 网络类型
    30         /// </summary>
    31         public NetworkType InterfaceType { get; set; }
    32     }

      以下代码将从系统NetworkInterfaceInfo解析获取网络类型信息并写入到上面构造的NetworkInfo类中。

     1         private static NetworkInfo parseNetworkInfo(NetworkInterfaceInfo info)
     2         {
     3             NetworkInfo netInfo = new NetworkInfo();
     4             if (info != null)
     5             {
     6                 netInfo.InterfaceName = info.InterfaceName;
     7                 netInfo.Description = info.Description;
     8                 switch (info.InterfaceType)
     9                 {
    10                     case NetworkInterfaceType.MobileBroadbandCdma:
    11                     case NetworkInterfaceType.MobileBroadbandGsm:
    12                         switch (info.InterfaceSubtype)
    13                         {
    14                             case NetworkInterfaceSubType.Cellular_GPRS:
    15                             case NetworkInterfaceSubType.Cellular_1XRTT:
    16                             case NetworkInterfaceSubType.Cellular_EDGE:
    17                                 netInfo.InterfaceType = NetworkType.Mobile2G;
    18                                 break;
    19                             case NetworkInterfaceSubType.Cellular_3G:
    20                             case NetworkInterfaceSubType.Cellular_EVDO:
    21                             case NetworkInterfaceSubType.Cellular_EVDV:
    22                             case NetworkInterfaceSubType.Cellular_HSPA:
    23                                 netInfo.InterfaceType = NetworkType.Mobile3G;
    24                                 break;
    25                             case NetworkInterfaceSubType.Cellular_LTE:
    26                             case NetworkInterfaceSubType.Cellular_EHRPD:
    27                                 netInfo.InterfaceType = NetworkType.Mobile4G;
    28                                 break;
    29                             default:
    30                                 netInfo.InterfaceType = NetworkType.None;
    31                                 break;
    32                         }
    33                         break;
    34                     case NetworkInterfaceType.Wireless80211:
    35                         netInfo.InterfaceType = NetworkType.Wifi;
    36                         break;
    37                     default:
    38                         netInfo.InterfaceType = NetworkType.None;
    39                         break;
    40                 }
    41             }
    42             return netInfo;
    43         }

      关于NetworkInterfaceInfo. NetworkInterfaceSubType的各种网络类型的说明给出以下表格:

    网络类型

    说明

    Unknown

    没有有关网络接口类型的其他信息。

    Cellular_GPRS

    使用通用分组无线业务 (General Packet Radio Service, GPRS) 蜂窝技术的网络接口。这是 2.5G 技术。

    Cellular_1XRTT

    使用无线传输技术 (Radio Transmission Technology, 1xRTT) 蜂窝技术的网络接口。这是 2.5G 技术。

    Cellular_EVDO

    Evolution Data Only (EV-DO) 蜂窝技术的网络接口。这是 3G 技术。

    Cellular_EDGE

    使用增强型数据速率 GSM 演进 (Enhanced Data   rates for GSM Evolution, EDGE) 蜂窝技术的网络接口。这是2.5G 技术。

    Cellular_3G

    使用第三代 (3G) 蜂窝技术的网络接口。

    Cellular_HSPA

    使用高速下行分组接入 (High-Speed Downlink Packet Access, HSPA) 蜂窝技术的网络接口。这是 3.5G 技术。

    Cellular_EVDV

    使用数据和语音演进 (Evolution Data and Voice, EV-DV) 蜂窝技术的网络接口。这是 3G 技术。

    Desktop_PassThru

    桌面 pass- through 网络接口。

    WiFi

    使用无线技术 (802.11) 的网络接口。

    Cellular_LTE

    使用长期进化 (Long Term Evolution,LTE) 蜂窝技术的网络接口。这是 4G 技术。

    Cellular_EHRPD

    使用增强型高速率数据包 (Enhanced High Rate Packet Data,EHRPD) 蜂窝技术的网络接口。这是 4G 技术。

      下面给出通过回调的方式获取网络类型信息的实现方式。

     1         public static NetworkInfo NetInfo = null;
     2         public static void getNetworkType()
     3         {
     4             DeviceNetworkInformation.ResolveHostNameAsync(
     5             new DnsEndPoint("www.microsoft.com", 80),
     6             new NameResolutionCallback(handle =>
     7             {
     8                 NetworkInterfaceInfo info = handle.NetworkInterface;
     9                 NetInfo = parseNetworkInfo(info);
    10             }), null);
    11         }

      下面给出如何将基于异步回调的方式转换为同步方式来获取网络类型信息,此种转换方式不仅仅只用于此处,对于所有的基于异步回调的处理都可以安装此种处理来转换成同步获取。实例代码如下:

     1         public static async Task<NetworkInfo> getNetworkTypeAsync()
     2         {
     3             NetworkInfo result = await Task.Factory.StartNew<NetworkInfo>(() =>
     4             {
     5                 NetworkInfo netInfo = null;
     6                 EventWaitHandle Wait = new AutoResetEvent(false);
     7                 DeviceNetworkInformation.ResolveHostNameAsync(
     8                 new DnsEndPoint("www.microsoft.com", 80),
     9                 new NameResolutionCallback(handle =>
    10                 {
    11                     NetworkInterfaceInfo info = handle.NetworkInterface;
    12                     netInfo = parseNetworkInfo(info);
    13                     Wait.Set();
    14 
    15                 }), null);
    16                 Wait.WaitOne();
    17                 return netInfo;
    18             });
    19             return result;
    20         }
  • 相关阅读:
    Intellij IDEA中Maven解决依赖失效
    Spring Boot 推荐的基础 POM 文件
    Spring Boot启动流程详解(一)
    spring boot应用启动原理分析
    Spring Boot 配置文件详解:Properties和YAML
    Spring Boot 属性配置和使用
    Arcgis for js载入天地图
    Android菜鸟的成长笔记(28)——Google官方对Andoird 2.x提供的ActionBar支持
    Android仿IOS回弹效果 ScrollView回弹 总结
    Android开发有用的站点
  • 原文地址:https://www.cnblogs.com/huizhang212/p/GetNetworkTypeAsync.html
Copyright © 2011-2022 走看看