初步增加airkiss配网

This commit is contained in:
Lihongda 2024-02-23 06:19:27 +08:00
parent e7479a8d7e
commit 6788ff18d1
1 changed files with 24 additions and 32 deletions

View File

@ -17,6 +17,7 @@ import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.util.Arrays;
import rx.Observable;
import rx.Subscription;
@ -35,6 +36,7 @@ public class AirKissUtil {
private Subscription sendSubscribe;
private Subscription receiveSubscribe;
private String device_mac;
public void connectDeviceByAirKiss(AppCompatActivity activity, String ssid, String password) {
if (sendSubscribe != null && sendSubscribe.isUnsubscribed()) {
@ -48,27 +50,26 @@ public class AirKissUtil {
sendSubscribe = Observable.create(new Observable.OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> subscriber) {
byte DUMMY_DATA[] = new byte[1500];
DatagramSocket sendSocket = null;
try {
sendSocket = new DatagramSocket();
byte[] sendBuffer = new byte[1500];
try (DatagramSocket sendSocket = new DatagramSocket()) {
// 创建一个新的DatagramSocket对象此时系统会随机分配一个可用的UDP端口号
// 设置该DatagramSocket为广播模式允许向广播地址发送数据包
sendSocket.setBroadcast(true);
int encoded_data[] = airKissEncoder.getEncodedData();
for (int i = 0; i < encoded_data.length; ++i) {
DatagramPacket pkg = new DatagramPacket(DUMMY_DATA,
encoded_data[i],
InetAddress.getByName("192.168.4.1"),
333);
sendSocket.send(pkg);
Thread.sleep(4);
// 从AirKissEncoder对象中获取编码后的数据数组
int[] encoded_data = airKissEncoder.getEncodedData();
for (int i = 0; i < 5; i++) {
for (int encoded_datum : encoded_data) {
DatagramPacket pkg = new DatagramPacket(sendBuffer, encoded_datum, InetAddress.getByName("192.168.4.1"), 333);
sendSocket.send(pkg);
Thread.sleep(4);
}
LogUtils.d("LHD 从AirKissEncoder对象中获取编码后的数据数组 encoded_data = "+ Arrays.toString(encoded_data));
Thread.sleep(1000);
}
subscriber.onCompleted();
} catch (Exception e) {
subscriber.onError(e);
e.printStackTrace();
} finally {
sendSocket.close();
sendSocket.disconnect();
}
}
})
@ -89,22 +90,11 @@ public class AirKissUtil {
@Override
public void onNext(String string) {
LogUtils.d("LHD send onNext =" + string);
ProgressDialog mDialog = new ProgressDialog(activity);
mDialog.setTitle("配网");
mDialog.setMessage("发送配网信息...");
mDialog.setCancelable(false);
mDialog.show();
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
//发送配网ssid pwd,因为字节发送需要时间比较久此处只是设置比较短的提示但实际上后台线程还在发送中
mDialog.dismiss();
receiveUDPPackage(activity);
}
}, 5000);
}
});
receiveUDPPackage(activity);
}
public void receiveUDPPackage(AppCompatActivity activity) {
@ -120,14 +110,14 @@ public class AirKissUtil {
udpServerSocket.setSoTimeout(1000 * 60);
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
while (true) {
LogUtils.d("LHD status running");
LogUtils.d("LHD receiveUDP status running");
udpServerSocket.receive(packet);
buffer = packet.getData();
String hexString = Str_Hex.byte2hex(buffer);
//对收到的UDP包进行解码
//各个设备返回的UDP包格式不一样 将解码的UDP包通过RxJava发送到主线程 进行UI处理
if (!TextUtils.isEmpty(hexString)) {
LogUtils.d("LHD received : " + hexString);
LogUtils.d("LHD receiveUDP : " + hexString);
subscriber.onNext(hexString);
break;
}
@ -144,8 +134,9 @@ public class AirKissUtil {
e.printStackTrace();
} finally {
LogUtils.d("LHD received finally: ");
udpServerSocket.close();
udpServerSocket.disconnect();
if (udpServerSocket != null) {
udpServerSocket.close();
}
}
}
}).subscribeOn(Schedulers.newThread())
@ -167,6 +158,7 @@ public class AirKissUtil {
@Override
public void onError(Throwable e) {
ToastUtil.show(activity, "连接失败: " + e.getMessage());
LogUtils.d("LHD received 连接失败: "+e.getMessage());
mDialog.dismiss();
}