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; } }
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)); } } } }
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; } }
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); } }
public BacnetAddress(BacnetAddressTypes type, ushort network, byte[] address) { this.type = type; net = network; adr = address ?? new byte[0]; }
public BacnetAddress(BacnetAddressTypes addressType, ushort network = 0, byte[] address = null) { type = addressType; net = network; adr = address; }
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()); } }
public BacnetAddress() { type = BacnetAddressTypes.None; }
public BacnetAddress(BacnetAddressTypes type, UInt16 net, byte[] adr) { this.type = type; this.net = net; this.adr = adr ?? new byte[0]; }