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(); }
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); }
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)); }
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); } }
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); } } } }
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); } }
private void OnKnxEventReceived(KnxConnection arg1, CemiFrame arg2) { KnxEventReceived?.Invoke(arg1, arg2); }
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(); } }
public KnxTunnelingRequest(byte channelId, byte sequenceNumber, CemiFrame cemiFrame) { ChannelId = channelId; SequenceNumber = sequenceNumber; CemiFrame = cemiFrame; }