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 } }