示例#1
0
        protected override byte[] CreateActionDatagram(KnxAddress destinationAddress, byte[] data)
        {
            lock (KnxConnectionTunneling.SequenceNumberLock)
            {
                try
                {
                    var dataLength = KnxHelper.GetDataLength(data);

                    // HEADER
                    var datagram = new byte[10];
                    datagram[00] = 0x06;
                    datagram[01] = 0x10;
                    datagram[02] = 0x04;
                    datagram[03] = 0x20;

                    var totalLength = BitConverter.GetBytes(dataLength + 20);
                    datagram[04] = totalLength[1];
                    datagram[05] = totalLength[0];

                    datagram[06] = 0x04;
                    datagram[07] = KnxConnectionTunneling.ChannelId;
                    datagram[08] = KnxConnectionTunneling.GenerateSequenceNumber();
                    datagram[09] = 0x00;

                    return(CreateActionDatagramCommon(destinationAddress, data, datagram));
                }
                catch
                {
                    KnxConnectionTunneling.RevertSingleSequenceNumber();

                    return(null);
                }
            }
        }
示例#2
0
        protected override byte[] CreateRequestStatusDatagram(KnxAddress destinationAddress)
        {
            lock (KnxConnectionTunneling.SequenceNumberLock)
            {
                try
                {
                    // HEADER
                    var datagram = new byte[21];
                    datagram[00] = 0x06;
                    datagram[01] = 0x10;
                    datagram[02] = 0x04;
                    datagram[03] = 0x20;
                    datagram[04] = 0x00;
                    datagram[05] = 0x15;

                    datagram[06] = 0x04;
                    datagram[07] = KnxConnectionTunneling.ChannelId;
                    datagram[08] = KnxConnectionTunneling.GenerateSequenceNumber();
                    datagram[09] = 0x00;

                    return(CreateRequestStatusDatagramCommon(destinationAddress, datagram, 10));
                }
                catch
                {
                    KnxConnectionTunneling.RevertSingleSequenceNumber();

                    return(null);
                }
            }
        }
示例#3
0
        /// <summary>
        ///     Send an int value as data to specified address
        /// </summary>
        /// <param name="address">KNX Address</param>
        /// <param name="data">Int value</param>
        /// <exception cref="InvalidKnxDataException"></exception>
        public void Action(KnxAddress address, int data)
        {
            var val = new byte[2];

            if (data <= 255)
            {
                val[0] = 0x00;
                val[1] = (byte)data;
            }
            else if (data <= 65535)
            {
                val[0] = (byte)data;
                val[1] = (byte)(data >> 8);
            }
            else
            {
                // allowing only positive integers less than 65535 (2 bytes), maybe it is incorrect...???
                throw new InvalidKnxDataException(data.ToString());
            }

            if (val == null)
            {
                throw new InvalidKnxDataException(data.ToString());
            }

            Action(address, val);
        }
示例#4
0
 internal KnxControlField2(KnxAddress address)
 {
     if (address is KnxGroupAddress)
     {
         DestinationAddressType = KnxDestinationAddressType.Group;
         HopCount = DEFAULT_HOP_COUNT_GROUP;
     }
 }
示例#5
0
 internal KnxStatusArgs(
     KnxAddress sourceAddress,
     KnxAddress destinationAddress,
     KnxControlField1 controlField1,
     KnxControlField2 controlField2,
     byte[] state) : base(sourceAddress, destinationAddress, controlField1, controlField2, state)
 {
 }
示例#6
0
        /// <summary>
        ///     Send a request to KNX asking for specified address current status
        /// </summary>
        /// <param name="address"></param>
        public void RequestStatus(KnxAddress address)
        {
            Logger.Debug(ClassName, "Sending request status to {0}.", address);

            _lockManager.PerformLockedOperation(() => KnxSender.RequestStatus(address));

            Logger.Debug(ClassName, "Sent request status to {0}.", address);
        }
