/******************************************************************************* | |
* Copyright (c) 2014, 2016 Orange. | |
* All rights reserved. This program and the accompanying materials | |
* are made available under the terms of the Eclipse Public License 2.0 | |
* which accompanies this distribution, and is available at | |
* https://www.eclipse.org/legal/epl-2.0/ | |
*******************************************************************************/ | |
package org.eclipse.om2m.sdt.home.smarterkettle.communication; | |
import static org.eclipse.om2m.sdt.home.smarterkettle.Activator.LOGGER; | |
import java.io.DataOutputStream; | |
import java.io.IOException; | |
import java.io.InputStream; | |
import java.io.OutputStream; | |
import java.net.Socket; | |
import java.net.UnknownHostException; | |
public class TCPConnection { | |
private String address = ""; | |
private int port = 2081; | |
private boolean waitForResponse = true; // should be set true if ACK or Status expected | |
public TCPConnection(String ip, int port) { | |
this.address = ip; | |
this.port = port; | |
} | |
public void sendTCPPacket(byte[] bytes2send) { | |
sendTCPPacket(bytes2send, address, port); | |
} | |
public void sendTCPPacket(byte[] bytes2send, String address, int port) { | |
try { | |
Socket socket = new Socket(address, port); | |
sendBytes(bytes2send, socket); | |
if (! waitForResponse) { | |
socket.close(); | |
} else { | |
readBytes(socket); | |
} | |
} catch (UnknownHostException e) { | |
LOGGER.warning("", e); | |
} catch (IOException e) { | |
LOGGER.warning("", e); | |
} | |
} | |
private void sendBytes(byte[] bytes2send, Socket socket) throws IOException { | |
sendBytes(bytes2send, 0, bytes2send.length, socket); | |
} | |
private void sendBytes(byte[] bytes2send, int start, int len, Socket socket) throws IOException { | |
if (len < 0) | |
throw new IllegalArgumentException("Negative length not allowed"); | |
if (start < 0 || start >= bytes2send.length) | |
throw new IndexOutOfBoundsException("Out of bounds: " + start); | |
if (socket != null) { | |
OutputStream out = socket.getOutputStream(); | |
DataOutputStream dos = new DataOutputStream(out); | |
//dos.writeInt(len); | |
if (len > 0) { | |
dos.write(bytes2send, start, len); | |
} | |
//dos.close(); | |
//out.close(); | |
} | |
} | |
private byte[] readBytes(Socket socket) throws IOException { | |
boolean statusMsg = false; | |
byte[] buffer = new byte[1024]; | |
int charsRead = 0; | |
if (socket != null) { | |
InputStream in = socket.getInputStream(); | |
while (!statusMsg) { | |
while ((charsRead = in.read(buffer)) != -1) { | |
if (charsRead == 3) break; //ACK received | |
if (charsRead > 3) statusMsg = true; //Status received | |
if (buffer[charsRead-1] == SmarterKettleCommands.END_OF_MESSAGE) | |
break; | |
} | |
} | |
in.close(); | |
} | |
byte[] data = new byte[charsRead]; | |
System.arraycopy(buffer, 0, data, 0, charsRead); | |
return data; | |
} | |
public byte[] checkStatus() { | |
try { | |
Socket socket = new Socket(address, port); | |
return readBytes(socket); | |
//socket.close(); | |
} catch (UnknownHostException e) { | |
LOGGER.warning("", e); | |
} catch (IOException e) { | |
LOGGER.warning("", e); | |
} | |
return new byte[7]; | |
} | |
public String getAddress() { | |
return address; | |
} | |
public void setAddress(String address) { | |
this.address = address; | |
} | |
public boolean isWaitForResponse() { | |
return waitForResponse; | |
} | |
public void setWaitForResponse(boolean waitForResponse) { | |
this.waitForResponse = waitForResponse; | |
} | |
public int getPort() { | |
return port; | |
} | |
public void setPort(int port) { | |
this.port = port; | |
} | |
} |