/// <summary> /// Convert message to raw udp data /// </summary> /// <returns>Raw udp data</returns> public byte[] Write() { try { Log.Info("{0} Write,{2}{1}{2}", nameof(MndpMessage), this.ToString(), Environment.NewLine); var tlvMessage = new TlvMessage() { Type = this.Type, Ttl = this.Ttl, Sequence = this.Sequence }; var enc = Encoding.GetEncoding(28591); for (ushort i = 0; i <= 16; i++) { switch (i) { case TLV_TYPE_MAC_ADDRESS: tlvMessage.Items.Add(new Tlv(i, PhysicalAddress.Parse(this.MacAddress).GetAddressBytes())); break; case TLV_TYPE_IDENTITY: tlvMessage.Items.Add(new Tlv(i, this.Identity, enc)); break; case TLV_TYPE_VERSION: tlvMessage.Items.Add(new Tlv(i, this.Version, enc)); break; case TLV_TYPE_PLATFORM: tlvMessage.Items.Add(new Tlv(i, this.Platform, enc)); break; case TLV_TYPE_UPTIME: tlvMessage.Items.Add(new Tlv(i, (uint)this.Uptime.TotalSeconds)); break; case TLV_TYPE_SOFTWAREID: tlvMessage.Items.Add(new Tlv(i, this.SoftwareId, enc)); break; case TLV_TYPE_BOARD_NAME: tlvMessage.Items.Add(new Tlv(i, this.BoardName, enc)); break; case TLV_TYPE_UNPACK: tlvMessage.Items.Add(new Tlv(i, new byte[] { this.Unpack })); break; case TLV_TYPE_INTERFACE_NAME: tlvMessage.Items.Add(new Tlv(i, this.InterfaceName, enc)); break; case TLV_TYPE_IPV6: if (this.UnicastIPv6Address != null) { tlvMessage.Items.Add(new Tlv(i, IPAddress.Parse(this.UnicastIPv6Address).GetAddressBytes())); } break; default: break; } } bool ok = tlvMessage.Write(out byte[] data); if (!ok) { return(null); } return(data); } catch (Exception ex) { Log.Exception(nameof(MndpMessage), nameof(Write), ex); } return(null); }
/// <summary> /// Parse from raw udp data bytes /// </summary> /// <param name="data">raw udp data</param> /// <returns>Parse is sucess?</returns> public bool Read(byte[] data) { try { var tlvMessage = new TlvMessage(); bool ok = tlvMessage.Read(data); if (!ok) { return(false); } var enc = Encoding.GetEncoding(28591); this.Type = tlvMessage.Type; this.Ttl = tlvMessage.Ttl; this.Sequence = tlvMessage.Sequence; foreach (var i in tlvMessage.Items) { switch (i.Type) { case TLV_TYPE_MAC_ADDRESS: this.MacAddress = new PhysicalAddress(i.Value).ToString(); break; case TLV_TYPE_IDENTITY: this.Identity = enc.GetString(i.Value); break; case TLV_TYPE_VERSION: this.Version = enc.GetString(i.Value); break; case TLV_TYPE_PLATFORM: this.Platform = enc.GetString(i.Value); break; case TLV_TYPE_UPTIME: this.Uptime = TimeSpan.FromSeconds(BitConverter.ToUInt32(i.Value, 0)); break; case TLV_TYPE_SOFTWAREID: this.SoftwareId = enc.GetString(i.Value); break; case TLV_TYPE_BOARD_NAME: this.BoardName = enc.GetString(i.Value); break; case TLV_TYPE_UNPACK: this.Unpack = i.Value[0]; break; case TLV_TYPE_INTERFACE_NAME: this.InterfaceName = enc.GetString(i.Value); break; case TLV_TYPE_IPV6: this.UnicastIPv6Address = new IPAddress(i.Value).ToString(); break; default: break; } } Log.Info("{0} Read,{2}{1}{2}", nameof(MndpMessage), this.ToString(), Environment.NewLine); return(true); } catch (Exception ex) { Log.Exception(nameof(MndpMessage), nameof(Read), ex); } return(false); }