示例#7
0
        public void SetValue_InputValue_ExpectedBusDeviceSet(byte[] input, int expected)
        {
            KnxAddress addr = new KnxAddress()
            {
                Value = input
            };

            Assert.Equal(expected, addr.BusDevice);
        }
示例#8
0
        public void SetValue_InputValue_ExpectedAreaSet(byte[] input, int expected)
        {
            KnxAddress addr = new KnxAddress()
            {
                Value = input
            };

            Assert.Equal(expected, addr.Area);
        }
示例#9
0
 public DIBDeviceInfo(byte descriptionType, KnxMedium knxMedium, DeviceStatus deviceStatus, KnxAddress knxAddress, ProjectInstallationIdentifier projectInstallationIdentifier, sbyte[] knxNetIpDeviceSerialNumber, IPAddress knxNetIpDeviceMulticastAddress, MACAddress knxNetIpDeviceMacAddress, sbyte[] deviceFriendlyName)
 {
     DescriptionType = descriptionType;
     KnxMedium       = knxMedium;
     DeviceStatus    = deviceStatus;
     KnxAddress      = knxAddress;
     ProjectInstallationIdentifier  = projectInstallationIdentifier;
     KnxNetIpDeviceSerialNumber     = knxNetIpDeviceSerialNumber;
     KnxNetIpDeviceMulticastAddress = knxNetIpDeviceMulticastAddress;
     KnxNetIpDeviceMacAddress       = knxNetIpDeviceMacAddress;
     DeviceFriendlyName             = deviceFriendlyName;
 }
示例#10
0
 internal KnxEventArgs(
     KnxAddress sourceAddress,
     KnxAddress destinationAddress,
     KnxControlField1 controlField1,
     KnxControlField2 controlField2,
     byte[] state)
 {
     SourceAddress      = sourceAddress;
     DestinationAddress = destinationAddress;
     ControlField1      = controlField1;
     ControlField2      = controlField2;
     State = state;
 }
        public KnxNetIpConnectionString(string connectionString) : this()
        {
            try
            {
                var str     = connectionString.Trim('{', '}');
                var kvpairs = str.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries);

                foreach (var kv in kvpairs)
                {
                    if (kv.Contains("InternalUrl"))
                    {
                        InternalAddress = kv.Split('=')[1];
                    }
                    if (kv.Contains("ExternalUrl"))
                    {
                        ExternalAddress = kv.Split('=')[1];
                    }
                    if (kv.Contains("InternalProtocol"))
                    {
                        Enum.TryParse(kv.Split('=')[1], true, out _internalProtocol);
                    }
                    if (kv.Contains("ExternalProtocol"))
                    {
                        Enum.TryParse(kv.Split('=')[1], true, out _externalProtocol);
                    }
                    if (kv.Contains("InternalConnectionReleaseDelay"))
                    {
                        Enum.TryParse(kv.Split('=')[1], true, out _internalConnectionReleaseDelay);
                    }
                    if (kv.Contains("ExternalConnectionReleaseDelay"))
                    {
                        Enum.TryParse(kv.Split('=')[1], true, out _externalConnectionReleaseDelay);
                    }
                    if (kv.Contains("InternalMulticastUrl"))
                    {
                        InternalMulticastUrl = kv.Split('=')[1];
                    }
                    if (kv.Contains("DeviceAddress"))
                    {
                        var da = KnxAddress.ParseDevice(kv.Split('=')[1]);
                        DeviceMain   = da.Area;
                        DeviceMiddle = da.Line;
                        DeviceSub    = da.Device;
                    }
                }
            }
            catch (Exception exception)
            {
                throw new ArgumentException("ConnectionString is not formated correctly.", exception);
            }
        }
