コード例 #1
0
        public BacnetAddress(BacnetAddressTypes type, string address)
            : this(type, 0, null)
        {
            switch (type)
            {
            case BacnetAddressTypes.IP:
                var addressParts = address.Split(':');
                var addressBytes = IPAddress.Parse(addressParts[0]).GetAddressBytes();
                Array.Copy(addressBytes, adr, addressBytes.Length);

                var portBytes = BitConverter.GetBytes(ushort.Parse(addressParts[1]));

                if (BitConverter.IsLittleEndian)
                {
                    portBytes = portBytes.Reverse().ToArray();
                }

                Array.Copy(portBytes, 0, adr, addressBytes.Length, portBytes.Length);
                break;

            case BacnetAddressTypes.Ethernet:
                adr = PhysicalAddress.Parse(address).GetAddressBytes();
                break;
            }
        }
コード例 #2
0
        public string ToString(BacnetAddressTypes addressType)
        {
            while (true)
            {
                switch (addressType)
                {
                case BacnetAddressTypes.IP:
                    return(adr != null && adr.Length >= 6
                            ? $"{adr[0]}.{adr[1]}.{adr[2]}.{adr[3]}:{(adr[4] << 8) | adr[5]}"
                            : "0.0.0.0");

                case BacnetAddressTypes.MSTP:
                    return(adr != null && adr.Length >= 1
                            ? $"{adr[0]}"
                            : "-1");

                case BacnetAddressTypes.PTP:
                    return("x");

                case BacnetAddressTypes.Ethernet:
                    return($"{new PhysicalAddress(adr)}");

                case BacnetAddressTypes.IPV6:
                    return(adr != null && adr.Length == 18
                            ? $"{new IPAddress(adr.Take(16).ToArray())}:{(adr[16] << 8) | adr[17]}"
                            : "[::]");

                default:     // Routed @ are always like this, NPDU do not contains the MAC type, only the lenght
                    if (adr == null)
                    {
                        return("?");
                    }

                    switch (adr.Length)
                    {
                    case 6:         // certainly IP, but not sure (Newron System send it for internal usage with 4*0 bytes)
                        addressType = BacnetAddressTypes.IP;
                        continue;

                    case 18:         // Not sure it could appears, since NPDU may contains Vmac ?
                        addressType = BacnetAddressTypes.IPV6;
                        continue;

                    case 3:
                        return($"IPv6 VMac : {adr[0] << 16 | (adr[1] << 8) | adr[2]}");

                    default:
                        return(string.Join(" ", adr));
                    }
                }
            }
        }
コード例 #3
0
        public BacnetAddress(BacnetAddressTypes type, String s)
        {
            this.type = type;
            switch (type)
            {
            case BacnetAddressTypes.IP:
                try
                {
                    var       IpStrCut = s.Split(':');
                    IPAddress ip;
                    var       IsIP = IPAddress.TryParse(IpStrCut[0], out ip);
                    uint      Port = Convert.ToUInt16(IpStrCut[1]);
                    if (IsIP)
                    {
                        var Cut = IpStrCut[0].Split('.');
                        adr = new byte[6];
                        for (var i = 0; i < 4; i++)
                        {
                            adr[i] = Convert.ToByte(Cut[i]);
                        }
                        adr[4] = (byte)((Port & 0xff00) >> 8);
                        adr[5] = (byte)(Port & 0xff);
                    }
                    else
                    {
                        throw new Exception();
                    }
                }
                catch { throw new Exception(); }
                break;

            case BacnetAddressTypes.Ethernet:
                try
                {
                    var EthStrCut = s.Split('-');
                    adr = new byte[6];
                    for (var i = 0; i < 6; i++)
                    {
                        adr[i] = Convert.ToByte(EthStrCut[i], 16);
                    }
                }
                catch { throw new Exception(); }
                break;
            }
        }
