using System;
|
using System.Collections.Generic;
|
using System.Security.Cryptography;
|
using System.Text;
|
|
namespace Shared.Phone.UserCenter
|
{
|
/// <summary>
|
/// WiFi的逻辑
|
/// </summary>
|
public class HdlWifiLogic
|
{
|
#region ■ 变量声明___________________________
|
|
/// <summary>
|
/// WiFi的逻辑
|
/// </summary>
|
private static HdlWifiLogic m_Current = null;
|
/// <summary>
|
/// WiFi的逻辑
|
/// </summary>
|
public static HdlWifiLogic Current
|
{
|
get
|
{
|
if (m_Current == null)
|
{
|
m_Current = new HdlWifiLogic();
|
}
|
return m_Current;
|
}
|
}
|
|
/// <summary>
|
/// 当前是否是网关热点
|
/// </summary>
|
public bool IsGatewayHotspot
|
{
|
get
|
{
|
string myId = this.SSID;
|
|
if (myId != null && myId.StartsWith("hdlZigbeeGW") == true)
|
{
|
return true;
|
}
|
return false;
|
}
|
}
|
|
/// <summary>
|
/// 当前是否是Mini网关热点
|
/// </summary>
|
public bool IsMiniGatewayHotspot
|
{
|
get
|
{
|
string myId = this.SSID;
|
|
if (myId != null && myId.StartsWith("hdlZigbeeGW-") == true)
|
{
|
return true;
|
}
|
return false;
|
}
|
}
|
|
/// <summary>
|
/// 当前wifi的SSID,也叫Wifi的名字(取不到时,会返回null)
|
/// </summary>
|
public string SSID
|
{
|
get
|
{
|
#if iOS
|
string ssiD = Shared.WiimuUPnP.SSID;
|
if (string.IsNullOrEmpty(ssiD) == false && ssiD.StartsWith("\"") && ssiD.EndsWith("\""))
|
{
|
ssiD = ssiD.Substring(1, ssiD.Length - 2);
|
}
|
return ssiD;
|
#endif
|
#if Android
|
string ssiD = null;
|
HdlThreadLogic.Current.RunThread(() =>
|
{
|
Shared.Net.NetWiFi.GetWIFISSID((strId) =>
|
{
|
ssiD = strId;
|
});
|
});
|
int count = 0;
|
while (ssiD == null)
|
{
|
System.Threading.Thread.Sleep(50);
|
count++;
|
if (count == 20)
|
{
|
//1秒超时
|
return null;
|
}
|
}
|
if (string.IsNullOrEmpty(ssiD) == false && ssiD.StartsWith("\"") && ssiD.EndsWith("\""))
|
{
|
ssiD = ssiD.Substring(1, ssiD.Length - 2);
|
}
|
return ssiD;
|
#endif
|
}
|
}
|
#if Android
|
/// <summary>
|
/// 定义全局变量
|
/// </summary>
|
private Com.Mediatek.Elian.ElianNative hdlWiFi = null;
|
#endif
|
/// <summary>
|
/// TCP协议
|
/// </summary>
|
private System.Net.Sockets.TcpClient tcpClient = null;
|
/// <summary>
|
/// 链接流对象
|
/// </summary>
|
private System.Net.Sockets.NetworkStream networkStream = null;
|
/// <summary>
|
/// Ap模式网关返回的秘钥
|
/// </summary>
|
private string randDesKey = null;
|
/// <summary>
|
/// 是否已经添加网络变化监听
|
/// </summary>
|
private bool hadAddListenNetWork = false;
|
|
/// <summary>
|
/// 能否访问http
|
/// </summary>
|
private bool m_CanAccessHttp = true;
|
/// <summary>
|
/// 上一次访问http的时间
|
/// </summary>
|
private DateTime oldAccessHttpTime = DateTime.Now;
|
/// <summary>
|
/// 能否访问http
|
/// </summary>
|
public bool CanAccessHttp
|
{
|
set
|
{
|
m_CanAccessHttp = value;
|
oldAccessHttpTime = DateTime.Now;
|
}
|
get
|
{
|
//10秒后允许再次访问
|
if (m_CanAccessHttp == true || (DateTime.Now - oldAccessHttpTime).TotalMilliseconds > 10 * 1000)
|
{
|
oldAccessHttpTime = DateTime.Now;
|
return true;
|
}
|
return false;
|
}
|
}
|
|
#endregion
|
|
#region ■ Ap模式的TCP链接____________________
|
|
/// <summary>
|
/// 打开Ap模式的TCP链接(有错误时,直接返回错误消息。没有错误时,返回null)
|
/// </summary>
|
/// <returns></returns>
|
public string StartApTcpConnection()
|
{
|
try
|
{
|
//TCP连接
|
tcpClient = new System.Net.Sockets.TcpClient();
|
tcpClient.Connect("192.168.8.1", 5000);
|
networkStream = tcpClient.GetStream();
|
//加密数据
|
string sendDataMsg = "hdl1985.";
|
string DefaultdesKey = "hdl1985.";
|
//44bytes 加密数据 DES加密 base64密文
|
var sendData = Encoding.UTF8.GetBytes(DesEncrypt(sendDataMsg, DefaultdesKey));
|
//将数据写入网络流
|
networkStream.Write(sendData, 0, sendData.Length);
|
|
System.Threading.Thread.Sleep(500);
|
//2.接收状态,长度<1024字节
|
byte[] bytes = new Byte[1024];
|
int length = networkStream.Read(bytes, 0, bytes.Length);
|
if (length == 0)
|
{
|
//通信链接失败
|
return Language.StringByID(R.MyInternationalizationString.uCommunicationLinkFail);
|
}
|
string data = Encoding.UTF8.GetString(bytes, 0, length);
|
//网关返回的秘钥
|
this.randDesKey = DESDecrypt(data, DefaultdesKey);
|
|
return null;
|
}
|
catch (Exception ex)
|
{
|
HdlLogLogic.Current.WriteLog(ex);
|
this.CloseApTcpConnection();
|
//通信链接失败
|
return Language.StringByID(R.MyInternationalizationString.uCommunicationLinkFail);
|
}
|
}
|
|
/// <summary>
|
/// Ap模式 发送密码到家庭的路由器
|
/// </summary>
|
/// <param name="ssid"></param>
|
/// <param name="password"></param>
|
/// <returns></returns>
|
public bool SendApHomeWifiPassword(string ssid, string password)
|
{
|
try
|
{
|
//加密数据
|
string data2 = "ssid:" + ssid + "," + "pwd:" + password;
|
var sendData2 = Encoding.UTF8.GetBytes(DesEncrypt(data2, randDesKey));
|
//将数据写入网络流
|
networkStream.Write(sendData2, 0, sendData2.Length);
|
return true;
|
}
|
catch (Exception ex)
|
{
|
HdlLogLogic.Current.WriteLog(ex);
|
return false;
|
}
|
}
|
|
/// <summary>
|
/// 关闭Ap模式的tcp链接
|
/// </summary>
|
public void CloseApTcpConnection()
|
{
|
try
|
{
|
//关闭客户端
|
tcpClient?.Close();
|
tcpClient = null;
|
networkStream = null;
|
randDesKey = null;
|
}
|
catch (Exception ex)
|
{
|
HdlLogLogic.Current.WriteLog(ex);
|
}
|
}
|
|
#endregion
|
|
#region ■ 加密解密___________________________
|
|
/// <summary>
|
/// //加密数据
|
/// </summary>
|
/// <param name="pToDesEncrypt"></param>
|
/// <param name="sKey">DES秘钥</param>
|
/// <returns></returns>
|
private string DesEncrypt(string pToDesEncrypt, string sKey)
|
{
|
// 创建des加密没
|
using (DESCryptoServiceProvider des = new DESCryptoServiceProvider())
|
{
|
// 得到UTF-8的数据源
|
byte[] inputByteArray = Encoding.UTF8.GetBytes(pToDesEncrypt);
|
// 设置key和iv密钥
|
des.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
|
des.IV = ASCIIEncoding.ASCII.GetBytes(sKey);
|
//由于java是使用默认加密模式,C#默认是CBC,需要修改为ECB
|
des.Mode = CipherMode.CBC;
|
des.Padding = PaddingMode.PKCS7;
|
// 创建数据流并进行加密
|
var ms = new System.IO.MemoryStream();
|
using (CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write))
|
{
|
cs.Write(inputByteArray, 0, inputByteArray.Length);
|
cs.FlushFinalBlock();
|
cs.Close();
|
}
|
// 关闭数据流
|
ms.Close();
|
return Convert.ToBase64String(ms.ToArray());//base64密文
|
}
|
}
|
|
/// <summary>
|
/// 解密
|
/// </summary>
|
/// <param name="pToDecrypt"></param>
|
/// <param name="key">解密密匙</param>
|
/// <returns></returns>
|
private string DESDecrypt(string pToDecrypt, string key = null)
|
{
|
byte[] inputByteArray = Convert.FromBase64String(pToDecrypt);
|
using (DESCryptoServiceProvider des = new DESCryptoServiceProvider())
|
{
|
|
des.Key = ASCIIEncoding.ASCII.GetBytes(key);
|
des.IV = ASCIIEncoding.ASCII.GetBytes(key);
|
|
var ms = new System.IO.MemoryStream();
|
using (CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write))
|
{
|
cs.Write(inputByteArray, 0, inputByteArray.Length);
|
cs.FlushFinalBlock();
|
cs.Close();
|
}
|
string str = Encoding.UTF8.GetString(ms.ToArray());
|
ms.Close();
|
return str;
|
}
|
}
|
|
#endregion
|
|
#region ■ 监听网络变化_______________________
|
|
/// <summary>
|
/// 开启监听网络
|
/// </summary>
|
public void StartListenNetWork()
|
{
|
if (hadAddListenNetWork == true)
|
{
|
return;
|
}
|
hadAddListenNetWork = true;
|
|
#if Android
|
//开启监听安卓网络变化
|
BaseActivity.NetworkStateChanged += (value) =>
|
{
|
//网络变化
|
this.NetworkStateChanged(value);
|
};
|
#endif
|
|
#if iOS
|
//开启监听IOS网络变化
|
GateWay.Ios.Reachability.ReachabilityChanged += (sender, e) =>
|
{
|
var internetStatus = GateWay.Ios.Reachability.InternetConnectionStatus();
|
if (internetStatus == GateWay.Ios.NetworkStatus.NotReachable)//没有网络连接 0
|
{
|
//网络变化
|
this.NetworkStateChanged(0);
|
}
|
else if (internetStatus == GateWay.Ios.NetworkStatus.ReachableViaCarrierDataNetwork)//3,4G的网络连接 1
|
{
|
//网络变化
|
this.NetworkStateChanged(1);
|
}
|
else if (internetStatus == GateWay.Ios.NetworkStatus.ReachableViaWiFiNetwork) //wifi的网络连接 2
|
{
|
//网络变化
|
this.NetworkStateChanged(2);
|
}
|
};
|
#endif
|
}
|
|
/// <summary>
|
/// 监听安卓网络变化
|
/// </summary>
|
/// <param name="value"></param>
|
private void NetworkStateChanged(int value)
|
{
|
//没有网络
|
if (value == 0)
|
{
|
this.CanAccessHttp = false;
|
}
|
//可以叫4G
|
else if (value == 1)
|
{
|
this.CanAccessHttp = true;
|
}
|
//WIFI
|
else if (value == 2)
|
{
|
this.CanAccessHttp = true;
|
}
|
}
|
|
#endregion
|
|
#region ■ 一般方法___________________________
|
|
#if Android
|
/// <summary>
|
/// 开始Wi-Fi配网
|
/// </summary>
|
/// <param name="wifiName">wifi名字</param>
|
/// <param name="wifiPsw">wifi密码</param>
|
/// <param name="p2">我也不知道这个是什么东西</param>
|
/// <returns></returns>
|
public bool StartSmartConnection(string wifiName, string wifiPsw, string p2 = "")
|
{
|
if (hdlWiFi == null)
|
{
|
var result2 = Com.Mediatek.Elian.ElianNative.LoadLib();
|
//初始化Wi-Fi配网
|
this.hdlWiFi = new Com.Mediatek.Elian.ElianNative();
|
var value = hdlWiFi.InitSmartConnection(null, 1, 1);
|
}
|
//开始Wi-Fi配网
|
var result = hdlWiFi.StartSmartConnection(wifiName, wifiPsw, p2);
|
return true;
|
}
|
|
/// <summary>
|
/// 停止Wi-Fi配网
|
/// </summary>
|
public void StopSmartConnection()
|
{
|
if (hdlWiFi != null)
|
{
|
//停止Wi-Fi配网
|
var result = hdlWiFi.StopSmartConnection();
|
hdlWiFi = null;
|
}
|
}
|
#endif
|
#if iOS
|
/// <summary>
|
/// 开始Wi-Fi配网
|
/// </summary>
|
/// <param name="wifiName">wifi名字</param>
|
/// <param name="wifiPsw">wifi密码</param>
|
/// <param name="p2">我也不知道这个是什么东西</param>
|
/// <returns></returns>
|
public bool StartSmartConnection(string wifiName, string wifiPsw, string p2 = "")
|
{
|
//初始化Wi-Fi连接
|
Com.Mediatek.Elian.ElianNative.InitSmartConnection("1", 1, 1);
|
//开始Wi-Fi连接
|
var result = Com.Mediatek.Elian.ElianNative.StartSmartConnection(wifiName, wifiPsw, p2);
|
return true;
|
}
|
|
/// <summary>
|
/// 停止Wi-Fi配网
|
/// </summary>
|
public void StopSmartConnection()
|
{
|
//停止Wi-Fi配网
|
Com.Mediatek.Elian.ElianNative.StopSmartConnection();
|
}
|
#endif
|
|
/// <summary>
|
/// 打开手机wifi设置界面
|
/// </summary>
|
public void OpenAppWifiSettion()
|
{
|
if (Application.DeviceType == Shared.Device.Android)
|
{
|
///打开WI-IF界面
|
CommonClass.OpenAction("android.settings.WIFI_SETTINGS");
|
}
|
else
|
{
|
CommonClass.OpenAction("App-Prefs:root=WIFI");
|
}
|
}
|
|
#endregion
|
}
|
}
|