博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
『参考』OpenNETCF的动手实验——WIFI
阅读量:6709 次
发布时间:2019-06-25

本文共 4089 字,大约阅读时间需要 13 分钟。

最近,闲啊,看首页文章都看烦了(不是骂就是被骂,唉~~~),索性来鼓捣一下OpenNETCF这个玩意儿,这篇文章就从WIFI的控制开始说起吧。

首先,你可能会上网搜“.net cf msdn wifi"这个关键词,不管如何吧,肯定会看到MSDN的一篇介绍用OpenNETCF进行WIFI开发的一篇文章,我也看过,说的的确不错,但是就是感觉怪怪的。

首先,那篇文章中使用的方法比较“老”,因为IDE总提示我有些类库太旧了,建议用新的替换掉。

其次,我只想获取本机的WIFI适配器而不需要像那篇文章获取了所有适配器。

所以,我亲自动手,和大家一起分享一下使用OpenNETCF来操作设备Wifi的经验吧。

在这篇文章中,你将学会使用OpenNETCF类库进行如下操作:

1、获取Wifi设备信息

2、控制Wifi设备的开启或关闭

3、搜索周围的接入点,并显示他们的信号强度及名称

好吧,下面,我们就来一步一步的开始动手实验:

1、首先,我们建立一个新的移动设备项目:SDF-Wifi,使用.netCF 2.0类库足够,然后平台嘛,我选择的是WM5 PPC。

2、引入OpenNETCF类库(添加引用——》OpenNETCF.Net、OpenNETCF.WindowsCE),至于这个类库大家可以到其官网下载: 下载社区版就行了。再在程序主窗体的头部添加引用:

using OpenNETCF.Net.NetworkInformation;

using System.Runtime.InteropServices;
using OpenNETCF.WindowsCE;

3、进行UI界面的设计,这里不再赘述,我完全仿照MSDN所描述的UI进行设计,这些内容将会在文章最后给出下载地址。

4、主要代码编写:

1)全局变量:

 

全局变量
 #region 全局变量
        
private WirelessZeroConfigNetworkInterface m_wzc = null;//全局的WZC变量
        /// <summary>
        
/// 这个Timer用于定时更新临近节点
        
/// </summary>
        private Timer m_wifiTimer = new Timer();
        
private const int CONFIG_TAB = 0;//定义了Tab的Index
        private const int WIFI_TAB = 1;
        
private AccessPointCollection m_preferredAPs;//首选节点集合
        private AccessPointCollection m_nearbyAPs;//临近节点集合
        private const int POWER_NAME = 0x00000001;//用于操作Wifi设备的电源命令
        #endregion

 

2)Dll引用

 

DLL引用
        #region DLL引用
        
/// <summary>
        
/// 设备电源管理,相信大家查阅MSDN后就不会陌生了
        
/// </summary>
        
/// <param name="pvDevice">设备在注册表中的键值</param>
        
/// <param name="dwDeviceFlags">Power_Name</param>
        
/// <param name="DeviceState">电源状态枚举,来自OpenNETCF.WindowsCE命名空间下的DevicePowerState</param>
        
/// <returns></returns>
        [DllImport("coredll.dll", SetLastError = true)]
        
private static extern int SetDevicePower(string pvDevice,int dwDeviceFlags,DevicePowerState DeviceState);
        
/// <summary>
        
/// 电源状态通知,用于更新顶部那个状态信息图标,参数同上
        
/// </summary>
        
/// <param name="device">设备在注册表中的键值</param>
        
/// <param name="state">电源状态枚举,来自OpenNETCF.WindowsCE命名空间下的DevicePowerState</param>
        
/// <param name="flags">Power_Name</param>
        
/// <returns></returns>
        [DllImport("coredll.dll")]
        
public static extern int DevicePowerNotify(string device, DevicePowerState state, int flags);
        
#endregion

 

这里给大家说明一下,“设备在注册表中的键值”为:{98C5250D-C29A-4985-AE5F-AFE5367E5006}\+设备名称,其中,键值不会变,至少我看过好多人,使用的键值都没有变,唯一变得是设备名称,这个设备名称是从何而来呢?大家先不急,待你看到代码,自然会明白,很简单的哦!呵呵

3) 其他代码:其他代码将放在下载中,供大家仔细查阅(有点多,放上来就是Code贴了)

5、核心功能代码:

1)获取适配器信息:

 

