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); } } }
public async void SendTunnelingAck(byte sequenceNumber) { // HEADER var datagram = DatagramProcessing.CreateTunnelingAck(sequenceNumber, this.ChannelId); await this.SendData(datagram); }
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); } } }
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); }
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); } } }
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)); }
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)); }
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); } } }
private async void DisconnectRequest() { var datagram = DatagramProcessing.CreateDisconnectRequest(this.LocalEndpoint, this.ChannelId); await this.SendData(datagram); }
private async void ConnectRequest() { var datagram = DatagramProcessing.CreateConnectRequest(this.LocalEndpoint); await this.SendData(datagram); }