HDL_ON/DAL/DriverLayer/AsyncUdpServer.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
HDL_ON/DAL/DriverLayer/Packet.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
HDL_ON/DAL/DriverLayer/UdpSocket.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
HDL_ON/DAL/Mqtt/MqttClient.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
HDL_ON/DAL/Server/HttpServerRequest.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
HDL_ON/Entity/Function/Function.cs | 补丁 | 查看 | 原始文档 | blame | 历史 | |
HDL_ON/HDL_ON.projitems | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
HDL_ON/UI/UI2/4-PersonalCenter/PersonalDataPage.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
HDL_ON/DAL/DriverLayer/AsyncUdpServer.cs
New file @@ -0,0 +1,453 @@ using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading.Tasks; namespace HDL_ON.DAL.DriverLayer { //class AsyncUdpServer /// <summary> /// UdpClient 实现异步UDP服务器 /// </summary> public class AsyncUdpServer { #region Fields /// <summary> /// 服务器程序允许的最大客户端连接数 /// </summary> private int _maxClient; /// <summary> /// 当前的连接的客户端数 /// </summary> //private int _clientCount; /// <summary> /// 服务器使用的异步UdpClient /// </summary> private UdpClient _server; /// <summary> /// 客户端会话列表 /// </summary> //private List<AsyncUDPState> _clients; private bool disposed = false; /// <summary> /// 数据接受缓冲区 /// </summary> private byte[] _recvBuffer; #endregion #region Properties /// <summary> /// 服务器是否正在运行 /// </summary> public bool IsRunning { get; private set; } /// <summary> /// 监听的IP地址 /// </summary> public IPAddress Address { get; private set; } /// <summary> /// 监听的端口 /// </summary> public int Port { get; private set; } /// <summary> /// 通信使用的编码 /// </summary> public Encoding Encoding { get; set; } #endregion #region 构造函数 /// <summary> /// 异步UdpClient UDP服务器 /// </summary> /// <param name="listenPort">监听的端口</param> public AsyncUdpServer(int listenPort) : this(IPAddress.Any, listenPort, 10240) { } /// <summary> /// 异步UdpClient UDP服务器 /// </summary> /// <param name="localEP">监听的终结点</param> public AsyncUdpServer(IPEndPoint localEP) : this(localEP.Address, localEP.Port, 10240) { } /// <summary> /// 异步UdpClient UDP服务器 /// </summary> /// <param name="localIPAddress">监听的IP地址</param> /// <param name="listenPort">监听的端口</param> /// <param name="maxClient">最大客户端数量</param> public AsyncUdpServer(IPAddress localIPAddress, int listenPort, int maxClient) { this.Address = localIPAddress; this.Port = listenPort; this.Encoding = Encoding.Default; _maxClient = maxClient; //_clients = new List<AsyncUDPSocketState>(); _server = new UdpClient(new IPEndPoint(this.Address, this.Port)); uint IOC_IN = 0x80000000; uint IOC_VENDOR = 0x18000000; uint SIO_UDP_CONNRESET = IOC_IN | IOC_VENDOR | 12; _server.Client.IOControl((int)SIO_UDP_CONNRESET, new byte[] { Convert.ToByte(false) }, null); _recvBuffer = new byte[_server.Client.ReceiveBufferSize]; } #endregion #region Method /// <summary> /// 启动服务器 /// </summary> /// <returns>异步TCP服务器</returns> public void Start() { try { if (!IsRunning) { IsRunning = true; _server.EnableBroadcast = true; _server.BeginReceive(ReceiveDataAsync, null); } } catch (Exception e) { } } /// <summary> /// 停止服务器 /// </summary> public void Stop() { try { //if (IsRunning) { IsRunning = false; _server.Close(); //TODO 关闭对所有客户端的连接 } } catch (Exception e) { } } /// <summary> /// 接收数据的方法 /// </summary> /// <param name="ar"></param> private void ReceiveDataAsync(IAsyncResult ar) { bool isReceive = false; try { var udpState = new AsyncUDPState(); IPEndPoint remote = null; udpState.buffer = _server.EndReceive(ar, ref remote); ; udpState.remote = remote; udpState.udpClient = _server; isReceive = true; receive(); //触发数据收到事件 RaiseDataReceived(udpState); } catch (Exception) { //TODO 处理异常 RaiseOtherException(null); } finally { if (!isReceive) { receive(); } } } void receive() { if (IsRunning && _server != null) { int count = 10; while (0 < count--) { try { _server.BeginReceive(ReceiveDataAsync, null); break; } catch (Exception e) { System.Threading.Thread.Sleep(100); } } } } /// <summary> /// 发送数据 /// </summary> /// <param name="msg"></param> /// <param name="remote"></param> public void Send(byte[] data, IPEndPoint remote) { try { RaisePrepareSend(null); _server.BeginSend(data, data.Length, remote, new AsyncCallback(SendCallback), null); } catch (Exception) { //TODO 异常处理 RaiseOtherException(null); } } private void SendCallback(IAsyncResult ar) { //if (ar.IsCompleted) { try { _server.EndSend(ar); //消息发送完毕事件 RaiseCompletedSend(null); } catch (Exception) { //TODO 数据发送失败事件 RaiseOtherException(null); } } } #endregion #region 事件 /// <summary> /// 接收到数据事件 /// </summary> public event EventHandler<AsyncUDPEventArgs> DataReceived; private void RaiseDataReceived(AsyncUDPState state) { if (DataReceived != null) { DataReceived(this, new AsyncUDPEventArgs(state)); } } /// <summary> /// 发送数据前的事件 /// </summary> public event EventHandler<AsyncUDPEventArgs> PrepareSend; /// <summary> /// 触发发送数据前的事件 /// </summary> /// <param name="state"></param> private void RaisePrepareSend(AsyncUDPState state) { if (PrepareSend != null) { PrepareSend(this, new AsyncUDPEventArgs(state)); } } /// <summary> /// 数据发送完毕事件 /// </summary> public event EventHandler<AsyncUDPEventArgs> CompletedSend; /// <summary> /// 触发数据发送完毕的事件 /// </summary> /// <param name="state"></param> private void RaiseCompletedSend(AsyncUDPState state) { if (CompletedSend != null) { CompletedSend(this, new AsyncUDPEventArgs(state)); } } /// <summary> /// 网络错误事件 /// </summary> public event EventHandler<AsyncUDPEventArgs> NetError; /// <summary> /// 触发网络错误事件 /// </summary> /// <param name="state"></param> private void RaiseNetError(AsyncUDPState state) { if (NetError != null) { NetError(this, new AsyncUDPEventArgs(state)); } } /// <summary> /// 异常事件 /// </summary> public event EventHandler<AsyncUDPEventArgs> OtherException; /// <summary> /// 触发异常事件 /// </summary> /// <param name="state"></param> private void RaiseOtherException(AsyncUDPState state, string descrip) { if (OtherException != null) { OtherException(this, new AsyncUDPEventArgs(descrip, state)); } } private void RaiseOtherException(AsyncUDPState state) { RaiseOtherException(state, ""); } #endregion #region Close /// <summary> /// 关闭一个与客户端之间的会话 /// </summary> /// <param name="state">需要关闭的客户端会话对象</param> public void Close(AsyncUDPState state) { if (state != null) { //_clients.Remove(state); //_clientCount--; //TODO 触发关闭事件 } } /// <summary> /// 关闭所有的客户端会话,与所有的客户端连接会断开 /// </summary> public void CloseAllClient() { //foreach (AsyncUDPSocketState client in _clients) //{ // Close(client); //} //_clientCount = 0; //_clients.Clear(); } #endregion #region 释放 /// <summary> /// Performs application-defined tasks associated with freeing, /// releasing, or resetting unmanaged resources. /// </summary> public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } /// <summary> /// Releases unmanaged and - optionally - managed resources /// </summary> /// <param name="disposing"><c>true</c> to release /// both managed and unmanaged resources; <c>false</c> /// to release only unmanaged resources.</param> protected virtual void Dispose(bool disposing) { if (!this.disposed) { if (disposing) { try { Stop(); if (_server != null) { _server = null; } } catch (SocketException) { //TODO RaiseOtherException(null); } } disposed = true; } } #endregion } } public class AsyncUDPState { // Client socket. public UdpClient udpClient = null; // Size of receive buffer. public const int BufferSize = 1024; // Receive buffer. public byte[] buffer = new byte[BufferSize]; // Received data string. public StringBuilder sb = new StringBuilder(); public IPEndPoint remote = new IPEndPoint(IPAddress.Any, 0); } /// <summary> /// UdpClient 异步UDP服务器事件参数类 /// </summary> public class AsyncUDPEventArgs : EventArgs { /// <summary> /// 提示信息 /// </summary> public string _msg; /// <summary> /// 客户端状态封装类 /// </summary> public AsyncUDPState _state; /// <summary> /// 是否已经处理过了 /// </summary> public bool IsHandled { get; set; } public AsyncUDPEventArgs(string msg) { this._msg = msg; IsHandled = false; } public AsyncUDPEventArgs(AsyncUDPState state) { this._state = state; IsHandled = false; } public AsyncUDPEventArgs(string msg, AsyncUDPState state) { this._msg = msg; this._state = state; IsHandled = false; } } HDL_ON/DAL/DriverLayer/Packet.cs
@@ -12,11 +12,11 @@ /// </summary> public class Packet { /// <summary> /// 缓冲区大小 /// Link协议现在一个包的数据比较大,缓冲区太小存不完全部数据 2023-07-14 16:03:56 wxr /// </summary> public const int Size = 1024 * 10; ///// <summary> ///// 缓冲区大小 ///// Link协议现在一个包的数据比较大,缓冲区太小存不完全部数据 2023-07-14 16:03:56 wxr ///// </summary> //public const int Size = 2000; /// <summary> /// 接收到的数据 @@ -28,11 +28,15 @@ /// </summary> public System.Net.EndPoint RemoteEndPoint; public Packet() public Packet(int lenght) { this.Bytes = new byte[Size]; this.Bytes = new byte[lenght]; RemoteEndPoint = new System.Net.IPEndPoint(System.Net.IPAddress.Any, 0); } public Packet(byte[] data, System.Net.EndPoint remoteEndPoint) { this.Bytes = data; HDL_ON/DAL/DriverLayer/UdpSocket.cs
@@ -1,4 +1,222 @@ using System; //using System; //using System.Net.Sockets; //using System.Net; //namespace HDL_ON.DriverLayer //{ // public class UdpSocket // { // static UdpSocket _busSocket; // public static UdpSocket _BusSocket // { // get // { // if(_busSocket == null) // { // _busSocket = new UdpSocket(); // } // return _busSocket; // } // } // //本地Socket // private Socket busSocket; // public int Port = 0; // /// <summary> // /// 启动Socket接收和发送功能 // /// </summary> // public void Start (int port = 0) // { // if (IsRunning) // { // if (port == Port) // { // return; // } // else // { // busSocket.Close(); // } // } // if (port != 0) // Port = port; // if (Port == 0) // return; // busSocket = new Socket (AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); // busSocket.EnableBroadcast = true; // try { // busSocket.Bind(new IPEndPoint(IPAddress.Any, Port)); // busSocket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, new MulticastOption(IPAddress.Parse("239.0.168.188"))); // relinkCount = 0; // } // catch (Exception ex){ // MainPage.Log ($"udp port bind error : {ex.Message}"); // busSocket = null; // return; // } // asyncBeginReceive(); // MainPage.Log ($"udp port : {port}"); // } // /// <summary> // /// 停止Socket // /// </summary> // public void Stop() // { // if(busSocket == null) // { // return; // } // if (!IsRunning) // { // return; // } // try // { // busSocket.Close(); // relinkCount = 0; // } // catch { } // busSocket = null; // MainPage.Log("Socket关闭"); // } // /// <summary> // /// 当前的Socket是否运行 // /// </summary> // public bool IsRunning // { // get // { // return null == busSocket ? false : true; // } // } // /// <summary> // /// 开始异步接收数据 // /// </summary> // private void asyncBeginReceive() // { // if (!IsRunning) // { // return; // } // if(busSocket == null) // { // return; // } // try { // Packet packet = new Packet (); // busSocket.BeginReceiveFrom (packet.Bytes, 0, packet.Bytes.Length, SocketFlags.None, ref packet.RemoteEndPoint, new AsyncCallback (asyncEndReceive), packet); // } // catch (Exception e) { // System.Threading.Thread.Sleep (1); // Console.WriteLine("asyncBeginReceive " + relinkCount ); // if (relinkCount == 0) // { // relinkCount = 1; // asyncBeginReceive(); // } // Console.WriteLine($"asyncBeginReceive {e.Message}"); // } // } // /// <summary> // /// 重连次数 // /// </summary> // private int relinkCount = 0; // /// <summary> // /// 异步接收数据结束 // /// </summary> // /// <param name="iar"></param> // private void asyncEndReceive(IAsyncResult iar) // { // if (!IsRunning) // { // return; // } // try // { // if (busSocket == null) // { // return; // } // asyncBeginReceive(); // Packet packet = (Packet)iar.AsyncState; // int len = busSocket.EndReceiveFrom(iar, ref packet.RemoteEndPoint); // byte[] bytes = packet.Bytes; // packet.Bytes = new byte[len]; // Array.Copy(bytes, 0, packet.Bytes, 0, packet.Bytes.Length); // //MainPage.Log($"接收{packet.RemoteEndPoint}数据"); // //mqtt连接数据读取 A协议网络设备信息读取回复 处理 // if (((IPEndPoint)packet.RemoteEndPoint).Port == 8585) // { // Control.Ins.ConvertReceiveData(bytes, ((IPEndPoint)packet.RemoteEndPoint).Address.ToString()); // } // else if (((IPEndPoint)packet.RemoteEndPoint).Port == 6000)//处理bus 6000端口的数据 // { // packet.Manager(); // } // } // catch (Exception ex) // { // MainPage.Log($"异步接收数据结束 {ex.Message},{((Packet)iar.AsyncState).Bytes}"); // } // } // /// <summary> // /// 异步发送数据 // /// </summary> // /// <param name="tempPacket"></param> // public void AsyncBeginSend(Packet tempPacket) // { // try // { // if (!IsRunning) // { // tempPacket.HaveSendCount++; // return; // } // tempPacket.FlagDateTime = System.DateTime.Now; // tempPacket.HaveSendCount++; // busSocket.BeginSendTo(tempPacket.Bytes, 0, tempPacket.Bytes.Length, SocketFlags.None, tempPacket.RemoteEndPoint, new AsyncCallback(asyncEndSend), tempPacket); // } // catch (Exception ex) // { // MainPage.Log($"AsyncBeginSend error {ex.Message}"); // } // } // /// <summary> // /// 异步发送数据结束 // /// </summary> // /// <param name="iar"></param> // private void asyncEndSend(IAsyncResult iar) // { // Packet tempUDPPacketBuffer = (Packet)iar.AsyncState; // try // { // int bytesSent = busSocket.EndSendTo(iar); // } // catch { // } // } // } //} using System; using System.Net.Sockets; using System.Net; @@ -45,13 +263,15 @@ busSocket = new Socket (AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); busSocket.EnableBroadcast = true; try { try { busSocket.Bind(new IPEndPoint(IPAddress.Any, Port)); busSocket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, new MulticastOption(IPAddress.Parse("239.0.168.188"))); relinkCount = 0; } catch (Exception ex){ catch (Exception ex) { MainPage.Log ($"udp port bind error : {ex.Message}"); busSocket = null; @@ -97,6 +317,8 @@ } } byte []receiveBytes = new byte[2000]; /// <summary> /// 开始异步接收数据 /// </summary> @@ -111,11 +333,17 @@ return; } try { Packet packet = new Packet (); busSocket.BeginReceiveFrom (packet.Bytes, 0, packet.Bytes.Length, SocketFlags.None, ref packet.RemoteEndPoint, new AsyncCallback (asyncEndReceive), packet); try { int len = busSocket.Receive(receiveBytes, SocketFlags.None); Packet packet = new Packet(len); System.Array.Copy(receiveBytes, packet.Bytes, len); packet.Manager(); } catch (Exception e) { catch (Exception e) { System.Threading.Thread.Sleep (1); Console.WriteLine("asyncBeginReceive " + relinkCount ); if (relinkCount == 0) @@ -209,9 +437,11 @@ { int bytesSent = busSocket.EndSendTo(iar); } catch { catch { } } } } HDL_ON/DAL/Mqtt/MqttClient.cs
@@ -565,7 +565,7 @@ //SetGatewayOnlineResetCheck(); //var bytes = Securitys.EncryptionService.AesDecryptPayload(e.ApplicationMessage.Payload, mqttEncryptKey); //bus数据解析 var packet = new Packet(); var packet = new Packet(e.ApplicationMessage.Payload.Length); if (!string.IsNullOrEmpty(DB_ResidenceData.Instance.HomeGateway.aesKey)) { HDL_ON/DAL/Server/HttpServerRequest.cs
@@ -710,7 +710,7 @@ if (mHomeGatewayRes.Count > 0) { DB_ResidenceData.Instance.HomeGateway = mHomeGatewayRes[0];//网关状态 DriverLayer.Control.Ins.GatewayOnline_Cloud = mHomeGatewayRes[0].gatewayStatus; HDL_ON.DriverLayer.Control.Ins.GatewayOnline_Cloud = mHomeGatewayRes[0].gatewayStatus; DB_ResidenceData.Instance.SaveResidenceData(); return revertObj.Code; } @@ -776,7 +776,7 @@ var mHomeGatewayRes = Newtonsoft.Json.JsonConvert.DeserializeObject<HomeGatewayInfo>(revertObj.Data.ToString()); if (mHomeGatewayRes != null) { DriverLayer.Control.Ins.GatewayOnline_Cloud = mHomeGatewayRes.gatewayStatus; HDL_ON.DriverLayer.Control.Ins.GatewayOnline_Cloud = mHomeGatewayRes.gatewayStatus; } } return revertObj.Code; HDL_ON/Entity/Function/Function.cs
HDL_ON/HDL_ON.projitems
@@ -171,7 +171,6 @@ <Compile Include="$(MSBuildThisFileDirectory)UI\UI2\4-PersonalCenter\MemberManagement\AddMemberScanPage.cs" /> <Compile Include="$(MSBuildThisFileDirectory)UI\UI2\4-PersonalCenter\MemberManagement\MemberManagementPageBLL.cs" /> <Compile Include="$(MSBuildThisFileDirectory)UI\UI2\4-PersonalCenter\MemberManagement\MemberPermissionPage.cs" /> <Compile Include="$(MSBuildThisFileDirectory)UI\UI2\4-PersonalCenter\MemberManagement\ChooseShareMemberTargetListPage.cs" /> <Compile Include="$(MSBuildThisFileDirectory)UI\UI2\4-PersonalCenter\AddFunction\AddDevciePage.cs" /> <Compile Include="$(MSBuildThisFileDirectory)UI\UI2\4-PersonalCenter\AddFunction\DeviceListPage.cs" /> <Compile Include="$(MSBuildThisFileDirectory)UI\UI2\4-PersonalCenter\AddFunction\BrandListPage.cs" /> @@ -595,6 +594,7 @@ <Compile Include="$(MSBuildThisFileDirectory)UI\UI2\3-Intelligence\Automation\Constant.cs" /> <Compile Include="$(MSBuildThisFileDirectory)UI\UI2\3-Intelligence\Scene\SceneTargetTypeChoosePage.cs" /> <Compile Include="$(MSBuildThisFileDirectory)UI\UI2\3-Intelligence\Scene\SceneAutomationListChoosePage.cs" /> <Compile Include="$(MSBuildThisFileDirectory)DAL\DriverLayer\AsyncUdpServer.cs" /> </ItemGroup> <ItemGroup> <Folder Include="$(MSBuildThisFileDirectory)Entity\Device\" /> HDL_ON/UI/UI2/4-PersonalCenter/PersonalDataPage.cs
@@ -242,7 +242,7 @@ if (MainPage.Increase) { bodyScrolView.Height = Application.GetRealHeight(541); bodyScrolView.Height = Application.GetRealHeight(541-10); } headPortraitView = new FrameLayout() @@ -858,16 +858,9 @@ #endregion bodyView.AddChidren(new Button() { Y = Application.GetRealHeight(622), Height = 1, BackgroundColor = CSS_Color.DividingLineColor, }); btnLogout = new Button() { Y = Application.GetRealHeight(623), Y = Application.GetRealHeight(624), Height = Application.GetRealHeight(50), TextAlignment = TextAlignment.Center, TextSize = CSS_FontSize.SubheadingFontSize,