2 * Copyright (c) 2010-2023 Contributors to the openHAB project
4 * See the NOTICE file(s) distributed with this work for additional
7 * This program and the accompanying materials are made available under the
8 * terms of the Eclipse Public License 2.0 which is available at
9 * http://www.eclipse.org/legal/epl-2.0
11 * SPDX-License-Identifier: EPL-2.0
13 package org.openhab.binding.sonyprojector.internal.communication.serial;
15 import java.io.DataInputStream;
16 import java.io.DataOutputStream;
17 import java.io.IOException;
18 import java.io.InputStream;
19 import java.net.Socket;
20 import java.net.SocketTimeoutException;
22 import org.eclipse.jdt.annotation.NonNullByDefault;
23 import org.eclipse.jdt.annotation.Nullable;
24 import org.openhab.binding.sonyprojector.internal.SonyProjectorModel;
25 import org.openhab.core.i18n.CommunicationException;
26 import org.openhab.core.i18n.ConnectionException;
27 import org.openhab.core.io.transport.serial.SerialPortManager;
28 import org.slf4j.Logger;
29 import org.slf4j.LoggerFactory;
32 * Class for communicating with Sony Projectors through a serial over IP connection
34 * @author Laurent Garnier - Initial contribution
37 public class SonyProjectorSerialOverIpConnector extends SonyProjectorSerialConnector {
39 private final Logger logger = LoggerFactory.getLogger(SonyProjectorSerialOverIpConnector.class);
41 private String address;
44 private @Nullable Socket clientSocket;
49 * @param serialPortManager the serial port manager
50 * @param address the IP address of the projector
51 * @param port the TCP port to be used
52 * @param model the projector model in use
54 public SonyProjectorSerialOverIpConnector(SerialPortManager serialPortManager, String address, Integer port,
55 SonyProjectorModel model) {
56 super(serialPortManager, "dummyPort", model);
58 this.address = address;
63 public synchronized void open() throws ConnectionException {
65 logger.debug("Opening serial over IP connection on IP {} port {}", this.address, this.port);
67 Socket clientSocket = new Socket(this.address, this.port);
68 clientSocket.setSoTimeout(100);
70 dataOut = new DataOutputStream(clientSocket.getOutputStream());
71 dataIn = new DataInputStream(clientSocket.getInputStream());
73 this.clientSocket = clientSocket;
77 logger.debug("Serial over IP connection opened");
78 } catch (IOException | SecurityException | IllegalArgumentException e) {
79 throw new ConnectionException("@text/exception.opening-serial-over-ip-connection-failed", e);
85 public synchronized void close() {
87 logger.debug("Closing serial over IP connection");
89 Socket clientSocket = this.clientSocket;
90 if (clientSocket != null) {
93 } catch (IOException e) {
95 this.clientSocket = null;
102 * Reads some number of bytes from the input stream and stores them into the buffer array b. The number of bytes
103 * actually read is returned as an integer.
104 * In case of socket timeout, the returned value is 0.
106 * @param dataBuffer the buffer into which the data is read.
107 * @return the total number of bytes read into the buffer, or -1 if there is no more data because the end of the
108 * stream has been reached.
109 * @throws CommunicationException if the input stream is null, if the first byte cannot be read for any reason
110 * other than the end of the file, if the input stream has been closed, or if some other I/O error
114 protected int readInput(byte[] dataBuffer) throws CommunicationException {
115 InputStream dataIn = this.dataIn;
116 if (dataIn == null) {
117 throw new CommunicationException("readInput failed: input stream is null");
120 return dataIn.read(dataBuffer);
121 } catch (SocketTimeoutException e) {
123 } catch (IOException e) {
124 logger.debug("readInput failed: {}", e.getMessage());
125 throw new CommunicationException("readInput failed", e);