示例#12
0
 public CEMIFrameData(bool repeated, CEMIPriority priority, bool acknowledgeRequested, bool errorFlag, KnxAddress sourceAddress, sbyte[] destinationAddress, bool groupAddress, byte hopCount, byte dataLength, TPCI tcpi, byte counter, APCI apci, sbyte dataFirstByte, sbyte[] data, byte crc)
     : base(repeated, priority, acknowledgeRequested, errorFlag)
 {
     SourceAddress      = sourceAddress;
     DestinationAddress = destinationAddress;
     GroupAddress       = groupAddress;
     HopCount           = hopCount;
     DataLength         = dataLength;
     Tcpi          = tcpi;
     Counter       = counter;
     Apci          = apci;
     DataFirstByte = dataFirstByte;
     Data          = data;
     Crc           = crc;
 }
示例#13
0
        protected override byte[] CreateRequestStatusDatagram(KnxAddress destinationAddress)
        {
            // TODO: Test this

            // HEADER
            var datagram = new byte[17];

            datagram[00] = 0x06;
            datagram[01] = 0x10;
            datagram[02] = 0x05;
            datagram[03] = 0x30;
            datagram[04] = 0x00;
            datagram[05] = 0x11;

            return(CreateRequestStatusDatagramCommon(destinationAddress, datagram, 6));
        }
示例#14
0
        /// <summary>
        ///     Send a byte array value as data to specified address
        /// </summary>
        /// <param name="address">KNX Address</param>
        /// <param name="data">Byte array value</param>
        /// <param name="addTruncateByte">adds extra byte to chop off for payload</param>
        public void Action(KnxAddress address, byte[] data, bool addTruncateByte = true)
        {
            if (addTruncateByte)
            {
                // reverse bytes temporary to add byte in front
                Array.Reverse(data);
                Array.Resize(ref data, data.Length + 1);
                data[data.Length - 1] = 0x00;
                Array.Reverse(data);
            }

            Logger.Debug(ClassName, "Sending 0x{0} to {1}.", BitConverter.ToString(data), address);

            _lockManager.PerformLockedOperation(() => KnxSender.Action(address, data));

            Logger.Debug(ClassName, "Sent 0x{0} to {1}.", BitConverter.ToString(data), address);
        }
示例#15
0
        protected override byte[] CreateActionDatagram(KnxAddress destinationAddress, byte[] data)
        {
            var dataLength = KnxHelper.GetDataLength(data);

            // HEADER
            var datagram = new byte[6];

            datagram[0] = 0x06;
            datagram[1] = 0x10;
            datagram[2] = 0x05;
            datagram[3] = 0x30;
            var totalLength = BitConverter.GetBytes(dataLength + 16);

            datagram[4] = totalLength[1];
            datagram[5] = totalLength[0];

            return(CreateActionDatagramCommon(destinationAddress, data, datagram));
        }
示例#16
0
        /// <summary>
        ///     Send a string value as data to specified address
        /// </summary>
        /// <param name="address">KNX Address</param>
        /// <param name="data">String value</param>
        /// <exception cref="InvalidKnxDataException"></exception>
        public void Action(KnxAddress address, string data)
        {
            byte[] val;
            try
            {
                val = Encoding.ASCII.GetBytes(data);
            }
            catch
            {
                throw new InvalidKnxDataException(data);
            }

            if (val == null)
            {
                throw new InvalidKnxDataException(data);
            }

            Action(address, val);
        }
示例#17
0
        /// <summary>
        ///     Send a bit value as data to specified address
        /// </summary>
        /// <param name="address">KNX Address</param>
        /// <param name="data">Bit value</param>
        /// <exception cref="InvalidKnxDataException"></exception>
        public void Action(KnxAddress address, bool data)
        {
            byte[] val;

            try
            {
                val = new[] { Convert.ToByte(data) };
            }
            catch
            {
                throw new InvalidKnxDataException(data.ToString());
            }

            if (val == null)
            {
                throw new InvalidKnxDataException(data.ToString());
            }

            Action(address, val, addTruncateByte: false);
        }
