flutter_smartconfig/android/src/main/java/com/espressif/iot/esptouch/udp/UDPSocketClient.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.w(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.w(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.w(TAG, "sendData(): UnknownHostException");
}
e.printStackTrace();
mIsStop = true;
break;
} catch (IOException e) {
if (__IEsptouchTask.DEBUG) {
Log.w(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.w(TAG, "sendData is Interrupted");
}
mIsStop = true;
break;
}
}
if (mIsStop) {
close();
}
}
}