Пример #1
0
        public Task SendAsync(IKnxAddress receivingAddress, IKnxData data)
        {
            if (!IsConnected)
            {
                throw new NotConnectedException();
            }

            _sendMessages.Add(new TunnelRequestBuilder().Build(_communicationChannel, _sequenceCounter++, receivingAddress, data));

            return(Task.CompletedTask);
        }
Пример #2
0
        public byte[] Build(byte communicationChannelId, byte sequenceCounter, IKnxAddress receivingAddress, IKnxData data)
        {
            var dataBytes = data.GetBytes();
            var length    = GetLength(dataBytes);

            const byte headerLength    = 0x06;
            const byte protocolVersion = 0x10;

            byte[] serviceTypeTunnelingRequest = { 0x04, 0x20 };

            var sendingBytes = new List <byte> {
                headerLength, protocolVersion
            };

            sendingBytes.AddRange(serviceTypeTunnelingRequest);

            const byte bodyStructureLength = 0x04;

            sendingBytes.Add(bodyStructureLength);
            sendingBytes.Add(communicationChannelId);
            sendingBytes.Add(sequenceCounter);
            sendingBytes.Add(0x00);

            sendingBytes.Add(0x11);
            sendingBytes.Add(0x00);
            sendingBytes.Add(0xAC);
            sendingBytes.Add(receivingAddress is MultiCastAddress ? (byte)0xF0 : (byte)0x50);
            sendingBytes.Add(0x00);
            sendingBytes.Add(0x00);
            sendingBytes.AddRange(receivingAddress.GetBytes());
            sendingBytes.Add((byte)length);
            sendingBytes.Add(0x00);
            sendingBytes.Add(0x80);

            AddSendingData(sendingBytes, dataBytes);

            sendingBytes.InsertRange(4, BitConverter.GetBytes((ushort)(sendingBytes.Count + 2)).Reverse());

            return(sendingBytes.ToArray());
        }