public Task SendAsync(IKnxAddress receivingAddress, IKnxData data) { if (!IsConnected) { throw new NotConnectedException(); } _sendMessages.Add(new TunnelRequestBuilder().Build(_communicationChannel, _sequenceCounter++, receivingAddress, data)); return(Task.CompletedTask); }
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()); }