/// <summary> /// 获取用于在数据表信息中显示的键值数据对信息 /// </summary> /// <returns>键值数据对列表</returns> public override List <NodeClassRenderItem> GetNodeClassRenders( ) { var list = base.GetNodeClassRenders( ); list.Add(NodeClassRenderItem.CreateIpAddress(IpAddress)); list.Add(NodeClassRenderItem.CreateIpPort(Port)); list.Add(new NodeClassRenderItem("网络号", NetworkNumber.ToString( ))); list.Add(new NodeClassRenderItem("网络站号", NetworkStationNumber.ToString( ))); list.Add(new NodeClassRenderItem("是否二进制", IsBinary.ToString( ))); return(list); }
public byte[] ToDosFormat() { var bytes = new List <byte>(); bytes.AddRange(DateTime.ToBytes(26)); bytes.AddRange(Signature.ToBytes(4)); bytes.AddRange(PanelNumber.ToBytes()); bytes.AddRange(NetworkNumber.ToBytes()); bytes.AddRange(Version.ToBytes()); bytes.AddRange(MiniVersion.ToBytes()); bytes.AddRange(Reserved); var offset = bytes.Count; for (var i = PointType.OUT; i <= PointType.UNIT; ++i) { if (i == PointType.TZ) { continue; } if (i == PointType.AMON) { if (Version >= 230 && MiniVersion > 0) { continue; } } if (i == PointType.ALARMM) { if (Version < 216) { var size = RawData.ToUInt16(offset); offset += 2; bytes.AddRange(size.ToBytes()); var count = RawData.ToUInt16(offset); offset += 2; bytes.AddRange(count.ToBytes()); for (var j = 0; j < count; ++j) { var data = RawData.ToBytes(offset, size); offset += size; bytes.AddRange(data); } continue; } } else { var count = RawData.ToUInt16(offset); offset += 2; bytes.AddRange(count.ToBytes()); var size = RawData.ToUInt16(offset); offset += 2; bytes.AddRange(size.ToBytes()); for (var j = 0; j < count; ++j) { var data = RawData.ToBytes(offset, size); offset += size; switch (i) { case PointType.VAR: bytes.AddRange(Variables[j].ToBytes()); break; case PointType.UNIT: bytes.AddRange(CustomUnits.Digital[j].ToBytes()); break; default: bytes.AddRange(data); break; } } } } //Append raw data from file. bytes.AddRange(RawData.ToBytes(bytes.Count, RawData.Length - bytes.Count)); return(bytes.ToArray()); }
/// <summary> /// 尝试搜寻目前局域网内的所有设备。 /// </summary> /// <exception cref="TimeoutException">等待线程结束超时。</exception> public void ScanForTarget() { // 获取当前设备 var device = DeviceList[CurDevName]; // 创建分析线程 const int analyzeThreadsCount = 4; var analyzeThreads = new Thread[analyzeThreadsCount]; for (var i = 0; i < analyzeThreadsCount; i++) { analyzeThreads[i] = new Thread(ScanPacketAnalyzeThread); } // 创建发包线程队列 var sendThreads = new List <Thread>(); try { // arp头起始位置向后偏移6字节后,取2字节内容即为arp包类型 device = StartCapture("arp [6:2] = 2"); // 启动分析线程 for (var i = 0; i < analyzeThreadsCount; i++) { analyzeThreads[i].Start(); } // 去除网络号和广播地址,产生地址集合 byte[] minAddress = NetworkNumber.GetAddressBytes(), maxAddress = BroadcastAddress.GetAddressBytes(), tempAddress = minAddress; var ipAddresses = new List <IPAddress>(); tempAddress[3]++; while (!(tempAddress[0] == maxAddress[0] && tempAddress[1] == maxAddress[1] && tempAddress[2] == maxAddress[2] && tempAddress[3] == maxAddress[3])) { ipAddresses.Add(new IPAddress(tempAddress)); if (ipAddresses.Count >= (AddressCount / 8 >= 254 ? 254 : AddressCount / 8)) { // 创建发包线程 var sendThread = new Thread(ScanPacketSendThread); sendThread.Start(ipAddresses); sendThreads.Add(sendThread); ipAddresses = new List <IPAddress>(); } var i = 3; while (i >= 0 && tempAddress[i] == 255) { tempAddress[i] = 0; i--; } tempAddress[i]++; } // 最后一个发送线程 var lastSendThread = new Thread(ScanPacketSendThread); lastSendThread.Start(ipAddresses); sendThreads.Add(lastSendThread); // 等待数据包发送完成 new WaitTimeoutChecker((int)(60 * 1000 * Math.Log(AddressCount, 254))).ThreadSleep(500, () => sendThreads.Any(item => item.IsAlive)); // 等待接收目标机反馈消息 Thread.Sleep((int)(8 * 1000 * Math.Log(AddressCount, 254))); } finally { // 终止发包线程 foreach (var sendThread in sendThreads) { if (sendThread.IsAlive) { sendThread.Abort(); } } // 终止分析线程 foreach (var analyzeThread in analyzeThreads) { if (analyzeThread.IsAlive) { analyzeThread.Abort(); } } // 清理缓冲区及其他内容 lock (_hostList) { _hostList.Sort(Host.SortMethod); } StopCapture(device); ClearCaptures(); } }