利用Timer控件能够自动发送指令到读写器,而自动监控固然就须要将指定的信息存储到日志文件中以方便咱们查看其某时刻的状态。咱们设定每一秒读写器返回一次识别结果,下侧的statusStripLabel控件显示每次的事件添加结果。
c#
为这个控件添加Text改变事件,每次改变都写此时的文本信息到log.txt中就ok啦,像下面这样:数组
图1 程序在服务器机器(Windows Server 2012操做系统)上运行服务器
图2 日志文件
this
/// <summary> /// 每隔1秒自动发送识别指令 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void timer1_Tick(object sender, EventArgs e) { try { string s = cb_readerList.Text;//发送给谁 string cmd = cmds["设备识别"]; Debug.WriteLine(DateTime.Now + "自动发送:" + cmd); byte[] buff = new byte[20]; string[] str = cmd.Split(' '); //将byte数组转化为16进制 int k = 0; foreach (string item in str) { if (item.Trim() != "") { buff[k++] = byte.Parse(item, System.Globalization.NumberStyles.HexNumber); } } if (cb_readerList.Items.Count == 0) { toolStripStatusLabel1.Text = DateTime.Now + "没有读写器链接到"; timer1.Stop(); //重启服务 this.ServerStop(); Thread.Sleep(2000); this.ServerStart(); return; } else { this.mySend(s, buff); } } catch (Exception ex) { toolStripStatusLabel1.Text = "timer1_Tick中的异常:" + ex; } }
实际运行的时候发现,读写器可能会忽然断开链接,而后再次连上。这时候ip不变,端口变了。向已经断开链接的客户发送指令会出现spa
ObjectDisposedException异常,因此咱们须要及时移除失效的coonSocket和thread
操作系统
/// <summary> /// 向读写器发送数据 /// </summary> /// <param name="s">reader list的值</param> /// <param name="buff">发送的内容</param> private void mySend(string s,byte[] buff) { if (s != "全部读写器") { try { dicSocket[s].Send(buff, buff.Length, SocketFlags.None);//向单个客户端发送信息 } catch (ObjectDisposedException) { //出现此种异常就直接删除之:System.ObjectDisposedException: 没法访问已释放的对象。 dicSocket[s].Close(); dicThread[s].Abort(); dicSocket.Remove(s); dicThread.Remove(s); this.cb_readerList.Items.Remove(s); label1.Text = "在线读写器数:" + Convert.ToString(cb_readerList.Items.Count); } catch (Exception) { toolStripStatusLabel1.Text = DateTime.Now + ":发送出现其余异常"; throw; } } else { foreach (string i in cb_readerList.Items) { try { dicSocket[i].Send(buff, buff.Length, SocketFlags.None);//向单个客户端发送信息 } catch (ObjectDisposedException) { //出现此种异常就直接删除之:System.ObjectDisposedException: 没法访问已释放的对象。 dicSocket[i].Close(); dicThread[i].Abort(); dicSocket.Remove(i); dicThread.Remove(i); this.cb_readerList.Items.Remove(i); label1.Text = "在线读写器数:" + Convert.ToString(cb_readerList.Items.Count); } catch (Exception) { toolStripStatusLabel1.Text = DateTime.Now + ":发送出现其余异常"; throw; } } }
/// <summary> /// 状态栏文本改变时,将记录存储到txt中 /// </summary> private void toolStripStatusLabel1_TextChanged(object sender, EventArgs e) { //ref:写入文本文件 https://msdn.microsoft.com/zh-cn/library/8bh11f1k.aspx string filePath = DateTime.Now.ToString("yyyy-MM-dd") + "log.txt";//日志文件以天为单位 if (File.Exists(filePath)) { using (StreamWriter sw = new StreamWriter(filePath, true)) { sw.WriteLine(toolStripStatusLabel1.Text); } } else { using (StreamWriter sw = new StreamWriter(filePath)) { sw.WriteLine(toolStripStatusLabel1.Text); } } }
是的,log文件的名称是按当天日期命名,运行24小时后,log文件通常会在3000kb以上。日志
就酱~
code