using Lskj.Business.Impl; using Lskj.Control; using Lskj.Control.Model; using Lskj.Core; using ReaderApi; using ReaderApi.Data; using System; using System.Collections.Generic; using System.Data; using System.Drawing; using System.IO.Ports; using System.Linq; using System.Text; using System.Threading; using System.Windows.Forms; using static ReaderApi.DeviceManagement; namespace RFIDManagement { public partial class FrmMain : BaseForm { public FrmMain() { InitializeComponent(); this.Load += OnFormLoad; this.FormClosing += OnFrmMainFormClosing; } /// /// 连接驱动 /// public DeviceManagement Device; /// /// 连接数 /// public List Readers; /// /// 消息 /// public List Tags; /// /// 标记 /// public bool StartFlag; /// /// 更新数据Timer /// public System.Windows.Forms.Timer UpdateTagTimer; /// /// 展示视频Timer /// public System.Windows.Forms.Timer ShowTimer; /// /// 界面上下文 /// public SynchronizationContext SyncContext; /// /// 当前连接 /// public Reader SelectReader; /// /// 数据源 /// public DataTable SourceTable; /// /// 写入数据窗口 /// FrmDataWrite DataWriteForm; /// /// 初始化界面 /// /// /// private void OnFormLoad(object sender, EventArgs e) { this.startLinkBtn.Enabled = true; this.stopLinkBtn.Enabled = true; this.startReadBtn.Enabled = false; this.stopReadBtn.Enabled = false; this.writeBtn.Enabled = false; if (!DBConfig.Instance.CreateConnection()) { MessageUtil.Show("网络连接失败"); Close(); } StringBuilder sqlBuilder = new StringBuilder(); sqlBuilder.AppendLine($"if not exists(select top 1 * from sysObjects where Id = object_id(N'P_RfidInfoTab') and xtype = 'U')"); sqlBuilder.AppendLine($"begin"); sqlBuilder.AppendLine($"create table P_RfidInfoTab(id int IDENTITY(1, 1) NOT NULL,epc varchar(100) NULL,url varchar(200) NULL,fileType int NULL,nextTime int NULL,orderId int NULL,nowCount int NULL,allCount int NULL)"); sqlBuilder.AppendLine($"end"); sqlBuilder.AppendLine($"else begin"); sqlBuilder.AppendLine($"if not exists(select top 1 * from syscolumns where id = object_id(N'P_RfidInfoTab') and name = 'epc')"); sqlBuilder.AppendLine($"begin alter table P_RfidInfoTab add epc varchar(100) end"); sqlBuilder.AppendLine($"if not exists(select top 1 * from syscolumns where id = object_id(N'P_RfidInfoTab') and name = 'url')"); sqlBuilder.AppendLine($"begin alter table P_RfidInfoTab add url varchar(200) end"); sqlBuilder.AppendLine($"if not exists(select top 1 * from syscolumns where id = object_id(N'P_RfidInfoTab') and name = 'fileType')"); sqlBuilder.AppendLine($"begin alter table P_RfidInfoTab add fileType int end"); sqlBuilder.AppendLine($"if not exists(select top 1 * from syscolumns where id = object_id(N'P_RfidInfoTab') and name = 'nextTime')"); sqlBuilder.AppendLine($"begin alter table P_RfidInfoTab add nextTime int end"); sqlBuilder.AppendLine($"if not exists(select top 1 * from syscolumns where id = object_id(N'P_RfidInfoTab') and name = 'orderId')"); sqlBuilder.AppendLine($"begin alter table P_RfidInfoTab add orderId int end"); sqlBuilder.AppendLine($"if not exists(select top 1 * from syscolumns where id = object_id(N'P_RfidInfoTab') and name = 'nowCount')"); sqlBuilder.AppendLine($"begin alter table P_RfidInfoTab add nowCount int end"); sqlBuilder.AppendLine($"if not exists(select top 1 * from syscolumns where id = object_id(N'P_RfidInfoTab') and name = 'allCount')"); sqlBuilder.AppendLine($"begin alter table P_RfidInfoTab add allCount int end"); sqlBuilder.AppendLine($"end"); SqlHelper.ExecuteNonQuery(sqlBuilder.ToString()); SqlHelper.ExecuteNonQuery("update P_RfidInfoTab set nowCount = '0'"); UpdateTagTimer = new System.Windows.Forms.Timer(); UpdateTagTimer.Interval = 200; UpdateTagTimer.Tick += OnUpdateTagTimerTick; UpdateTagTimer.Enabled = true; ShowTimer = new System.Windows.Forms.Timer(); ShowTimer.Interval = 100; ShowTimer.Tick += OnShowTimerTick; ShowTimer.Enabled = true; SyncContext = SynchronizationContext.Current; Device = new DeviceManagement(); Tags = new List(); Readers = new List(); Device.OnDeviceState += new DeviceEventHandle(OnDeviceEventHandle); Device.OnRecvMessage += new MessageReceivedEventHandle(OnRecvMessageEventHandle); this.startLinkBtn.Click += OnStartLinkBtnClick; this.stopLinkBtn.Click += OnStopLinkBtnClick; this.startReadBtn.Click += OnStartReadBtnClick; this.stopReadBtn.Click += OnStopReadBtnClick; this.writeBtn.Click += OnWriteBtnClick; this.refushBtn.Click += OnRefushBtnClick; ; this.com_LinkType.SelectedIndexChanged += OnComLinkTypeSelectedIndexChanged; string linkType = IniHelper.Read("LinkType"); int selectIndex = com_LinkType.Properties.Items.IndexOf(linkType); com_LinkType.SelectedIndex = selectIndex; InitSourceTable(); } /// /// 开始连接按钮点击时 /// /// /// private void OnStartLinkBtnClick(object sender, EventArgs e) { string connectMode = com_LinkType.Text; string connectStr = com_LinkPms.Text; try { ConnectDevice(connectMode, connectStr, 1); } catch (Exception ex) { MessageUtil.Show(ex.Message); } } /// /// 断开连接 /// /// /// private void OnStopLinkBtnClick(object sender, EventArgs e) { ConnectClose(); lb_LinkTips.Text = "未连接"; lb_LinkTips.ForeColor = Color.Gray; startLinkBtn.Enabled = true; stopLinkBtn.Enabled = true; startReadBtn.Enabled = false; stopReadBtn.Enabled = false; writeBtn.Enabled = false; } /// /// 开始读取 /// /// /// private void OnStartReadBtnClick(object sender, EventArgs e) { if (lb_LinkTips.Text.Equals("已连接")) { Tags.Clear(); var result = SelectReader?.Send(new InventoryPara(InventoryMode.EPC)); if (result != null) { GlobalPara.tagDisplayArea = TagDisplayArea.main; } startLinkBtn.Enabled = false; stopLinkBtn.Enabled = true; startReadBtn.Enabled = false; stopReadBtn.Enabled = true; writeBtn.Enabled = false; } else { MessageUtil.Show("未连接"); } } /// /// 停止读取 /// /// /// private void OnStopReadBtnClick(object sender, EventArgs e) { SelectReader?.Send(new InventoryStopPara()); startLinkBtn.Enabled = false; stopLinkBtn.Enabled = true; startReadBtn.Enabled = true; stopReadBtn.Enabled = false; writeBtn.Enabled = true; } /// /// 标签写入按钮点击 /// /// /// private void OnWriteBtnClick(object sender, EventArgs e) { if (!StartFlag) { try { DataWriteForm = new FrmDataWrite(); DataWriteForm.SelectReader = SelectReader; DataWriteForm.ShowDialog(); DataWriteForm.Dispose(); } catch (Exception ex) { MessageUtil.Show(ex.Message); } } else { MessageUtil.Show("请先停止读取数据"); } } /// /// 重置按钮点击 /// /// /// private void OnRefushBtnClick(object sender, EventArgs e) { SqlHelper.ExecuteNonQuery("update P_RfidInfoTab set nowCount = '0'"); } /// /// 切换连接模式 /// /// /// private void OnComLinkTypeSelectedIndexChanged(object sender, EventArgs e) { if (com_LinkType.Text.Equals("RS232")) { InitRS232(); } else if (com_LinkType.Text.Equals("UDP")) { InitUDP(); } } /// /// RFID设备状态改变事件 /// /// /// private void OnDeviceEventHandle(object sender, DeviceEventArgs e) { if (e.cmd == ReaderApi.DeviceState.Connected) { foreach (Reader re in Readers) { var result = re?.Send(new InventoryStopPara()); } AddReader(e.reader); SyncContext.Post(AddReaderUI, e.reader); } else if (e.cmd == ReaderApi.DeviceState.Disconnected) { RemoveReader(e.reader); SyncContext.Post(RemoveReaderUI, e.reader); } else if (e.cmd == ReaderApi.DeviceState.ConnectError) { SelectReader = null; MessageUtil.Show($"连接错误!\r\n{e.reader.connectStr}"); } } /// /// 接收RFID数据事件 /// /// /// private void OnRecvMessageEventHandle(object sender, MessageReceivedEventArgs e) { if (e.data != null) { if (e.cmd == CmdType.cmd_tag || e.cmd == CmdType.cmd_write_tag || e.cmd == CmdType.cmd_lock_tag || e.cmd == CmdType.cmd_kill_tag) //标签数据 { if (GlobalPara.tagDisplayArea == TagDisplayArea.main) { GlobalMethod.AddTag(e.data as Tag, Tags); } else if (GlobalPara.tagDisplayArea == TagDisplayArea.writeTag || GlobalPara.tagDisplayArea == TagDisplayArea.writeTagRead || GlobalPara.tagDisplayArea == TagDisplayArea.writeTagReadListBox2) { SyncContext.Post(DataWriteFormAddTag, e.data); } } else { if (e.cmd == CmdType.cmd_tag_epc || e.cmd == CmdType.cmd_tag_tid || e.cmd == CmdType.cmd_tag_epc_tid || e.cmd == CmdType.cmd_tag_epc_user) //开始读取标签成功 { StartFlag = (e.data as Result).isSuccess; } else if (e.cmd == CmdType.cmd_inventory_stop)//停止读标签成功 { if ((e.data as Result).isSuccess) { StartFlag = false; } } if (e.cmd == CmdType.cmd_485_address)//485地址设置 { if ((e.data as Result).isSuccess) { MessageUtil.Show("485地址已经改变"); } } } } } /// /// 创建数据源 /// private void InitSourceTable() { SourceTable = new DataTable(); SourceTable.Columns.Add("EpcColumn"); SourceTable.Columns.Add("PCColumn"); SourceTable.Columns.Add("AntColumn"); SourceTable.Columns.Add("RSSIColumn"); SourceTable.Columns.Add("CountColumn"); SourceTable.Columns.Add("FrequencyColumn"); this.gcMain.DataSource = SourceTable; } /// /// 加载串口 /// private void InitRS232() { string comPort = IniHelper.Read("RS232"); com_LinkPms.Properties.Items.Clear(); string[] ports = SerialPort.GetPortNames(); foreach (string port in ports) { com_LinkPms.Properties.Items.Add(port); } int selectIndex = com_LinkPms.Properties.Items.IndexOf(comPort); if (selectIndex > 0) { com_LinkPms.SelectedIndex = selectIndex; } } /// /// 加载UDP /// private void InitUDP() { string udpServer = IniHelper.Read("UDP"); com_LinkPms.Properties.Items.Clear(); if (!string.IsNullOrEmpty(udpServer)) { com_LinkPms.Text = udpServer; } else { com_LinkPms.Text = "192.168.0.188:4001"; } } /// /// 保存连接信息 /// private void SaveLink() { IniHelper.Write("LinkType", com_LinkType.Text); if (com_LinkType.Text.Equals("RS232")) { IniHelper.Write("RS232", com_LinkPms.Text); } else if (com_LinkType.Text.Equals("UDP")) { IniHelper.Write("UDP", com_LinkPms.Text); } } /// /// 创建连接 /// /// /// /// private void ConnectDevice(string connectMode, string connectStr, int rs485add) { Device.Open(connectMode, connectStr, rs485add); } /// /// 添加Readers /// /// private void AddReaderUI(object state) { if (Readers.Count == 1) { WaitForm.ShowForm("连接中..."); SelectReader = Readers.First(); InventoryStopPara stopPara = new InventoryStopPara(); var resultStop = SelectReader?.SendSyn(stopPara); SyncContext.Post(UpdateConnectState, resultStop); if (resultStop.isSuccess) { GetVersionPara para = new GetVersionPara(); var result = SelectReader?.SendSyn(para); SyncContext.Post(UpdateVersion, result); } WaitForm.HideForm(); } } /// /// 添加Reader /// /// public void AddReader(Reader reader) { lock (Readers) { var newReaderFlag = false; foreach (var re in Readers) { if (re.connectStr == reader.connectStr) { newReaderFlag = true; } } if (!newReaderFlag) { Readers.Add(reader); } } } /// /// 移除Readers /// /// private void RemoveReaderUI(object state) { if (Readers.Count == 1) { SelectReader = Readers.First(); } } /// /// 移除Readers /// /// private void RemoveReader(Reader reader) { lock (Readers) { foreach (var re in Readers) { if (re.connectStr == reader.connectStr) { Readers.Remove(reader); break; } } } } /// /// 更新连接信息 /// /// private void UpdateConnectState(object state) { var result = state as Result; if (!result.isSuccess) { MessageUtil.Show(result.errorMsg); lb_LinkTips.Text = "连接失败"; lb_LinkTips.ForeColor = Color.Red; ConnectClose(); } } private void UpdateVersion(object state) { var result = state as Result; if (result.isSuccess) { lb_LinkTips.Text = "已连接"; lb_LinkTips.ForeColor = Color.Green; startLinkBtn.Enabled = false; stopLinkBtn.Enabled = true; startReadBtn.Enabled = true; stopReadBtn.Enabled = false; writeBtn.Enabled = true; SaveLink(); } else { lb_LinkTips.Text = "连接失败"; lb_LinkTips.ForeColor = Color.Red; ConnectClose(); startLinkBtn.Enabled = true; stopLinkBtn.Enabled = true; startReadBtn.Enabled = false; stopReadBtn.Enabled = false; writeBtn.Enabled = false; } } /// /// 关闭连接 /// private void ConnectClose() { Device?.Close(); Readers?.Clear(); Tags?.Clear(); gridView?.BeginUpdate(); SourceTable?.Rows.Clear(); gridView?.EndUpdate(); SelectReader = null; } /// /// 更新数据事件 /// /// /// private void OnUpdateTagTimerTick(object sender, EventArgs e) { gridView.BeginUpdate(); lock (Tags) { foreach (Tag tag in Tags) { DataRow row = SourceTable.AsEnumerable().Where(n => (n["EpcColumn"] + "").Equals(tag.epc)).FirstOrDefault(); if (row != null) { row["PCColumn"] = tag.pc.ToString(); row["AntColumn"] = tag.ant.ToString(); row["RSSIColumn"] = tag.rssi.ToString(); row["CountColumn"] = tag.count.ToString(); if (tag.frequency >= 0xC9) { row["FrequencyColumn"] = tag.frequency.ToString("X2"); } else { if (Frequency.frequency.ContainsKey(tag.frequency)) { row["FrequencyColumn"] = Frequency.frequency[tag.frequency]; } else { row["FrequencyColumn"] = tag.frequency.ToString("X2"); } } } else { DataRow newRow = SourceTable.NewRow(); newRow["EpcColumn"] = tag.epc.ToString(); newRow["PCColumn"] = tag.pc.ToString(); newRow["AntColumn"] = tag.ant.ToString(); newRow["RSSIColumn"] = tag.rssi.ToString(); newRow["CountColumn"] = tag.count.ToString(); newRow["FrequencyColumn"] = tag.frequency.ToString(); SourceTable.Rows.Add(newRow); } } List deleteRows = new List(); foreach (DataRow row in SourceTable.Rows) { Tag tag = Tags.Where(n => n.epc.Equals(row["EpcColumn"] + "")).FirstOrDefault(); if (tag == null) { deleteRows.Add(row); } } foreach (DataRow deleteRow in deleteRows) { SourceTable.Rows.Remove(deleteRow); } } gridView.EndUpdate(); Tags.Clear(); } /// /// 更新数据事件 /// /// /// private void OnShowTimerTick(object sender, EventArgs e) { ShowTimer.Enabled = false; try { List dataRowsList = SourceTable.AsEnumerable().OrderByDescending(n => Convert.ToDecimal(n["RSSIColumn"])).ToList(); if (dataRowsList != null) { foreach (DataRow dataRow in dataRowsList) { string epcValue = dataRow["EpcColumn"] + ""; DataTable selectTable = BaseImpl.GetDataTableResult($"select * from P_RfidInfoTab where epc = '{epcValue}' order by orderId"); foreach (DataRow selectRow in selectTable.Rows) { try { int.TryParse(selectRow["id"] + "", out int id); int.TryParse(selectRow["nextTime"] + "", out int nextTime); string url = selectRow["url"] + ""; int.TryParse(selectRow["fileType"] + "", out int fileType); int.TryParse(selectRow["nowCount"] + "", out int nowCount); int.TryParse(selectRow["allCount"] + "", out int allCount); int intervalTime = nextTime != 0 ? nextTime * 1000 : 1000; if (nowCount < allCount) { using (FrmVlcPlayer frmVlcPlayer = new FrmVlcPlayer()) { frmVlcPlayer.PlayVideo(url); if (fileType.Equals(0)) { frmVlcPlayer.Opacity = 1; frmVlcPlayer.WindowState = FormWindowState.Maximized; } else { frmVlcPlayer.Opacity = 0; frmVlcPlayer.WindowState = FormWindowState.Minimized; } frmVlcPlayer.TopMost = true; frmVlcPlayer.ShowDialog(); } SqlHelper.ExecuteNonQuery($"update P_RfidInfoTab set nowCount = '{nowCount + 1}' where id = '{id}'"); Thread.Sleep(intervalTime); } } catch (Exception) { } } break; } } } catch (Exception ex) { Console.WriteLine(ex.Message); } ShowTimer.Enabled = true; } /// /// 写入数据 /// private void DataWriteFormAddTag(object state) { DataWriteForm?.AddTag(state as Tag); } /// /// 窗体关闭时 /// /// /// private void OnFrmMainFormClosing(object sender, System.Windows.Forms.FormClosingEventArgs e) { if (stopReadBtn.Enabled) { OnStopReadBtnClick(null, null); } if (stopLinkBtn.Enabled) { OnStopLinkBtnClick(null, null); } } } }