英特尔® 移动平台软件开发套件 1.2:网络检测

提交新文章

最终修改于 :   2008年01月25日 17:16
评级
 



摘要

此文主要带您了解如何使用开源英特尔® 移动平台软件开发套件 1.2 提取网络设备信息。此外,还包含了适用于 Microsoft Windows XP* 平台的 C# 示例代码。


简介

应用确定可用网络状态的能力,是资源有限的移动应用领域中一项的重要因素,因为无线连接无法保证一直可用(甚至对于有线网络连接也亦然)。应用需要能够确定网络设备当前状态,而且需要对于网络设备的连接或断开连接的状态事件采取适当的措施。例如:某个移动平台超出了接入点设备(AP)范围,或者信号受阻。

英特尔® 移动平台软件开发套件  1.2 开放源代码(英特尔® 移动平台 SDK)为开发人员提供了一种通用的框架,它不仅可检索网络设备属性,而且还能监控适用的当前网络设备状态。此外,它还能够利用 API 来访问电源、磁盘及其它移动环境下的重要系统信息,但是本文中我们仅讨论网络连接方面的问题。

本文主要介绍了如何使用英特尔® 移动平台软件开发套件来获取网络设备信息。此外,还包含了适用于 Microsoft Windows XP* 平台的 C# 示例代码。


关于英特尔® 移动平台软件开发套件

