-
Notifications
You must be signed in to change notification settings - Fork 48
/
Copy pathKnxSenderTunneling.cs
127 lines (108 loc) · 4.18 KB
/
KnxSenderTunneling.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
using System;
using System.Net;
using System.Net.Sockets;
namespace KNXLib
{
internal class KnxSenderTunneling : KnxSender
{
private UdpClient _udpClient;
private readonly IPEndPoint _remoteEndpoint;
internal KnxSenderTunneling(KnxConnection connection, UdpClient udpClient, IPEndPoint remoteEndpoint)
: base(connection)
{
_udpClient = udpClient;
_remoteEndpoint = remoteEndpoint;
}
private KnxConnectionTunneling KnxConnectionTunneling
{
get { return (KnxConnectionTunneling)KnxConnection; }
}
public void SetClient(UdpClient client)
{
_udpClient = client;
}
public void SendDataSingle(byte[] datagram)
{
_udpClient.Send(datagram, datagram.Length, _remoteEndpoint);
}
public override void SendData(byte[] datagram)
{
_udpClient.Send(datagram, datagram.Length, _remoteEndpoint);
_udpClient.Send(datagram, datagram.Length, _remoteEndpoint);
_udpClient.Send(datagram, datagram.Length, _remoteEndpoint);
_udpClient.Send(datagram, datagram.Length, _remoteEndpoint);
}
public void SendTunnelingAck(byte sequenceNumber)
{
// HEADER
var datagram = new byte[10];
datagram[00] = 0x06;
datagram[01] = 0x10;
datagram[02] = 0x04;
datagram[03] = 0x21;
datagram[04] = 0x00;
datagram[05] = 0x0A;
datagram[06] = 0x04;
datagram[07] = KnxConnectionTunneling.ChannelId;
datagram[08] = sequenceNumber;
datagram[09] = 0x00;
_udpClient.Send(datagram, datagram.Length, _remoteEndpoint);
}
protected override byte[] CreateActionDatagram(string destinationAddress, byte[] data)
{
lock (KnxConnectionTunneling.SequenceNumberLock)
{
try
{
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] = KnxConnectionTunneling.ChannelId;
datagram[08] = KnxConnectionTunneling.GenerateSequenceNumber();
datagram[09] = 0x00;
return CreateActionDatagramCommon(destinationAddress, data, datagram);
}
catch
{
KnxConnectionTunneling.RevertSingleSequenceNumber();
return null;
}
}
}
protected override byte[] CreateRequestStatusDatagram(string destinationAddress)
{
lock (KnxConnectionTunneling.SequenceNumberLock)
{
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] = KnxConnectionTunneling.ChannelId;
datagram[08] = KnxConnectionTunneling.GenerateSequenceNumber();
datagram[09] = 0x00;
return CreateRequestStatusDatagramCommon(destinationAddress, datagram, 10);
}
catch
{
KnxConnectionTunneling.RevertSingleSequenceNumber();
return null;
}
}
}
}
}