目前有一些产品还是基于X86内核的系统进行开发一些工业设备的控制或者数据采集的产品,这些工控机也基本是集成了各种串口,网口,Wifi等比较方便的外部通信方式,然而一些产品生产厂家,为了放置程序被逆向与复制拷贝使用所以操作系统的密码是不会给用户的,所以为了用户拿产品后能方便的使用设置进行数据采集与设备控制这个时间就需要提供一个友好的界面让用户来设置这些参数,比如设置设置串口的波特率,网口的IP地址,DNS,网关等。目前在生中无论成本,还是便利性普遍Wifi使用的还是比较多(当然除了高度机密的行业,是不允许使用WIFI,例如军工行业)。下面看看使用C#操作X86的Wifi吧,目前Win7+ 系统兼容的比较好,Xp不支持。
Wifi连接使用的是Managedwifi 这个类库可以Nuget也可以从下面网址进行下载再引用,推荐使用Nuget
官网下载地址是:https://archive.codeplex.com/?p=managedwifi
开源的GitHub地址是:https://github.com/Robotxm/NativeWifi
需要添加引用
using NativeWifi;
使用内部方法获取无线设备搜索到的Wifi信号方法如下:
/// <summary>
/// 枚举所有无线设备搜索到的Wifi信号
/// WifiReponse 为自己义一个Wifi信号的Model
/// </summary>
public List<WifiReponse> ScanSSID()
{
List<WifiReponse> ssids = new List<WifiReponse>();
WlanClient client = new WlanClient();
foreach (WlanClient.WlanInterface wlanIface in client.Interfaces)
{
Wlan.WlanAvailableNetwork[] networks = wlanIface.GetAvailableNetworkList(0);
foreach (Wlan.WlanAvailableNetwork network in networks)
{
WifiReponse wifi= new WifiReponse();
wifi.wlanSignalQuality = (int)network.wlanSignalQuality;
wifi.ssid = GetStringForSSID(network.dot11Ssid);
wifi.dot1DefaultAuthalgorithm = network.dot11DefaultCipherAlgorithm.ToString();
wifi.flags = network.flags;
ssids.Add(wifi);
}
}
return ssids;
}
Wifi有两种连接方式,一种是无加密的Wifi 一个是加密的Wifi
连接无密码的Wifi连接使用下面的代码:
/// <summary>
/// 连接到未加密的SSID
/// </summary>
/// <param name="ssid"></param>
public void ConnectToSSID(WIFISSID ssid)
{
string profileName = ssid.SSID;
string mac = StringToHex(profileName);
string myProfileXML = string.Format("<?xml version=\"1.0\"?><WLANProfile xmlns=\"http://www.microsoft.com/networking/WLAN/profile/v1\"><name>{0}</name><SSIDConfig><SSID><hex>{1}</hex><name>{0}</name></SSID></SSIDConfig><connectionType>ESS</connectionType><connectionMode>manual</connectionMode><MSM><security><authEncryption><authentication>open</authentication><encryption>none</encryption><useOneX>false</useOneX></authEncryption></security></MSM></WLANProfile>", profileName, mac);
ssid.wlanInterface.SetProfile(Wlan.WlanProfileFlags.AllUser, myProfileXML, true);
ssid.wlanInterface.Connect(Wlan.WlanConnectionMode.Profile, Wlan.Dot11BssType.Any, profileName);
}
连接到加密的Wifi网络,方法是大体差不多只要注意xml文件的不同就可以了,下面粘贴上代码,大家一眼就可以看出来有什么区别了,值得的注意的是目前Wifi全的加密方式都是<encryption>AES</encryption> ,有的也有这一种<encryption>TKIP</encryption>
/// <summary>
/// 连接到加密的SSID
/// </summary>
/// <param name="ssid"></param>
public void ConnectToSSID(WIFISSID ssid, string key)
{
string profileName = ssid.SSID; // this is also the SSID
string xml = "<?xml version=\"1.0\" ?>";
xml += "<WLANProfile xmlns=\"http://www.microsoft.com/networking/WLAN/profile/v1\">";
xml += " <name>" + profileName + "</name> ";
xml += " <SSIDConfig>";
xml += " <SSID>";
xml += " <name>" + profileName + "</name> ";
xml += " </SSID>";
xml += " </SSIDConfig>";
xml += " <connectionType>ESS</connectionType> ";
xml += " <connectionMode>auto</connectionMode> ";
xml += " <MSM>";
xml += " <security>";
xml += " <authEncryption>";
xml += " <authentication>WPAPSK</authentication> ";
xml += " <encryption>AES</encryption> ";
xml += " <useOneX>false</useOneX> ";
xml += " </authEncryption>";
xml += " <sharedKey>";
xml += " <keyType>passPhrase</keyType> ";
xml += " <protected>false</protected> ";
xml += " <keyMaterial>" + key + "</keyMaterial> ";
xml += " </sharedKey>";
xml += " </security>";
xml += " </MSM>";
xml += " </WLANProfile>";
string myProfileXML = xml;
ssid.wlanInterface.SetProfile(Wlan.WlanProfileFlags.AllUser, myProfileXML, true);
ssid.wlanInterface.Connect(Wlan.WlanConnectionMode.Profile, Wlan.Dot11BssType.Any, profileName);
}