コード例 #4
0
ファイル: BacnetAddress.cs プロジェクト: vberkaltun/BACnet
        public BacnetAddress(BacnetAddressTypes addressType, string address = null, ushort network = 0)
            : this(addressType, network)
        {
            if (address == null)
            {
                return;
            }

            switch (type)
            {
            case BacnetAddressTypes.IP:
                adr = new byte[6];
                var addressParts = address.Split(':');
                var addressBytes = IPAddress.Parse(addressParts[0]).GetAddressBytes();
                Array.Copy(addressBytes, adr, addressBytes.Length);

                var portBytes = BitConverter.GetBytes(addressParts.Length > 1
                                                ? ushort.Parse(addressParts[1])
                                                : (ushort)0xBAC0);

                if (BitConverter.IsLittleEndian)
                {
                    portBytes = portBytes.Reverse().ToArray();
                }

                Array.Copy(portBytes, 0, adr, addressBytes.Length, portBytes.Length);
                break;

            case BacnetAddressTypes.Ethernet:
                adr = PhysicalAddress.Parse(address).GetAddressBytes();
                break;

            default:
                throw new NotSupportedException("String format is not supported for address type " + type);
            }
        }
コード例 #5
0
 public BacnetAddress(BacnetAddressTypes type, ushort network, byte[] address)
 {
     this.type = type;
     net       = network;
     adr       = address ?? new byte[0];
 }
コード例 #6
0
ファイル: BacnetAddress.cs プロジェクト: vberkaltun/BACnet
 public BacnetAddress(BacnetAddressTypes addressType, ushort network = 0, byte[] address = null)
 {
     type = addressType;
     net  = network;
     adr  = address;
 }
コード例 #7
0
        public string ToString(BacnetAddressTypes type)
        {
            switch (type)
            {
            case BacnetAddressTypes.IP:
                if (adr == null || adr.Length < 6)
                {
                    return("0.0.0.0");
                }
                return(adr[0] + "." + adr[1] + "." + adr[2] + "." + adr[3] + ":" + ((adr[4] << 8) | (adr[5] << 0)));

            case BacnetAddressTypes.MSTP:
                if (adr == null || adr.Length < 1)
                {
                    return("-1");
                }
                return(adr[0].ToString());

            case BacnetAddressTypes.PTP:
                return("x");

            case BacnetAddressTypes.Ethernet:
                var sb1 = new StringBuilder();
                for (var i = 0; i < 6; i++)
                {
                    sb1.Append(adr[i].ToString("X2"));
                    if (i != 5)
                    {
                        sb1.Append('-');
                    }
                }

                return(sb1.ToString());

            case BacnetAddressTypes.IPV6:
                if (adr == null || adr.Length != 18)
                {
                    return("[::]");
                }
                var port = (ushort)((adr[16] << 8) | (adr[17] << 0));
                var Ipv6 = new byte[16];
                Array.Copy(adr, Ipv6, 16);
                var ep = new IPEndPoint(new IPAddress(Ipv6), port);
                return(ep.ToString());

            default:     // Routed @ are always like this, NPDU do not contains the MAC type, only the lenght
                if (adr == null)
                {
                    return("?");
                }

                if (adr.Length == 6)     // certainly IP, but not sure (Newron System send it for internal usage with 4*0 bytes)
                {
                    return(ToString(BacnetAddressTypes.IP));
                }

                if (adr.Length == 18)       // Not sure it could appears, since NPDU may contains Vmac ?
                {
                    return(ToString(BacnetAddressTypes.IPV6));
                }

                if (adr.Length == 3)
                {
                    return("IPv6 VMac : " + (adr[0] << 16 | (adr[1] << 8) | adr[2]));
                }

                var sb2 = new StringBuilder();
                for (var i = 0; i < adr.Length; i++)
                {
                    sb2.Append(adr[i] + " ");
                }
                return(sb2.ToString());
            }
        }
コード例 #8
0
 public BacnetAddress()
 {
     type = BacnetAddressTypes.None;
 }
コード例 #9
0
 public BacnetAddress(BacnetAddressTypes type, UInt16 net, byte[] adr)
 {
     this.type = type;
     this.net  = net;
     this.adr  = adr ?? new byte[0];
 }