zoukankan      html  css  js  c++  java
  • 硬件UDP读数AsynUdpClient

    public class AsynUdpClient
        {
            /// <summary>
            /// 回调委托
            /// </summary>
            /// <param name="point">ip</param>
            /// <param name="msg"></param>
            public delegate void UdpReciveHandler(EndPoint point, string msg);
            //Socket服务
            private readonly Socket _server;
            //是否发送成功
            public bool IsSuccess = false;
            /// <summary>
            /// 发送结果消息
            /// </summary>
            public string ResultMsg = "";
    
            /// <summary>
            /// 构造方法
            /// </summary>
            /// <param name="port">客户端端口号</param>
            public AsynUdpClient(int port = 12345)
            {
                _server = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
                var ips = Dns.GetHostAddresses(Dns.GetHostName());
                var firstOrDefault = ips.FirstOrDefault(o => o.AddressFamily == AddressFamily.InterNetwork);
                var ip4 = "127.0.0.1";
                if (firstOrDefault != null)
                {
                   ip4 = firstOrDefault.ToString();
                }
                _server.Bind(new IPEndPoint(IPAddress.Parse(ip4), port)); //绑定端口号和IP
            }
    
    
            /// <summary>
            /// 向特定ip的主机的端口发送数据报
            /// </summary>
            /// <param name="address">ip+端口号</param>
            /// <param name="msg">发送文本数据</param>
            /// <param name="udpReciveEvent"></param>
            public void SendMsg(string address, string msg,UdpReciveHandler udpReciveEvent)
            {
                lock (this)
                {
                    IsSuccess = false;
                    try
                    {
                        var arr = address.Split(':').ToList();
                        if (arr.Count == 1)
                        {
                            arr.Add("12345");
                        }
                        EndPoint point = new IPEndPoint(IPAddress.Parse(arr[0]), Convert.ToInt32(arr[1]));
                        var bytes = HexStringToBytes(msg);
                        _server.SendTo(bytes, point);//00 B0 D0 7B BC 21
                        _server.SendTimeout = 500;
                        IsSuccess = true;
                        ResultMsg = "发送成功:" + msg;
                        //等待
                        Thread.Sleep(200);
                        Task.Factory.StartNew(() =>
                        {
                            ExecReciveMsg(udpReciveEvent);
                        });
                    }
                    catch (Exception ex)
                    {
                        IsSuccess = false;
                        ResultMsg = "发送失败!" + ex.Message;
                    }
                }
            }
    
            /// <summary>
            /// 回调
            /// </summary>
            /// <returns></returns>
            private void ExecReciveMsg(UdpReciveHandler udpReciveEvent)
            {
                EndPoint point = new IPEndPoint(IPAddress.Any, 12345); //用来保存发送方的ip和端口号
                byte[] buffer = new byte[1024];
                int length = _server.ReceiveFrom(buffer, ref point); //接收数据报
                var rebuffer = new byte[length];
                for (var i = 0; i < length; i++)
                {
                    rebuffer[i] = buffer[i];
                }
                var msg = BytesToHexString(rebuffer,' ');
                //委托回调
                if (udpReciveEvent != null) udpReciveEvent(point, msg);
            }
    
    
            //解析列表
            private static readonly List<char> HexCharList = new List<char>(){'0','1','2','3','4','5','6', '7','8','9','A','B','C', 'D','E','F'};
    
            /// <summary>
            /// 字符串转字节
            /// </summary>
            /// <param name="hex">转化字符串</param>
            /// <returns>An array of bytes</returns>
            private byte[] HexStringToBytes(string hex)
            {
                try
                {
                    hex = hex.ToUpper();
                    MemoryStream memoryStream = new MemoryStream();
                    for (int index = 0; index < hex.Length; ++index)
                    {
                        if (index + 1 < hex.Length &&
                            (HexCharList.Contains(hex[index]) && HexCharList.Contains(hex[index + 1])))
                        {
                            memoryStream.WriteByte(
                                (byte) (HexCharList.IndexOf(hex[index])*16 + HexCharList.IndexOf(hex[index + 1])));
                            ++index;
                        }
                    }
                    byte[] array = memoryStream.ToArray();
                    memoryStream.Dispose();
                    return array;
                }
                catch (Exception ex)
                {
    
                    throw ex;
                }
            }
    
            /// <summary>
            /// 字节转换成字符串
            /// </summary>
            /// <param name="bytes">An array of bytes</param>
            /// <param name="segment"></param>
            /// <returns>Hex string</returns>
            private string BytesToHexString(byte[] bytes, char segment)
            {
                try
                {
                    StringBuilder stringBuilder = new StringBuilder();
                    foreach (byte inByte in bytes)
                    {
                        if ((int)segment == 0)
                            stringBuilder.Append(string.Format("{0:X2}", (object)inByte));
                        else
                            stringBuilder.Append(string.Format("{0:X2}{1}", (object)inByte, (object)segment));
                    }
                    if ((int)segment != 0 && stringBuilder.Length > 1 && (int)stringBuilder[stringBuilder.Length - 1] == (int)segment)
                        stringBuilder.Remove(stringBuilder.Length - 1, 1);
                    return stringBuilder.ToString();
                }
                catch (Exception ex)
                {
    
                    throw ex;
                }
            }
    
    
        }
    }
    View Code

    调用

     private static readonly AsynUdpClient UdpClient = new AsynUdpClient(Convert.ToInt32(UdpClientPort));
    UdpClient.SendMsg(item.deviceip, code, (point, msg) =>
                                {
                                    UdpClientRecive(point, msg,devicemac);
                                });
                                if (UdpClient.IsSuccess)
                                {
                                    LogHelper.Debug("发送:" + code);
                                }
            /// <summary>
            /// 报文回复回调
            /// </summary>
            /// <param name="point"></param>
            /// <param name="msg"></param>
            /// <param name="devicemac"></param>
            public void UdpClientRecive(EndPoint point, string msg, string devicemac)
            {
      //其他操作  
    }
    public class AsynUdpClient    {        /// <summary>        /// 回调委托        /// </summary>        /// <param name="point">ip</param>        /// <param name="msg"></param>        public delegate void UdpReciveHandler(EndPoint point, string msg);        //Socket服务        private readonly Socket _server;        //是否发送成功        public bool IsSuccess = false;        /// <summary>        /// 发送结果消息        /// </summary>        public string ResultMsg = "";
            /// <summary>        /// 构造方法        /// </summary>        /// <param name="port">客户端端口号</param>        public AsynUdpClient(int port = 12345)        {            _server = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);            var ips = Dns.GetHostAddresses(Dns.GetHostName());            var firstOrDefault = ips.FirstOrDefault(o => o.AddressFamily == AddressFamily.InterNetwork);            var ip4 = "127.0.0.1";            if (firstOrDefault != null)            {               ip4 = firstOrDefault.ToString();            }            _server.Bind(new IPEndPoint(IPAddress.Parse(ip4), port)); //绑定端口号和IP        }
    
            /// <summary>        /// 向特定ip的主机的端口发送数据报        /// </summary>        /// <param name="address">ip+端口号</param>        /// <param name="msg">发送文本数据</param>        /// <param name="udpReciveEvent"></param>        public void SendMsg(string address, string msg,UdpReciveHandler udpReciveEvent)        {            lock (this)            {                IsSuccess = false;                try                {                    var arr = address.Split(':').ToList();                    if (arr.Count == 1)                    {                        arr.Add("12345");                    }                    EndPoint point = new IPEndPoint(IPAddress.Parse(arr[0]), Convert.ToInt32(arr[1]));                    var bytes = HexStringToBytes(msg);                    _server.SendTo(bytes, point);//00 B0 D0 7B BC 21                    _server.SendTimeout = 500;                    IsSuccess = true;                    ResultMsg = "发送成功:" + msg;                    //等待                    Thread.Sleep(200);                    Task.Factory.StartNew(() =>                    {                        ExecReciveMsg(udpReciveEvent);                    });                }                catch (Exception ex)                {                    IsSuccess = false;                    ResultMsg = "发送失败!" + ex.Message;                }            }        }
            /// <summary>        /// 回调        /// </summary>        /// <returns></returns>        private void ExecReciveMsg(UdpReciveHandler udpReciveEvent)        {            EndPoint point = new IPEndPoint(IPAddress.Any, 12345); //用来保存发送方的ip和端口号            byte[] buffer = new byte[1024];            int length = _server.ReceiveFrom(buffer, ref point); //接收数据报            var rebuffer = new byte[length];            for (var i = 0; i < length; i++)            {                rebuffer[i] = buffer[i];            }            var msg = BytesToHexString(rebuffer,' ');            //委托回调            if (udpReciveEvent != null) udpReciveEvent(point, msg);        }
    
            //解析列表        private static readonly List<char> HexCharList = new List<char>(){'0','1','2','3','4','5','6', '7','8','9','A','B','C', 'D','E','F'};
            /// <summary>        /// 字符串转字节        /// </summary>        /// <param name="hex">转化字符串</param>        /// <returns>An array of bytes</returns>        private byte[] HexStringToBytes(string hex)        {            try            {                hex = hex.ToUpper();                MemoryStream memoryStream = new MemoryStream();                for (int index = 0; index < hex.Length; ++index)                {                    if (index + 1 < hex.Length &&                        (HexCharList.Contains(hex[index]) && HexCharList.Contains(hex[index + 1])))                    {                        memoryStream.WriteByte(                            (byte) (HexCharList.IndexOf(hex[index])*16 + HexCharList.IndexOf(hex[index + 1])));                        ++index;                    }                }                byte[] array = memoryStream.ToArray();                memoryStream.Dispose();                return array;            }            catch (Exception ex)            {
                    throw ex;            }        }
            /// <summary>        /// 字节转换成字符串        /// </summary>        /// <param name="bytes">An array of bytes</param>        /// <param name="segment"></param>        /// <returns>Hex string</returns>        private string BytesToHexString(byte[] bytes, char segment)        {            try            {                StringBuilder stringBuilder = new StringBuilder();                foreach (byte inByte in bytes)                {                    if ((int)segment == 0)                        stringBuilder.Append(string.Format("{0:X2}", (object)inByte));                    else                        stringBuilder.Append(string.Format("{0:X2}{1}", (object)inByte, (object)segment));                }                if ((int)segment != 0 && stringBuilder.Length > 1 && (int)stringBuilder[stringBuilder.Length - 1] == (int)segment)                    stringBuilder.Remove(stringBuilder.Length - 1, 1);                return stringBuilder.ToString();            }            catch (Exception ex)            {
                    throw ex;            }        }
    
        }}
  • 相关阅读:
    CNN结构:SPP-Net为CNNs添加空间尺度卷积-神经元层
    VR: AR和VR演进哲学
    OpenCV:使用 随机森林与GBDT
    VTK初始化New返回Null问题
    VTK嵌入MFC同步显示
    VTK:VTK嵌入MFC成功
    深度学习的技术困难
    编译Caffe-Win错误集锦
    Reducing the Dimensionality of Data with Neural Networks:神经网络用于降维
    VC维与DNN的Boundary
  • 原文地址:https://www.cnblogs.com/zengtianli/p/11139869.html
Copyright © 2011-2022 走看看