using System;
using System.Collections.Generic;
using System.Security.Cryptography;
using System.Text;
namespace Shared.Phone.UserCenter
{
///
/// WiFi的逻辑
///
public class HdlWifiLogic
{
#region ■ 变量声明___________________________
///
/// WiFi的逻辑
///
private static HdlWifiLogic m_Current = null;
///
/// WiFi的逻辑
///
public static HdlWifiLogic Current
{
get
{
if (m_Current == null)
{
m_Current = new HdlWifiLogic();
}
return m_Current;
}
}
///
/// 当前是否是网关热点
///
public bool IsGatewayHotspot
{
get
{
string myId = this.SSID;
if (myId != null && myId.StartsWith("hdlZigbeeGW") == true)
{
return true;
}
return false;
}
}
///
/// 当前是否是Mini网关热点
///
public bool IsMiniGatewayHotspot
{
get
{
string myId = this.SSID;
if (myId != null && myId.StartsWith("hdlZigbeeGW-") == true)
{
return true;
}
return false;
}
}
///
/// 当前wifi的SSID,也叫Wifi的名字(取不到时,会返回null)
///
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
///
/// 定义全局变量
///
private Com.Mediatek.Elian.ElianNative hdlWiFi = null;
#endif
///
/// TCP协议
///
private System.Net.Sockets.TcpClient tcpClient = null;
///
/// 链接流对象
///
private System.Net.Sockets.NetworkStream networkStream = null;
///
/// Ap模式网关返回的秘钥
///
private string randDesKey = null;
///
/// 是否已经添加网络变化监听
///
private bool hadAddListenNetWork = false;
///
/// 能否访问http
///
private bool m_CanAccessHttp = true;
///
/// 上一次访问http的时间
///
private DateTime oldAccessHttpTime = DateTime.Now;
///
/// 能否访问http
///
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链接____________________
///
/// 打开Ap模式的TCP链接(有错误时,直接返回错误消息。没有错误时,返回null)
///
///
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);
}
}
///
/// Ap模式 发送密码到家庭的路由器
///
///
///
///
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;
}
}
///
/// 关闭Ap模式的tcp链接
///
public void CloseApTcpConnection()
{
try
{
//关闭客户端
tcpClient?.Close();
tcpClient = null;
networkStream = null;
randDesKey = null;
}
catch (Exception ex)
{
HdlLogLogic.Current.WriteLog(ex);
}
}
#endregion
#region ■ 加密解密___________________________
///
/// //加密数据
///
///
/// DES秘钥
///
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密文
}
}
///
/// 解密
///
///
/// 解密密匙
///
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 ■ 监听网络变化_______________________
///
/// 开启监听网络
///
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
}
///
/// 监听安卓网络变化
///
///
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
///
/// 开始Wi-Fi配网
///
/// wifi名字
/// wifi密码
/// 我也不知道这个是什么东西
///
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;
}
///
/// 停止Wi-Fi配网
///
public void StopSmartConnection()
{
if (hdlWiFi != null)
{
//停止Wi-Fi配网
var result = hdlWiFi.StopSmartConnection();
hdlWiFi = null;
}
}
#endif
#if iOS
///
/// 开始Wi-Fi配网
///
/// wifi名字
/// wifi密码
/// 我也不知道这个是什么东西
///
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;
}
///
/// 停止Wi-Fi配网
///
public void StopSmartConnection()
{
//停止Wi-Fi配网
Com.Mediatek.Elian.ElianNative.StopSmartConnection();
}
#endif
///
/// 打开手机wifi设置界面
///
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
}
}