Code
        void FindWirelessAdapter()
        {
            cboAdapters.Items.Clear();
            
foreach (INetworkInterface ni in NetworkInterface.GetAllNetworkInterfaces())
            {
                
//通过下面的代码将不能在Wifi关闭状态下获取其设备名称,所以注释掉了
                
//if (ni is WirelessNetworkInterface)//ni.NetworkInterfaceType==NetworkInterfaceType.Wireless80211,我手机上的无线设备类型居然为:Ethernet?!不解!
                
//{
                
// will be true for wireless or WZC
                cboAdapters.Items.Add(ni);
                
if (ni is WirelessZeroConfigNetworkInterface)//如果符合WZC标准
                {
                    m_wzc 
= ni as WirelessZeroConfigNetworkInterface;
                }
                
//}
            }
        }

 

如果阅读过MSDN那篇“老文章”的朋友就能明显开出区别了,这里使用了INetworkInterface接口代替了Adapter类,用NetworkInterface.GetAllNetworkInterfaces()代替了AdapterCollection。而这个INetworkInterface是什么呢?你可以参照OpenNETCF的文档:

而这个类以及这个类对我们取得无线适配器、接入点的信息比较重要,所以,大家也要看看哦。

在取得了设备上的适配器后,我们就要来查看这些适配器的信息了,具体信息很多,都集中在了WirelessZeroConfigNetworkInterface类中,它的属性多到爆,你慢慢看吧,取出的属性就是我们将要的信息,具体请大家看代码。

2)开启/关闭Wifi功能:

 

开启Wifi
 try
            {
                
//先通知系统,更改Wifi状态图标,在设置Wifi电源状态
                DevicePowerNotify("{98C5250D-C29A-4985-AE5F-AFE5367E5006}\\" + ((NetworkInterface)cboAdapters.SelectedItem).Name, DevicePowerState.FullOn, POWER_NAME);
                SetDevicePower(
"{98C5250D-C29A-4985-AE5F-AFE5367E5006}\\" + ((NetworkInterface)cboAdapters.SelectedItem).Name, POWER_NAME, DevicePowerState.LowPower);
                Application.DoEvents();
                FindWirelessAdapter();
            }
            
catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }

 

这里看到了吧,是不是很简单,就传入无线设备的键值+设备名,电源状态以及电源命令,其他的由程序自动完成,具体的DevicePowerNotify函数可查阅这里:

SetDevicePower则可以查看这里:

关闭Wifi的代码雷同,只需修改状态参数。

好了,到此为止,这个动手实验就接近尾声了,下面是一些在我的机器上的实验截图:我手机是HTC Touch Viva

打开程序,进入主界面,从下拉菜单中选择搜索到的设备

由于我的Wifi模块暂未开启(用代码进行了InterfaceOperationalStatu的判断),弹出提示!

我们打开Wifi

 

可以看到正在打开:

最后,重新从下拉列表中选中刚才的无线适配器,获取到适配器现在的状态属性如下:

可以到Wifi选项卡查看更多信息:

我们关闭Wifi吧:挺费电滴(囧~)

至此,整个实验工程结束。你可以在:,下载到本实验的全部源码,其中已经包含了OpenNETCF引用的类库Dll文件,在项目的Bin\Debug文件夹下。

本实验的环境为:VS2008 TeamSuit,Windows Mobile 6.1,.net CF 2.0框架,在真机HTC T2222上测试通过。

下一次的文章,我将继续扩充这个程序的功能:

1、管理首选节点网络

2、连接到搜索到的临近节点

转载地址:http://zpalo.baihongyu.com/

你可能感兴趣的文章
猜拳游戏
查看>>
MySQL学习笔记(三)
查看>>
磁盘和文件系统管理
查看>>
Kafka connect介绍、部署及开发
查看>>
运维知识总结1
查看>>
rsync 简明教程
查看>>
使用KickStart进行CentOS7.4 的自动部署安装
查看>>
javas cript入门要了解的知识和书籍
查看>>
DDoS***进阶 混合***
查看>>
httpd: Could not reliably determine the server's fully
查看>>
php使用composer报zlib_decode():data error……
查看>>
\A \Z ^ $ 在Ruby Regular Expression 中的区别
查看>>
初级Java程序员和Java架构师的区别:内功心法修炼图
查看>>
DNS解析实验
查看>>
[备忘]国内的在线API阅读网站
查看>>
用户及组的介绍
查看>>
Apache压力测试
查看>>
详细解说STL hash_map系列
查看>>
云吞铺子:性能抖动剖析 2
查看>>
《PBI系列 车图 色彩搭配 数据分析 01》花随花心著
查看>>