4343
4444import java .io .IOException ;
4545import java .lang .System .Logger .Level ;
46- import java .net .InetAddress ;
4746import java .net .InetSocketAddress ;
4847import java .nio .ByteBuffer ;
4948import java .util .concurrent .CompletableFuture ;
6463import io .calimero .baos .BaosService .Property ;
6564import io .calimero .cemi .CEMI ;
6665import io .calimero .knxnetip .ClientConnection ;
66+ import io .calimero .knxnetip .EndpointAddress ;
6767import io .calimero .knxnetip .KNXConnectionClosedException ;
6868import io .calimero .knxnetip .TcpConnection ;
69+ import io .calimero .knxnetip .UdpEndpointAddress ;
6970import io .calimero .knxnetip .servicetype .ErrorCodes ;
7071import io .calimero .knxnetip .servicetype .KNXnetIPHeader ;
7172import io .calimero .knxnetip .servicetype .PacketHelper ;
@@ -94,24 +95,22 @@ default void frameReceived(final FrameEvent e) {}
9495 // client SHALL wait 1 second for acknowledgment response to an object server request from server
9596 private static final int ReqTimeout = 1 ;
9697
97- private final boolean tcp ;
9898 private final ScheduledExecutorService scheduler = Executors .newScheduledThreadPool (1 );
9999 private final Future <?> keepAlive ;
100100
101101
102102 ObjectServerConnection (final InetSocketAddress localEP , final InetSocketAddress serverCtrlEP )
103103 throws KNXException , InterruptedException {
104104 super (KNXnetIPHeader .ObjectServerRequest , KNXnetIPHeader .ObjectServerAck , 2 , ReqTimeout );
105- tcp = false ;
106105 keepAlive = CompletableFuture .completedFuture (Void .TYPE );
107- connect (localEP , serverCtrlEP , CRI .createRequest (ObjectServerProtocol ), false );
106+ connect (new UdpEndpointAddress ( localEP ), new UdpEndpointAddress ( serverCtrlEP ) , CRI .createRequest (ObjectServerProtocol ), false );
108107 }
109108
110109 ObjectServerConnection (final TcpConnection c ) throws KNXException {
111110 super (KNXnetIPHeader .ObjectServerRequest , KNXnetIPHeader .ObjectServerAck , 1 , ReqTimeout , c );
112- ctrlEndpt = c .server ();
111+ ctrlEp (c .server ());
112+ dataEp (c .server ());
113113 logger = LogService .getLogger ("io.calimero.baos." + name ());
114- tcp = true ;
115114 try {
116115 c .connect ();
117116 }
@@ -144,12 +143,13 @@ public void send(final BaosService svc, final BlockingMode mode) throws KNXConne
144143 if (mode == BlockingMode .WaitForCon )
145144 throw new KNXIllegalArgumentException (mode + " is not supported" );
146145 try {
147- final int chid = tcp ? 0 : channelId ;
148- final int seq = tcp ? 0 : getSeqSend ();
146+ final boolean udp = ctrlEp () instanceof UdpEndpointAddress ;
147+ final int chid = udp ? channelId : 0 ;
148+ final int seq = udp ? getSeqSend () : 0 ;
149149 final var buf = PacketHelper .toPacket (new ServiceRequest <>(serviceRequest , chid , seq , svc ));
150150
151151 // NYI udp: we need a send method like for cEMI
152- send (buf , dataEndpt );
152+ send (buf , dataEp () );
153153 }
154154 catch (final IOException e ) {
155155 close (CloseEvent .INTERNAL , "communication failure" , ERROR , e );
@@ -164,8 +164,8 @@ public String name() {
164164
165165 @ Override
166166 protected boolean handleServiceType (final KNXnetIPHeader h , final byte [] data , final int offset ,
167- final InetAddress src , final int port ) throws KNXFormatException , IOException {
168- if (super .handleServiceType (h , data , offset , src , port ))
167+ final EndpointAddress src ) throws KNXFormatException , IOException {
168+ if (super .handleServiceType (h , data , offset , src ))
169169 return true ;
170170 final int svc = h .getServiceType ();
171171 if (svc < serviceRequest || svc > serviceAck )
@@ -185,7 +185,7 @@ protected boolean handleServiceType(final KNXnetIPHeader h, final byte[] data, f
185185 return true ;
186186
187187 // req sequence and ack is only used over udp connections, not tcp
188- if (! tcp ) {
188+ if (ctrlEp () instanceof UdpEndpointAddress ) {
189189 final int seq = req .getSequenceNumber ();
190190 final boolean expected = seq == getSeqRcv ();
191191 final boolean repeated = ((seq + 1 ) & 0xFF ) == getSeqRcv ();
@@ -195,7 +195,7 @@ protected boolean handleServiceType(final KNXnetIPHeader h, final byte[] data, f
195195 final int status = h .getVersion () == ProtocolVersion ? ErrorCodes .NO_ERROR
196196 : ErrorCodes .VERSION_NOT_SUPPORTED ;
197197 final byte [] buf = PacketHelper .toPacket (new ServiceAck (serviceAck , channelId , seq , status ));
198- send (buf , dataEndpt );
198+ send (buf , dataEp () );
199199 if (status == ErrorCodes .VERSION_NOT_SUPPORTED ) {
200200 close (CloseEvent .INTERNAL , "protocol version changed" , ERROR , null );
201201 return true ;
@@ -230,14 +230,14 @@ protected boolean handleServiceType(final KNXnetIPHeader h, final byte[] data, f
230230
231231 @ Override
232232 protected void close (final int initiator , final String reason , final Level level , final Throwable t ) {
233- if (tcp ) {
233+ if (ctrlEp () instanceof UdpEndpointAddress )
234+ super .close (initiator , reason , level , t );
235+ else {
234236// closing = 2; // XXX needed?
235237 cleanup (initiator , reason , level , t );
236238 keepAlive .cancel (true );
237239 scheduler .shutdown ();
238240 }
239- else
240- super .close (initiator , reason , level , t );
241241 }
242242
243243 @ Override
0 commit comments