131 lines
4.0 KiB
Java
131 lines
4.0 KiB
Java
|
package com.espressif.iot.esptouch.udp;
|
||
|
|
||
|
import android.util.Log;
|
||
|
|
||
|
import com.espressif.iot.esptouch.task.__IEsptouchTask;
|
||
|
|
||
|
import java.io.IOException;
|
||
|
import java.net.DatagramPacket;
|
||
|
import java.net.DatagramSocket;
|
||
|
import java.net.InetAddress;
|
||
|
import java.net.SocketException;
|
||
|
import java.net.UnknownHostException;
|
||
|
|
||
|
/**
|
||
|
* this class is used to help send UDP data according to length
|
||
|
*
|
||
|
* @author afunx
|
||
|
*/
|
||
|
public class UDPSocketClient {
|
||
|
|
||
|
private static final String TAG = "UDPSocketClient";
|
||
|
private DatagramSocket mSocket;
|
||
|
private volatile boolean mIsStop;
|
||
|
private volatile boolean mIsClosed;
|
||
|
|
||
|
public UDPSocketClient() {
|
||
|
try {
|
||
|
this.mSocket = new DatagramSocket();
|
||
|
this.mIsStop = false;
|
||
|
this.mIsClosed = false;
|
||
|
} catch (SocketException e) {
|
||
|
if (__IEsptouchTask.DEBUG) {
|
||
|
Log.e(TAG, "SocketException");
|
||
|
}
|
||
|
e.printStackTrace();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
@Override
|
||
|
protected void finalize() throws Throwable {
|
||
|
close();
|
||
|
super.finalize();
|
||
|
}
|
||
|
|
||
|
public void interrupt() {
|
||
|
if (__IEsptouchTask.DEBUG) {
|
||
|
Log.i(TAG, "USPSocketClient is interrupt");
|
||
|
}
|
||
|
this.mIsStop = true;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* close the UDP socket
|
||
|
*/
|
||
|
public synchronized void close() {
|
||
|
if (!this.mIsClosed) {
|
||
|
this.mSocket.close();
|
||
|
this.mIsClosed = true;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* send the data by UDP
|
||
|
*
|
||
|
* @param data the data to be sent
|
||
|
* @param targetPort the port of target
|
||
|
* @param interval the milliseconds to between each UDP sent
|
||
|
*/
|
||
|
public void sendData(byte[][] data, String targetHostName, int targetPort,
|
||
|
long interval) {
|
||
|
sendData(data, 0, data.length, targetHostName, targetPort, interval);
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
* send the data by UDP
|
||
|
*
|
||
|
* @param data the data to be sent
|
||
|
* @param offset the offset which data to be sent
|
||
|
* @param count the count of the data
|
||
|
* @param targetPort the port of target
|
||
|
* @param interval the milliseconds to between each UDP sent
|
||
|
*/
|
||
|
public void sendData(byte[][] data, int offset, int count,
|
||
|
String targetHostName, int targetPort, long interval) {
|
||
|
if ((data == null) || (data.length <= 0)) {
|
||
|
if (__IEsptouchTask.DEBUG) {
|
||
|
Log.e(TAG, "sendData(): data == null or length <= 0");
|
||
|
}
|
||
|
return;
|
||
|
}
|
||
|
for (int i = offset; !mIsStop && i < offset + count; i++) {
|
||
|
if (data[i].length == 0) {
|
||
|
continue;
|
||
|
}
|
||
|
try {
|
||
|
InetAddress targetInetAddress = InetAddress.getByName(targetHostName);
|
||
|
DatagramPacket localDatagramPacket = new DatagramPacket(
|
||
|
data[i], data[i].length, targetInetAddress, targetPort);
|
||
|
this.mSocket.send(localDatagramPacket);
|
||
|
} catch (UnknownHostException e) {
|
||
|
if (__IEsptouchTask.DEBUG) {
|
||
|
Log.e(TAG, "sendData(): UnknownHostException");
|
||
|
}
|
||
|
e.printStackTrace();
|
||
|
mIsStop = true;
|
||
|
break;
|
||
|
} catch (IOException e) {
|
||
|
if (__IEsptouchTask.DEBUG) {
|
||
|
Log.e(TAG, "sendData(): IOException, but just ignore it");
|
||
|
}
|
||
|
// for the Ap will make some troubles when the phone send too many UDP packets,
|
||
|
// but we don't expect the UDP packet received by others, so just ignore it
|
||
|
}
|
||
|
try {
|
||
|
Thread.sleep(interval);
|
||
|
} catch (InterruptedException e) {
|
||
|
e.printStackTrace();
|
||
|
if (__IEsptouchTask.DEBUG) {
|
||
|
Log.e(TAG, "sendData is Interrupted");
|
||
|
}
|
||
|
mIsStop = true;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
if (mIsStop) {
|
||
|
close();
|
||
|
}
|
||
|
}
|
||
|
}
|