예제 #1
0
        /// <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);
        }
예제 #2
0
        /// <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);
        }