Exemplo n.º 1
0
        private void SendSwitchTelegramToKnxConnection(GroupAddress groupAddress, SwitchMessage switching)
        {
            var cemiFrame = new CemiFrame(CemiFrame.MessageCodes.DataRequest,
                                          CemiFrame.Control1Flags.DoNotRepeat | CemiFrame.Control1Flags.PriorityLow |
                                          CemiFrame.Control1Flags.StandardFrame, CemiFrame.Control2Flags.GroupAddress, IndividualAddress.FromAddressLineDevice(1, 1, 60), groupAddress, 1, (ushort)(0x80 | (switching.SwitchState ? 1 : 0)));

            _knxConnection.SendTunnelingRequest(cemiFrame).Wait();
        }
Exemplo n.º 2
0
        public async Task <byte> SendTunnelingRequest(CemiFrame cemiFrame)
        {
            var sequenceNumber = _sequenceCounter++;
            var telegram       = new KnxTunnelingRequest(ChannelId, sequenceNumber, cemiFrame);
            var ms             = new MemoryStream();

            Serializer.Serialize(telegram, ms);
            _trace.Write(TraceSeverities.Debug, "Sending SendTunnelingRequest: {0}", telegram.ToString());
            await Send(ms, _socket);

            return(sequenceNumber);
        }
Exemplo n.º 3
0
        private static KnxTelegramPayload ParseTunnelingRequest(KnxTelegramHeader arg1, byte[] arg2)
        {
            var dataLength = arg2[18] & 15;
            var cemiFrame  = new CemiFrame(
                (CemiFrame.MessageCodes)arg2[10],
                (CemiFrame.Control1Flags)arg2[12],
                (CemiFrame.Control2Flags)arg2[13],
                IndividualAddress.FromUShort((ushort)((arg2[14] << 8) + arg2[15])),
                GroupAddress.FromUShort((ushort)((arg2[16] << 8) + arg2[17])),
                arg2[18],
                (ushort)((arg2[19] << 8) + arg2[20]), new ArraySegment <byte>(arg2, 21, dataLength == 0 ? 0 : dataLength - 1)); // protect against unknown datagrams with datalength = 0

            return(new KnxTunnelingRequest(arg2[7], arg2[8], cemiFrame));
        }
Exemplo n.º 4
0
        private IMessagePayload CreateBusMessage(KnxAddressBindingTypes bindingType, CemiFrame cemiFrame)
        {
            switch (bindingType)
            {
            case KnxAddressBindingTypes.Switch:
                bool onOff = (cemiFrame.Apdu & 1) == 1;
                return(new SwitchMessage(onOff));

            case KnxAddressBindingTypes.Temperature:
                return(new TemperatureMessage(Dpt9001.BytesToCelsius(new ArraySegment <byte>(cemiFrame.Data.Array, cemiFrame.Data.Offset, cemiFrame.Data.Count))));

                break;

            default:
                throw new ArgumentOutOfRangeException(nameof(bindingType), bindingType, null);
            }
        }
Exemplo n.º 5
0
        private void _knxConnection_KnxEventReceived(KnxConnection arg1, CemiFrame arg2)
        {
            ImmutableList <IMessageBusAddress> entityAddresses;

            if (_mapping.Mapping2.TryGetValue(arg2.DestinationAddress, out entityAddresses))
            {
                KnxAddressBindingTypes bindingType;
                if (_bindingTypes.TryGetValue(arg2.DestinationAddress, out bindingType))
                {
                    var message = CreateBusMessage(bindingType, arg2);
                    foreach (var messageBusAddress in entityAddresses)
                    {
                        _busInlet.Send(messageBusAddress, message);
                    }
                }
            }
        }
Exemplo n.º 6
0
        public static void Serialize(CemiFrame cemiFrame, MemoryStream memoryStream)
        {
            memoryStream.WriteByte((byte)cemiFrame.MessageCode);
            memoryStream.WriteByte(0); // No additional data
            memoryStream.WriteByte((byte)cemiFrame.Control1);
            memoryStream.WriteByte((byte)cemiFrame.Control2);
            memoryStream.WriteByte(0); // Source Address will be filled out by gateway
            memoryStream.WriteByte(0);
            var destinationAddressAsUShort = cemiFrame.DestinationAddress.AsUShort;

            memoryStream.WriteByte((byte)(destinationAddressAsUShort >> 8));
            memoryStream.WriteByte((byte)(destinationAddressAsUShort & 255));
            memoryStream.WriteByte(cemiFrame.DataLength);
            memoryStream.WriteByte((byte)(cemiFrame.Apdu >> 8));
            memoryStream.WriteByte((byte)cemiFrame.Apdu);
            if (cemiFrame.Data.Count != 0)
            {
                memoryStream.Write(cemiFrame.Data.Array, cemiFrame.Data.Offset, cemiFrame.Data.Count);
            }
        }
