コード例 #1
0
        private byte[] CreateRequestStatusDatagram(string destinationAddress)
        {
            lock (this.SequenceNumberLock)
            {
                byte newSequenceNumber = this.GenerateSequenceNumber();
                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] = this.ChannelId;
                    datagram[08] = newSequenceNumber;
                    datagram[09] = 0x00;

                    return(DatagramProcessing.CreateRequestStatusDatagramCommon(destinationAddress, datagram, 10, this.ActionMessageCode));
                }
                catch
                {
                    this.RevertSingleSequenceNumber();

                    return(null);
                }
            }
        }
コード例 #2
0
        public async void SendTunnelingAck(byte sequenceNumber)
        {
            // HEADER
            var datagram = DatagramProcessing.CreateTunnelingAck(sequenceNumber, this.ChannelId);

            await this.SendData(datagram);
        }
コード例 #3
0
        private byte[] CreateActionDatagram(string destinationAddress, byte[] data)
        {
            lock (this.SequenceNumberLock)
            {
                byte newSequenceNumber = this.GenerateSequenceNumber();
                try
                {
                    var dataLength = DataProcessing.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] = this.ChannelId;
                    datagram[08] = newSequenceNumber;
                    datagram[09] = 0x00;

                    return(DatagramProcessing.CreateActionDatagramCommon(destinationAddress, data, datagram, this.ActionMessageCode));
                }
                catch
                {
                    this.RevertSingleSequenceNumber();

                    return(null);
                }
            }
        }
コード例 #4
0
        private void ProcessDatagramHeaders(byte[] datagram)
        {
            // HEADER
            // TODO: Might be interesting to take out these magic numbers for the datagram indices
            var knxDatagram = new KnxDatagram
            {
                HeaderLength    = datagram[0],
                ProtocolVersion = datagram[1],
                ServiceType     = new[] { datagram[2], datagram[3] },
                TotalLength     = datagram[4] + datagram[5]
            };

            var channelId = datagram[7];

            if (channelId != this.ChannelId)
            {
                return;
            }

            var sequenceNumber = datagram[8];
            var process        = true;

            lock (this.SequenceNumberLock)
            {
                if (sequenceNumber <= this.m_rxSequenceNumber)
                {
                    process = false;
                }

                this.m_rxSequenceNumber = sequenceNumber;
            }

            if (process)
            {
                // TODO: Magic number 10, what is it?
                var cemi = new byte[datagram.Length - 10];
                Array.Copy(datagram, 10, cemi, 0, datagram.Length - 10);

                switch (DatagramProcessing.ProcessCEMI(ref knxDatagram, cemi, this.ThreeLevelGroupAddressing, this.IsDebug))
                {
                case ResponseType.Event:
                    base.EventReceived(knxDatagram.DestinationAddress, knxDatagram.Data);
                    break;

                case ResponseType.Status:
                    base.StatusReceived(knxDatagram.DestinationAddress, knxDatagram.Data);
                    break;
                }
            }

            this.SendTunnelingAck(sequenceNumber);
        }
コード例 #5
0
        private async void OnStateRequest(object state)
        {
            var datagram = DatagramProcessing.CreateStateRequest(this.LocalEndpoint, this.ChannelId);

            try
            {
                await this.SendData(datagram);
            }
            catch (Exception ex)
            {
                if (this.IsDebug)
                {
                    System.Diagnostics.Debug.WriteLine(ex.Message);
                }
            }
        }
コード例 #6
0
ファイル: KnxRouting.cs プロジェクト: tomyqg/ms-iot
        private byte[] CreateRequestStatusDatagram(string 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(DatagramProcessing.CreateRequestStatusDatagramCommon(destinationAddress, datagram, 6, ActionMessageCode));
        }
コード例 #7
0
ファイル: KnxRouting.cs プロジェクト: tomyqg/ms-iot
        private byte[] CreateActionDatagram(string destinationAddress, byte[] data)
        {
            var dataLength = DataProcessing.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(DatagramProcessing.CreateActionDatagramCommon(destinationAddress, data, datagram, ActionMessageCode));
        }
コード例 #8
0
ファイル: KnxRouting.cs プロジェクト: tomyqg/ms-iot
        private void OnMessageReceived(object sender, UdpSocketMessageReceivedEventArgs e)
        {
            try
            {
                KnxDatagram knxDatagram;
                switch (DatagramProcessing.ProcessDatagram(e.ByteData, ThreeLevelGroupAddressing, IsDebug, out knxDatagram))
                {
                case ResponseType.Event:
                    base.EventReceived(knxDatagram.DestinationAddress, knxDatagram.Data);
                    break;

                case ResponseType.Status:
                    base.StatusReceived(knxDatagram.DestinationAddress, knxDatagram.Data);
                    break;
                }
            }
            catch (Exception ex)
            {
                if (IsDebug)
                {
                    System.Diagnostics.Debug.WriteLine(ex.Message);
                }
            }
        }
コード例 #9
0
        private async void DisconnectRequest()
        {
            var datagram = DatagramProcessing.CreateDisconnectRequest(this.LocalEndpoint, this.ChannelId);

            await this.SendData(datagram);
        }
コード例 #10
0
        private async void ConnectRequest()
        {
            var datagram = DatagramProcessing.CreateConnectRequest(this.LocalEndpoint);

            await this.SendData(datagram);
        }