首先,先让我们简要浏览一下英特尔® 移动平台软件开发套件的架构与设计。

  1. 多架构——支持 32 位英特尔® 架构、英特尔® 迅驰® 处理器技术(英特尔® CMT)等。
  2. 多操作系统——支持 Microsoft Windows Vista Business/Ultimate Edition、Microsoft Windows * XP SP2、Microsoft Windows Tablet PC Edition 2005、Microsoft Windows Mobile* 2003 Pocket PC Edition、Microsoft Windows Mobile* 2003 Smartphone Edition、Microsoft Windows Mobile* 5.0 Pocket PC Edition、Microsoft Windows Mobile* 5.0 Smartphone Edition。
  3. 多语言——支持多种语言访问,如 C/C++、Java*、Net*(C#、Visual Basic*)及通用语言运行(Common Language Runtime CLR)语言。
  4. 多运行时——支持 C 运行时、NET、CLR 以及以下 Java 运行时环境:Java 2 Micro Edition(J2ME)*、Java 2 Standard Edition*(J2SE)和 Java 2 Enterprise Edition*(J2EE)。
  5. 多语法——支持对象导向型及程序调用导向型语法。

现在让我们来看一看将在本文中构建的网络工具。


网络状态工具描述

本文讨论了如何利用英特尔® 移动平台软件开发套件来检索系统中所有网络设备的当前信息,以及如何跟踪运行时的所有网络状态。

目标平台为运行 Windows XP Professional 操作系统的英特尔® 迅驰® 处理器技术(CMT)笔记本电脑。示例代码采用 C# 语言开发。

图 1:未连接网络的用户界面

图 1 显示了本文将要构建的样本工具用户界面(UI)。其中的标签显示了相关的网卡与链路协议信息。“事件(Events)”标签可跟踪运行时网络连接/断开状态的改变。所有标签的事件详情将在出现网络事件时自动更新。

如图 1 所示,两块网卡(WiredAdapter 和 RadioAdapter)都处于 MediaDisconected 状态。当活动网线连接到系统后,“mediaConnect”事件将被触发并记录在“Events”标签中。

图 2:运行时网线连接的事件记录

如图 2 和图 3 所示,网络“连接”状态自动改变。其中图 2 显示了添加到“Event”标签中的事件详情。

图 3:“mediaConnect”事件发生后更新的用户界面

现在让我们来看一看应用是如何实施的。


实施应用

英特尔® 移动平台软件开发工具包提供了多种属性与 API 来检索系统设备信息。为了访问所需的连接信息,请根据以下示例创建NetworkAdapter(网卡)和LinkProtocol(链路协议)集例程:

点击这里  下载源代码样本。

网卡与链路协议集如下:

NetworkAdapterClass myClassNet = new NetworkAdapterClass();

LinkProtocolClass myClassLink = new LinkProtocolClass();

myCollectionNet = (NetworkAdapterCollection)myClassNet.GetInstances();

myCollectionLink = (LinkProtocolCollection)myClassLink.GetInstances();

一旦完成对象初始化,即可对所有网卡与链路协议属性进行检索。

网卡

NetworkAdapter 集可支持对基本结构相关信息进行访问,以便组织系统内的网卡相关信息。

while(myCollectionNet.HasNext())

{

              myInstance = (NetworkAdapterInstance)myCollectionNet.Next();

              if (!myInstance.Name.IsNull())

              {

                            val = myInstance.Name.GetValue();

                            str = "Name:                                          "+val;

                            listBox1.Items.Add(str);

              }

              if (!myInstance. ConnectionState.IsNull())

              {

                            var = myInstance. ConnectionState.GetValue();

                            val = var.ToString();

                            str = "NetConnectionStatus:              " + val;

                            listBox1.Items.Add(str);

              }

              …………………

}

链路协议

LinkProtocol 集可用于访问构建于网卡设备上的活动协议的属性。

while(myCollectionLink.HasNext())

{

              myInstance = (LinkProtocolInstance)myCollectionLink.Next();

              if (!myInstance.Id.IsNull())

              {

                            val = myInstance.Id.GetValue();

                            str = "ID:                            " + val;

                            listBox3.Items.Add(str);

              }

              if (!myInstance.IpAddress.IsNull())

              {

                            val = myInstance.IpAddress.GetValue();

                            str = "IP:                            " + val;

                            listBox3.Items.Add(str);

              }

              …………………

}

这样检索的属性值就将添加到用户界面列表框,并以合适的标签表示。

如欲了解有关网卡、链路协议属性以及 API 的更多信息,请参考程序员手册中的“网络设备”部分。该手册随英特尔® 移动平台软件开发套件一同分发。

事件通知

在本示例中,MyConnectionState 集(来自观察者(Observer))主要用于监听运行时所发生的LinkProtocol mediaConnect 与 mediaDisconnect 事件。以下为设置观察者的方法。

internal class MyConnectionState : Observer

{

  public override void Notify(Event evnt)

  {

              try

              {

                            if (evnt.GetType() == Event.EventType.eMediaConnected)

                            {

                                          //Record Connect event in the list box.             

                            }

                            if (evnt.GetType()==Event.EventType.eMediaDisconnected)

                            {

                                          //Record Disconnect event in the list box.

                            }

              }

              catch (IntelMobileException ex)

              {

                            //Handle Exception.                                         

              }

}

在主集构造器中,每个 LinkProtocol 对象事件都将添加有一个事件观察者。以下就为您显示了如何为媒体连接与断开事件添加观察程序:

LinkProtocolInstance[] LnkInstance = new LinkProtocolInstance[10];

MyConnectionState myConnection = new MyConnectionState();

//Populate LinkInstance with appropriate values when retrieving

//property values for each Link Protocol object.

 

for (int i = 1; i > count; i++)

{

              LnkInstance[i].MediaConnected.AddObserver(myConnection);

              LnkInstance[i].MediaDisconnected.AddObserver(myConnection);

}

通过执行上述步骤,便可将观察程序添加到特定事件(在本示例中为“mediaConnected”和“mediaDisconnected”)中。一旦发生这些事件,系统便将调用“MyConnectionState”集中实施的“Notify()”方法,并根据具体事件采取合适的操作。

在终止应用之前,请您务必移除观察程序,这是非常重要的一点。否则,即使您已经关闭了应用,可能仍会存在一些进行中的参考。以下代码片段为您列举了移除观察程序的方法:

for (int i = 1; i > count; i++)

{

              LnkInstance[i].MediaConnected.RemoveObserver(myConnection);

              LnkInstance[i].MediaDisconnected.RemoveObserver(myConnection);

}


下载样本代码

点击这里  下载源代码样本。其中包括 NetworkInfo.cs、NetworkInfo.resx 以及 readme.txt 文件。


总结

本文主要讨论了如何利用英特尔® 移动平台软件开发套件来检索网络信息,以及如何在不依靠持续检测设备的情况下,准确接收运行时的网络状态更新。此外,利用同样的方法,该软件开发套件还可检索电源和带宽信息。我们希望您能在本文的帮助下,借助英特尔® 移动平台软件开发套件赋予您的软件更多全新特性,从而在移动环境中发挥更加出色的优势。


更多参考
如欲了解有关英特尔® 移动平台 SDK 1.2 的更多信息,请访问我们的项目网站。