using OS.Spin.Common; using System; using System.Net; using System.Net.Sockets; using System.Threading; namespace OS.Spin.BusinessLayer.SubBusiness { public class TimerBl { /// /// 接收巨细数据处理 /// /// /// public delegate void TimerRecived(int type, double meter); public TimerRecived DoRecived; private bool _isClosed = false; private string _ip = "192.168.100.2"; private int _port = 5002; private int _localPort = 5001; private string _localIp = "192.168.100.1"; private Socket _client; private EndPoint _desPoint; private Thread _reciveThread; public TimerBl() { } private bool _connect = false; private Thread _threadBeat; public void OnStart() { try { _client = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); _client.Bind(new IPEndPoint(IPAddress.Parse(_localIp), _localPort)); _desPoint = new IPEndPoint(IPAddress.Parse(_ip), _port); if (null == _reciveThread) { _reciveThread = new Thread(ReciveMsg); _reciveThread.Start(); } _connect = true; if (null == _threadBeat) { _threadBeat = new Thread(DoBeat); _threadBeat.Start(); } } catch (Exception ex) { LogisTrac.WriteInfoLog(String.Format("[OnStart 失败] =====[{0}]======", ex.Message)); _connect = false; } } private void DoBeat() { while (true) { Thread.Sleep(500); if (_connect) { continue; } OnStart(); } } public void Stop() { try { if (!_connect) { return; } byte[] bits = new byte[7]; int send_cnt = 0; bits[send_cnt++] = 0xFF; bits[send_cnt++] = 0xFD; bits[send_cnt++] = (byte)7; bits[send_cnt++] = 0x11; bits[send_cnt++] = 0x01; bits[send_cnt++] = 0x01; bits[send_cnt++] = 0xAA; _client.SendTo(bits, _desPoint); } catch (Exception ex) { LogisTrac.WriteLog(string.Format("Stop:{0}", ex.Message)); } } public void Start() { try { if (!_connect) { return; } byte[] bits = new byte[7]; int send_cnt = 0; bits[send_cnt++] = 0xFF; bits[send_cnt++] = 0xFD; bits[send_cnt++] = (byte)0; bits[send_cnt++] = 0x22; bits[send_cnt++] = 0x01; bits[send_cnt++] = 0x01; bits[send_cnt++] = 0xAA; _client.SendTo(bits, _desPoint); } catch (Exception ex) { LogisTrac.WriteLog(string.Format("Start:{0}", ex.Message)); } } public void Zero() { try { if (!_connect) { return; } byte[] bits = new byte[7]; int send_cnt = 0; bits[send_cnt++] = 0xFF; bits[send_cnt++] = 0xFD; bits[send_cnt++] = (byte)7; bits[send_cnt++] = 0x33; bits[send_cnt++] = 0x01; bits[send_cnt++] = 0x01; bits[send_cnt++] = 0xAA; _client.SendTo(bits, _desPoint); } catch (Exception ex) { LogisTrac.WriteLog(string.Format("Zero:{0}", ex.Message)); } } /// /// 接收发送给本机ip对应端口号的数据报 /// private void ReciveMsg() { EndPoint point = new IPEndPoint(IPAddress.Any, 0); //用来保存发送方的ip和端口号 while (true) { //EndPoint point = new IPEndPoint(IPAddress.Any, 0);//用来保存发送方的ip和端口号 try { LogisTrac.WriteInfoLog(String.Format("[接收数据] 开始 ==============")); byte[] bits = new byte[100]; int length = _client.ReceiveFrom(bits, ref point);//接收数据报 LogisTrac.WriteInfoLog(String.Format("[接收] =====[{0}]======", length)); for (var i = 0; i < length; i++) { LogisTrac.WriteInfoLog(String.Format("[{0}]: {1} ", i, bits[i].ToString("x2"))); } if (0 == length) { if (null != _client) { _client.Close(); _client.Dispose(); } _client = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); _client.Bind(new IPEndPoint(IPAddress.Parse(_localIp), _localPort)); continue; } if (null == bits || length <= 8 || !(bits[0] == 0xFF && bits[1] == 0xFE && bits[length - 1] == 0xAA)) { continue; } // 切换花纹 if (bits[3] == 0x33) { // 切换花纹 //OS.Spin.Running.Cache.GetInstance().FigureId = bits[4]; continue; } // 过滤非法数据 if (!(bits[3] == 0x11) && !(bits[3] == 0x99)) { continue; } // 计算当前米数 double current_meter = bits[4] * 256 + bits[5] + bits[6] / 100.0; if (bits[3] == 0x99) { // 修改当前米数 OS.Spin.Running.Cache.GetInstance().Speed = 0; DoRecived?.Invoke(0, current_meter); continue; } // 修改当前米数 OS.Spin.Running.Cache.GetInstance().Speed = (bits[7] * 256 + bits[8]) / 100.0; //if (current_meter <= 2) //{ // // 清空上次数据 // //DoRecived?.Invoke(0, current_meter); // continue; //} // 软触发相机 DoRecived?.Invoke(1, current_meter); } catch (Exception ex) { LogisTrac.WriteLog(ex); if (_isClosed) { return; } if (null != _client) { _client.Close(); _client.Dispose(); } _client = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); _client.Bind(new IPEndPoint(IPAddress.Parse(_localIp), _localPort)); continue; } } } public void Dispose() { try { _isClosed = true; if (null != _reciveThread && _reciveThread.IsAlive) { _reciveThread.Abort(); } if (null != _client) { _client.Close(); _client.Dispose(); } if (null != _threadBeat && _threadBeat.IsAlive) { _threadBeat.Abort(); } } catch (Exception ex) { LogisTrac.WriteLog(string.Format("Dispose:{0}", ex.Message)); } } } }