private void InitUdp() { udp = new UdpComm(); udp.onReceiveData += new EventHandler <ReceiveDataEventArgs>(ReceiveUdpData); udp.StartListen(); }
public AlarmPageViewModel() { alarmLamp = new AlarmLamp(); ope = new AlarmInfoOperator(); ClearAlarmListCommand = new DelegateCommand(ClearAlamList); this.AlarmInfos = new ObservableCollection <AlarmInfo>(); if (App.Current == null) { return; } if (this.ControlPads == null) { this.ControlPads = ControlPad.GetAllControlPads(); } //此处需判断是不是服务器 Task.Run(() => { //获取服务器 XDocument doc = XDocument.Load("Application.config"); var server = doc.Descendants("server").Single(); string serverIP = server.Attribute("ip").Value; int serverPort = int.Parse(server.Attribute("port").Value); //获取客户机 var clients = doc.Descendants("clients").Descendants("client"); //获取本机IPv4地址 string name = Dns.GetHostName(); IPAddress[] ipadrlist = Dns.GetHostAddresses(name); //判断是否包含服务器的IP地址 bool b = ipadrlist.Contains(IPAddress.Parse(serverIP)); if (b) { //如果是服务器才向控制板发送数据 foreach (var controlpad in this.ControlPads) { CameraList.AddRange(controlpad.GetCameras()); try { ControlPad pad = new ControlPad(controlpad.Id, (AlarmInfo[] info, ControlPadState[] states) => { App.Current.Dispatcher.Invoke(() => { //对于5个信息区都进行搜索,不判断标志位 for (int i = 0; i < 5; i++) { if (!IsEmpty(info[i])) { if (controlpad != null) { var camera = CameraList.SingleOrDefault(c => c.Id == info[i].CameraNo && c.ControlPadNo == controlpad.Id); if (camera != null) { info[i].CameraName = camera.Name; } } AlarmInfos.Insert(0, info[i]); //始终保持界面上的报警记录不得多于50条 if (AlarmInfos.Count == 50 + 1) { AlarmInfos.RemoveAt(AlarmInfos.Count - 1); } //向报警器串口发送命令 Task.Run(() => { alarmLamp.AlarmMusicAndFlash(); Thread.Sleep(2000); alarmLamp.StopAllAlarm(); }); CurrentItem = info[i]; //向其他客户机发送报警数据 if (clients.Count() > 0) { foreach (var client in clients) { string IP = client.Attribute("ip").Value; int port = int.Parse(client.Attribute("port").Value); if (IP != serverIP) { UdpComm comm = new UdpComm(IP, port); XmlSerializer xs = new XmlSerializer(typeof(AlarmInfo)); var ms = new MemoryStream(); xs.Serialize(ms, CurrentItem); comm.SendData(ms.ToArray()); ms.Close(); ms.Dispose(); } } } //写入数据库 ope.Add(ope.AlarmInfoToAlarmInfoForDB(controlpad.Id, controlpad.Name, info[i])); } } }); }); } catch (Exception ex) { App.Current.Dispatcher.Invoke(() => { ModernDialog.ShowMessage(ex.Message, "提示", MessageBoxButton.OK); }); } } } else { //如果不是服务器,开启线程来接受服务器发来的报警信息 Task.Run(() => { //先找到本机的IP和端口 foreach (var client in clients) { string IP = client.Attribute("ip").Value; int port = int.Parse(client.Attribute("port").Value); if (ipadrlist.Contains(IPAddress.Parse(IP))) { //找到本机 Task.Run(() => { UdpComm comm = new UdpComm(port); XmlSerializer xs = new XmlSerializer(typeof(AlarmInfo)); while (true) { byte[] data = comm.Receive(serverIP, serverPort); App.Current.Dispatcher.Invoke(() => { using (var ms = new MemoryStream()) { ms.Write(data, 0, data.Length); ms.Position = 0; AlarmInfos.Add(xs.Deserialize(ms) as AlarmInfo); } }); } }); break; } } }); } }); }