Exemplo n.º 7
0
 private void OnKnxEventReceived(KnxConnection arg1, CemiFrame arg2)
 {
     KnxEventReceived?.Invoke(arg1, arg2);
 }
Exemplo n.º 8
0
        public static void Main(string[] args)
        {
            // Establish tunneling connection with gateway at 10.0.0.135
            _trace = new ConsoleTrace();
            var connection = new KnxConnection(new IPEndPoint(IPAddress.Parse("10.0.0.102"), 50000), new IPEndPoint(IPAddress.Parse("10.0.0.135"), 3671), _trace);


            var messageBus = new MessageBus();

            var dressingLight = new Entity(messageBus,
                                           new IntegerMessageBusAddress(123),
                                           new[] { new Switch() });

            var button = new Button(new IntegerMessageBusAddress(123));
            var dressingLightButton = new Entity(messageBus, new IntegerMessageBusAddress(456), new[] { button });

            var temperatureGauge      = new TemperatureGauge();
            var temperatureLivingRoom = new Entity(messageBus, new IntegerMessageBusAddress(1001), new[] { temperatureGauge });


            var temperatureGauge2       = new TemperatureGauge();
            var temperatureDressingRoom = new Entity(messageBus, new IntegerMessageBusAddress(1002), new[] { temperatureGauge2 });

            var radio = new Entity(messageBus, new IntegerMessageBusAddress(999), new[] { new Radio() });

            var binding = new KnxBinding(connection, messageBus, new IntegerMessageBusAddress(10000));

            binding.AddSwitch(GroupAddress.FromGroups(0, 0, 6), new IntegerMessageBusAddress(123), KnxAddressBindingTypes.Switch);
            binding.AddSwitch(GroupAddress.FromGroups(0, 4, 0), new IntegerMessageBusAddress(999), KnxAddressBindingTypes.Switch);
            binding.AddSwitch(GroupAddress.FromGroups(0, 3, 21), new IntegerMessageBusAddress(1001), KnxAddressBindingTypes.Temperature);
            binding.AddSwitch(GroupAddress.FromGroups(0, 3, 20), new IntegerMessageBusAddress(1002), KnxAddressBindingTypes.Temperature);

            var test = new Test(temperatureGauge.Temperatures, temperatureGauge2.Temperatures);

            using (RunAsp(test))
            {
                for (;;)
                {
                    var       ck        = Console.ReadKey();
                    CemiFrame cemiFrame = null;
                    if (ck.Key == ConsoleKey.R)
                    {
                        cemiFrame = new CemiFrame(CemiFrame.MessageCodes.DataRequest,
                                                  CemiFrame.Control1Flags.DoNotRepeat | CemiFrame.Control1Flags.PriorityLow |
                                                  CemiFrame.Control1Flags.StandardFrame, CemiFrame.Control2Flags.GroupAddress, IndividualAddress.FromAddressLineDevice(1, 1, 60),
                                                  GroupAddress.FromGroups(0, 0, 6), 1, (ushort)(CemiFrame.Commands.ValueRead) << 6);
                    }
                    else if (ck.Key == ConsoleKey.Escape)
                    {
                        break;
                    }
                    if (cemiFrame != null)
                    {
                        var task = connection.SendTunnelingRequest(cemiFrame);
                        task.Wait();
                        Console.WriteLine("Seq sent: " + task.Result);
                    }
                }
                Console.ReadKey();
                connection.Dispose();
            }
        }
Exemplo n.º 9
0
 public KnxTunnelingRequest(byte channelId, byte sequenceNumber, CemiFrame cemiFrame)
 {
     ChannelId      = channelId;
     SequenceNumber = sequenceNumber;
     CemiFrame      = cemiFrame;
 }