利用Timer控件可以自动发送指令到读写器,而自动监控当然就需要将指定的信息存储到日志文件中以方便我们查看其某时刻的状态。我们设定每一秒读写器返回一次识别结果,下侧的statusStripLabel控件显示每次的事件添加结果。
为这个控件添加Text改变事件,每次改变都写此时的文本信息到log.txt中就ok啦,像下面这样:
图1 程序在服务器机器(Windows Server 2012操作系统)上运行
图2 日志文件
1、为timer1添加Tick事件
/// <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不变,端口变了。向已经断开连接的客户发送指令会出现
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;
}
}
}
2、为toolStripStatusLabel1添加Text变化事件
/// <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以上。
就酱~