RFID设备管理C#客户端学习笔记之5:Timer实时发送指令,存日志文件

利用Timer控件可以自动发送指令到读写器,而自动监控当然就需要将指定的信息存储到日志文件中以方便我们查看其某时刻的状态。我们设定每一秒读写器返回一次识别结果,下侧的statusStripLabel控件显示每次的事件添加结果。

为这个控件添加Text改变事件,每次改变都写此时的文本信息到log.txt中就ok啦,像下面这样:

124705_sktj_576429.png

图1 程序在服务器机器(Windows Server 2012操作系统)上运行

124705_Wtig_576429.png

图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以上。

就酱~

转载于:https://my.oschina.net/SnifferApache/blog/413718

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值