Exemplo n.º 1
0
        protected byte[] CreateRequestStatusDatagramCommon(string destinationAddress, byte[] datagram, int cemi_start_pos)
        {
            var i = 0;

            datagram[cemi_start_pos + i++] =
                KnxConnection.ActionMessageCode != 0x00
                    ? KnxConnection.ActionMessageCode
                    : (byte)0x11;

            datagram[cemi_start_pos + i++] = 0x00;
            datagram[cemi_start_pos + i++] = 0xAC;

            datagram[cemi_start_pos + i++] =
                KnxHelper.IsAddressIndividual(destinationAddress)
                    ? (byte)0x50
                    : (byte)0xF0;

            datagram[cemi_start_pos + i++] = 0x00;
            datagram[cemi_start_pos + i++] = 0x00;
            byte[] dst_address = KnxHelper.GetAddress(destinationAddress);
            datagram[cemi_start_pos + i++] = dst_address[0];
            datagram[cemi_start_pos + i++] = dst_address[1];

            datagram[cemi_start_pos + i++] = 0x01;
            datagram[cemi_start_pos + i++] = 0x00;
            datagram[cemi_start_pos + i]   = 0x00;

            return(datagram);
        }
Exemplo n.º 2
0
        internal static ConnectResponseFrame CreateFrame(byte[] datagram, KnxConnection knx)
        {
            ConnectResponseFrame frame = new ConnectResponseFrame(knx);
            var knxDatagram            = new KnxDatagram(datagram)
            {
                HeaderLength    = datagram[0],
                ProtocolVersion = datagram[1],
                ServiceType     = new[] { datagram[2], datagram[3] },
                TotalLength     = datagram[4] + datagram[5],
                ChannelId       = datagram[6],
                Status          = datagram[7]
            };


            if (knxDatagram.ChannelId == 0x00 && knxDatagram.Status == 0x24)
            {
                frame.ErrorCode = "E_NO_MORE_CONNECTIONS";
                return(frame);
            }
            else if (knxDatagram.Status == 0x2B || knxDatagram.Status == 0x2A)
            {
                /*if (knx is KnxConnectionTunnelingSecure knxIpSec)
                 * {
                 *  knxIpSec.IpSecureErrorOccured?.Invoke(knx, new IpSecureEventArgs("E_NO_TUNNELLING_ADDRESS", KnxError.IpSecInvalidIndividualAddress));
                 *  knx.Disconnect();
                 * }*/
            }
            else if (knxDatagram.Status == 0x26)
            {
                frame.ErrorCode = "E_DATA_CONNECTION";
                return(frame);
            }
            else if (knxDatagram.Status == 0x27)
            {
                frame.ErrorCode = "E_KNX_CONNECTION";
                return(frame);
            }
            else
            {
                byte[] iab = new byte[2];
                Array.Copy(datagram, 18, iab, 0, 2);
                string ia = KnxHelper.GetIndividualAddress(iab);


                if (!String.IsNullOrEmpty(knx.IndividualAddress) && ia != knx.IndividualAddress)
                {
                    //    ((KnxConnectionTunnelingSecure) knx).IpSecureErrorOccured.Invoke(knx,
                    //        new IpSecureEventArgs("E_DATA_CONNECTION",
                    //            KnxError.IpSecRespondedIndividualAddressDiffersToGiven));
                    //    knx.Disconnect();
                    return(frame);
                }

                frame.IndividualAddress = ia;
                frame.ChannelId         = knxDatagram.ChannelId;
                frame.IsValid           = true;
            }
            return(frame);
        }
Exemplo n.º 3
0
        internal override byte[] ToFrame()
        {
            int cemi_start_pos = 10;
            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] = KnxConnection.ChannelId;
            datagram[08] = KnxConnection.GenerateSequenceNumber();
            datagram[09] = 0x00;

            var i = 0;

            datagram[cemi_start_pos + i++] =
                KnxConnection.ActionMessageCode != 0x00
                    ? KnxConnection.ActionMessageCode
                    : (byte)0x11;

            datagram[cemi_start_pos + i++] = 0x00;
            datagram[cemi_start_pos + i++] = 0xAC;

            datagram[cemi_start_pos + i++] =
                KnxHelper.IsAddressIndividual(DestinationAddress)
                    ? (byte)0x50
                    : (byte)0xF0;

            datagram[cemi_start_pos + i++] = 0x00;
            datagram[cemi_start_pos + i++] = 0x00;
            byte[] dstAddress = KnxHelper.GetAddress(DestinationAddress);
            datagram[cemi_start_pos + i++] = dstAddress[0];
            datagram[cemi_start_pos + i++] = dstAddress[1];

            datagram[cemi_start_pos + i++] = 0x01;
            datagram[cemi_start_pos + i++] = 0x00;
            datagram[cemi_start_pos + i]   = 0x00;

            return(datagram);
        }
Exemplo n.º 4
0
        private byte[] CreateActionDatagramCommon(string destinationAddress, byte[] data, byte[] header)
        {
            int i;
            var dataLength = KnxHelper.GetDataLength(data);

            // HEADER
            var datagram = new byte[dataLength + 10 + header.Length];

            for (i = 0; i < header.Length; i++)
            {
                datagram[i] = header[i];
            }

            datagram[i++] =
                KnxConnection.ActionMessageCode != 0x00
                    ? KnxConnection.ActionMessageCode
                    : (byte)0x11;

            datagram[i++] = 0x00;
            datagram[i++] = 0xA4;

            datagram[i++] =
                KnxHelper.IsAddressIndividual(destinationAddress)
                    ? (byte)0x50
                    : (byte)0xE0;

            datagram[i++] = 0x00;
            datagram[i++] = 0x00;
            var dstAddress = KnxHelper.GetAddress(destinationAddress);

            datagram[i++] = dstAddress[0];
            datagram[i++] = dstAddress[1];
            datagram[i++] = (byte)dataLength;
            datagram[i++] = 0x00;
            datagram[i]   = 0x80;

            KnxHelper.WriteData(datagram, data, i);

            return(datagram);
        }