示例#18
0
        public void ParseAddressTest()
        {
            var address = KnxAddress.ParseLogical("1/2/3");

            Assert.IsNotNull(address);

            address = KnxAddress.ParseLogical("15-7/3");
            Assert.IsNotNull(address);

            address = KnxAddress.ParseLogical("15-7-255");
            Assert.IsNotNull(address);

            try
            {
                address = KnxAddress.ParseLogical("hello world");
                Assert.Fail("Exception should be trown.");
            }
            catch (FormatException)
            {
            }
        }
示例#19
0
 public CEMIDataFrame(bool standardFrame, bool polling, bool notRepeated, bool notAckFrame, CEMIPriority priority, bool acknowledgeRequested, bool errorFlag, bool groupDestinationAddress, byte hopCount, byte extendedFrameFormat, KnxAddress sourceAddress, sbyte[] destinationAddress, byte dataLength, TPCI tcpi, byte counter, APCI apci, sbyte dataFirstByte, sbyte[] data)
 {
     StandardFrame           = standardFrame;
     Polling                 = polling;
     NotRepeated             = notRepeated;
     NotAckFrame             = notAckFrame;
     Priority                = priority;
     AcknowledgeRequested    = acknowledgeRequested;
     ErrorFlag               = errorFlag;
     GroupDestinationAddress = groupDestinationAddress;
     HopCount                = hopCount;
     ExtendedFrameFormat     = extendedFrameFormat;
     SourceAddress           = sourceAddress;
     DestinationAddress      = destinationAddress;
     DataLength              = dataLength;
     Tcpi          = tcpi;
     Counter       = counter;
     Apci          = apci;
     DataFirstByte = dataFirstByte;
     Data          = data;
 }
示例#20
0
 private static void Status(KnxConnection connection, KnxAddress address, byte[] state) => Print(connection, address, state);
示例#21
0
 /// <summary>
 ///     Send a byte value as data to specified address
 /// </summary>
 /// <param name="address">KNX Address</param>
 /// <param name="data">byte value</param>
 public void Action(KnxAddress address, byte data)
 {
     Action(address, new byte[] { 0x00, data });
 }
示例#22
0
 public ConnectionResponseDataBlockTunnelConnection(KnxAddress knxAddress)
 {
     KnxAddress = knxAddress;
 }
        public async Task SendKnxMessage()
        {
            var target = new KnxNetIpTunnelingClient(new IPEndPoint(IPAddress.Parse("10.10.10.11"), 3671), KnxAddress.Device(1, 1, 2));

            try
            {
                await target.Connect();

                var message = new KnxMessage
                {
                    MessageType               = MessageType.Write,
                    MessageCode               = MessageCode.Request,
                    Priority                  = MessagePriority.Auto,
                    SourceAddress             = new KnxDeviceAddress(1, 1, 2),
                    DestinationAddress        = new KnxLogicalAddress(1, 1, 28),
                    TransportLayerControlInfo = TransportLayerControlInfo.UnnumberedDataPacket,
                    DataPacketCount           = 0,
                    Payload = new DptBoolean(false).Payload
                };

                await target.SendMessage(message);

                // test for simpler SendMessage calls
                //target.Write(KnxAddress.Logical(9, 3, 0), (new DptTime(new TimeSpan(13, 36, 00), DayOfWeek.Monday)));
            }
            finally
            {
                target.Dispose();
            }
        }
 public async Task ConnectTest()
 {
     using (var target = new KnxNetIpTunnelingClient(new IPEndPoint(IPAddress.Parse("10.10.10.11"), 3671), KnxAddress.Device(1, 1, 2)))
     {
         await target.Connect();
     }
 }