Exemplo n.º 5
0
        internal override byte[] ToFrame()
        {
            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] = KnxConnection.ChannelId;
            datagram[08] = KnxConnection.GenerateSequenceNumber();
            datagram[09] = 0x00;

            return(CreateActionDatagramCommon(_ia, _data, datagram));
        }
Exemplo n.º 6
0
        protected byte[] CreateActionDatagramCommon(string destinationAddress, byte[] data, byte[] header)
        {
            int i;
            var dataLength = KnxHelper.GetDataLength(data);

            // HEADER
            var datagram = new byte[dataLength + 10 + header.Length];

            for (i = 0; i < header.Length; i++)
            {
                datagram[i] = header[i];
            }

            // CEMI (start at position 6)
            // +--------+--------+--------+--------+----------------+----------------+--------+----------------+
            // |  Msg   |Add.Info| Ctrl 1 | Ctrl 2 | Source Address | Dest. Address  |  Data  |      APDU      |
            // | Code   | Length |        |        |                |                | Length |                |
            // +--------+--------+--------+--------+----------------+----------------+--------+----------------+
            //   1 byte   1 byte   1 byte   1 byte      2 bytes          2 bytes       1 byte      2 bytes
            //
            //  Message Code    = 0x11 - a L_Data.req primitive
            //      COMMON EMI MESSAGE CODES FOR DATA LINK LAYER PRIMITIVES
            //          FROM NETWORK LAYER TO DATA LINK LAYER
            //          +---------------------------+--------------+-------------------------+---------------------+------------------+
            //          | Data Link Layer Primitive | Message Code | Data Link Layer Service | Service Description | Common EMI Frame |
            //          +---------------------------+--------------+-------------------------+---------------------+------------------+
            //          |        L_Raw.req          |    0x10      |                         |                     |                  |
            //          +---------------------------+--------------+-------------------------+---------------------+------------------+
            //          |                           |              |                         | Primitive used for  | Sample Common    |
            //          |        L_Data.req         |    0x11      |      Data Service       | transmitting a data | EMI frame        |
            //          |                           |              |                         | frame               |                  |
            //          +---------------------------+--------------+-------------------------+---------------------+------------------+
            //          |        L_Poll_Data.req    |    0x13      |    Poll Data Service    |                     |                  |
            //          +---------------------------+--------------+-------------------------+---------------------+------------------+
            //          |        L_Raw.req          |    0x10      |                         |                     |                  |
            //          +---------------------------+--------------+-------------------------+---------------------+------------------+
            //          FROM DATA LINK LAYER TO NETWORK LAYER
            //          +---------------------------+--------------+-------------------------+---------------------+
            //          | Data Link Layer Primitive | Message Code | Data Link Layer Service | Service Description |
            //          +---------------------------+--------------+-------------------------+---------------------+
            //          |        L_Poll_Data.con    |    0x25      |    Poll Data Service    |                     |
            //          +---------------------------+--------------+-------------------------+---------------------+
            //          |                           |              |                         | Primitive used for  |
            //          |        L_Data.ind         |    0x29      |      Data Service       | receiving a data    |
            //          |                           |              |                         | frame               |
            //          +---------------------------+--------------+-------------------------+---------------------+
            //          |        L_Busmon.ind       |    0x2B      |   Bus Monitor Service   |                     |
            //          +---------------------------+--------------+-------------------------+---------------------+
            //          |        L_Raw.ind          |    0x2D      |                         |                     |
            //          +---------------------------+--------------+-------------------------+---------------------+
            //          |                           |              |                         | Primitive used for  |
            //          |                           |              |                         | local confirmation  |
            //          |        L_Data.con         |    0x2E      |      Data Service       | that a frame was    |
            //          |                           |              |                         | sent (does not mean |
            //          |                           |              |                         | successful receive) |
            //          +---------------------------+--------------+-------------------------+---------------------+
            //          |        L_Raw.con          |    0x2F      |                         |                     |
            //          +---------------------------+--------------+-------------------------+---------------------+

            //  Add.Info Length = 0x00 - no additional info
            //  Control Field 1 = see the bit structure above
            //  Control Field 2 = see the bit structure above
            //  Source Address  = 0x0000 - filled in by router/gateway with its source address which is
            //                    part of the KNX subnet
            //  Dest. Address   = KNX group or individual address (2 byte)
            //  Data Length     = Number of bytes of data in the APDU excluding the TPCI/APCI bits
            //  APDU            = Application Protocol Data Unit - the actual payload including transport
            //                    protocol control information (TPCI), application protocol control
            //                    information (APCI) and data passed as an argument from higher layers of
            //                    the KNX communication stack
            //

            datagram[i++] =
                KnxConnection.ActionMessageCode != 0x00
                    ? KnxConnection.ActionMessageCode
                    : (byte)0x11;

            datagram[i++] = 0x00;
            datagram[i++] = 0xAC;

            datagram[i++] =
                KnxHelper.IsAddressIndividual(destinationAddress)
                    ? (byte)0x50
                    : (byte)0xF0;

            datagram[i++] = 0x00;
            datagram[i++] = 0x00;
            var dst_address = KnxHelper.GetAddress(destinationAddress);

            datagram[i++] = dst_address[0];
            datagram[i++] = dst_address[1];
            datagram[i++] = (byte)dataLength;
            datagram[i++] = 0x00;
            datagram[i]   = 0x80;

            KnxHelper.WriteData(datagram, data, i);

            return(datagram);
        }