示例#25
0
        private static void Print(KnxConnection connection, KnxAddress knxAddress, byte[] state)
        {
            const int categoryWidth    = 15;
            const int descriptionWidth = -60;

            var address = knxAddress.ToString();

            if (Switches.TryGetValue(address, out var description))
            {
                var functionalToggle = Category1_SingleBit.parseSingleBit(state[0]);
                Console.WriteLine($"{"[ON/OFF]", categoryWidth} {description, descriptionWidth} ({(functionalToggle.Exists() ? functionalToggle.Value.Text : "N/A")})");
            }
            else if (Toggles.TryGetValue(address, out description))
            {
                var functionalToggle = Category1_SingleBit.parseSingleBit(state[0]);
                Console.WriteLine($"{"[TRUE/FALSE]", categoryWidth} {description, descriptionWidth} ({(functionalToggle.Exists() ? functionalToggle.Value.Text : "N/A")})");
            }
            else if (Percentages.TryGetValue(address, out description))
            {
                var functionalPercentage = Category5_Scaling.parseScaling(0, 100, state[0]);
                Console.WriteLine($"{"[PERCENTAGE]", categoryWidth} {description, descriptionWidth} ({functionalPercentage} %)");
            }
            else if (Duration.TryGetValue(address, out description))
            {
                var functionalDuration = Category7_2ByteUnsignedValue.parseTwoByteUnsigned(1, state[0], state[1]);
                Console.WriteLine($"{"[DURATION]", categoryWidth} {description, descriptionWidth} ({functionalDuration} h)");
            }
            else if (Current.TryGetValue(address, out description))
            {
                var functionalCurrent = Category7_2ByteUnsignedValue.parseTwoByteUnsigned(1, state[0], state[1]);
                Console.WriteLine($"{"[ENERGY]", categoryWidth} {description, descriptionWidth} ({functionalCurrent} mA)");
            }
            else if (Temperatures.TryGetValue(address, out description))
            {
                var temp           = connection.FromDataPoint("9.001", state); // (decimal)
                var functionalTemp = Category9_2ByteFloatValue.parseTwoByteFloat(state[0], state[1]);
                Console.WriteLine($"{"[TEMP]", categoryWidth} {description, descriptionWidth} (C#: {temp} °C) (F#: {functionalTemp} °C)");
            }
            else if (LightStrength.TryGetValue(address, out description))
            {
                var functionalLightStrength = Category9_2ByteFloatValue.parseTwoByteFloat(state[0], state[1]);
                Console.WriteLine($"{"[LUX]", categoryWidth} {description, descriptionWidth} ({functionalLightStrength} Lux)");
            }
            else if (Times.TryGetValue(address, out description))
            {
                var functionalTime = Category10_Time.parseTime(state[0], state[1], state[2]);
                Console.WriteLine($"{"[TIME]", categoryWidth} {description, descriptionWidth} ({(functionalTime.Item1.Exists() ? functionalTime.Item1.Value.Text : string.Empty)}, {functionalTime.Item2:c})");
            }
            else if (EnergyWattHour.TryGetValue(address, out description))
            {
                var wattHour           = connection.FromDataPoint("13.010", state); // (int)
                var functionalWattHour = Category13_4ByteSignedValue.parseFourByteSigned(state[0], state[1], state[2], state[3]);
                Console.WriteLine($"{"[ENERGY]", categoryWidth} {description, descriptionWidth} (C#: {wattHour} Wh) (F#: {functionalWattHour} Wh)");
            }
            else if (Dates.TryGetValue(address, out description))
            {
                var date           = (DateTime)connection.FromDataPoint("11.001", state); // (DateTime)
                var functionalDate = Category11_Date.parseDate(state[0], state[1], state[2]);
                Console.WriteLine($"{"[DATE]", categoryWidth} {description, descriptionWidth} (C#: {date:dd/MM/yyyy}) (F#: {functionalDate:dd/MM/yyyy})");
            }
            else if (Speed.TryGetValue(address, out description))
            {
                var speed           = connection.FromDataPoint("9.005", state); // (decimal)
                var functionalSpeed = Category9_2ByteFloatValue.parseTwoByteFloat(state[0], state[1]);
                Console.WriteLine($"{"[SPEED]",categoryWidth} {description, descriptionWidth} (C#: {speed} m/s) (F#: {functionalSpeed} m/s)");
            }
            else
            {
                _logFile.WriteLine("{0} - {1}", address, BitConverter.ToString(state));
            }
        }