diff --git a/iFish7/src/main/java/com/ifish/activity/newbind/AirKissUtil.java b/iFish7/src/main/java/com/ifish/activity/newbind/AirKissUtil.java new file mode 100644 index 000000000..85c26d6dd --- /dev/null +++ b/iFish7/src/main/java/com/ifish/activity/newbind/AirKissUtil.java @@ -0,0 +1,191 @@ +package com.ifish.activity.newbind; + +import android.app.ProgressDialog; +import android.os.Handler; +import android.text.TextUtils; +import android.util.Log; + +import androidx.appcompat.app.AppCompatActivity; + +import com.ifish.airkiss.AirKissEncoder; +import com.ifish.airkiss.Str_Hex; +import com.ifish.utils.ToastUtil; +import com.lidroid.xutils.util.LogUtils; + +import java.io.IOException; +import java.net.DatagramPacket; +import java.net.DatagramSocket; +import java.net.InetAddress; +import java.net.SocketException; + +import rx.Observable; +import rx.Subscription; +import rx.Observer; +import rx.Subscriber; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; + +/** + * @ClassName: AirKissUtil + * @Description: 作用描述 + * @Author: LiHongda + * @CreateDate: 2024/2/23 4:36 + */ +public class AirKissUtil { + + private Subscription sendSubscribe; + private Subscription receiveSubscribe; + + public void connectDeviceByAirKiss(AppCompatActivity activity, String ssid, String password) { + if (sendSubscribe != null && sendSubscribe.isUnsubscribed()) { + sendSubscribe.unsubscribe(); + } + if (receiveSubscribe != null && receiveSubscribe.isUnsubscribed()) { + receiveSubscribe.unsubscribe(); + } + AirKissEncoder airKissEncoder = new AirKissEncoder(ssid, password); + //发送AirKiss + sendSubscribe = Observable.create(new Observable.OnSubscribe() { + @Override + public void call(Subscriber subscriber) { + byte DUMMY_DATA[] = new byte[1500]; + DatagramSocket sendSocket = null; + try { + sendSocket = new 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); + } + subscriber.onCompleted(); + } catch (Exception e) { + subscriber.onError(e); + e.printStackTrace(); + } finally { + sendSocket.close(); + sendSocket.disconnect(); + } + } + }) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Observer() { + @Override + public void onCompleted() { + LogUtils.d("LHD onCompleted"); + } + + @Override + public void onError(Throwable e) { + LogUtils.d("LHD onError"); + ToastUtil.show(activity, "连接失败: " + e.getMessage()); + } + + @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); + } + }); + + } + + public void receiveUDPPackage(AppCompatActivity activity) { + ProgressDialog mDialog = new ProgressDialog(activity); + //接收udp包 + receiveSubscribe = Observable.create(new Observable.OnSubscribe() { + @Override + public void call(Subscriber subscriber) { + byte[] buffer = new byte[15000]; + DatagramSocket udpServerSocket = null; + try { + udpServerSocket = new DatagramSocket(9954); + udpServerSocket.setSoTimeout(1000 * 60); + DatagramPacket packet = new DatagramPacket(buffer, buffer.length); + while (true) { + LogUtils.d("LHD 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); + subscriber.onNext(hexString); + break; + } + } + + subscriber.onCompleted(); + } catch (SocketException e) { + LogUtils.d("LHD SocketException : " + e.getLocalizedMessage()); + subscriber.onError(e); + e.printStackTrace(); + } catch (IOException e) { + LogUtils.d("LHD IOException : " + e.getLocalizedMessage()); + subscriber.onError(e); + e.printStackTrace(); + } finally { + LogUtils.d("LHD received finally: "); + udpServerSocket.close(); + udpServerSocket.disconnect(); + } + } + }).subscribeOn(Schedulers.newThread()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Subscriber() { + @Override + public void onStart() { + super.onStart(); + mDialog.setMessage("正在连接..."); + mDialog.setCancelable(false); + mDialog.show(); + } + + @Override + public void onCompleted() { + mDialog.dismiss(); + } + + @Override + public void onError(Throwable e) { + ToastUtil.show(activity, "连接失败: " + e.getMessage()); + mDialog.dismiss(); + } + + @Override + public void onNext(String s) { + ToastUtil.show(activity, "收到的UDP包:" + s); + } + + }); + } + + + public void unSubscribe() { + if (sendSubscribe != null && sendSubscribe.isUnsubscribed()) { + sendSubscribe.unsubscribe(); + } + if (receiveSubscribe != null && receiveSubscribe.isUnsubscribed()) { + receiveSubscribe.unsubscribe(); + } + } + +} diff --git a/iFish7/src/main/java/com/ifish/activity/newbind/NewBindDeviceActivity.java b/iFish7/src/main/java/com/ifish/activity/newbind/NewBindDeviceActivity.java index 25f5df36a..59e7c4363 100644 --- a/iFish7/src/main/java/com/ifish/activity/newbind/NewBindDeviceActivity.java +++ b/iFish7/src/main/java/com/ifish/activity/newbind/NewBindDeviceActivity.java @@ -61,7 +61,7 @@ public class NewBindDeviceActivity extends AppCompatActivity { //---------------工具类--------------------// private CheckWifiUtil checkWifiUtil; - + private AirKissUtil airKissUtil; @Override protected void onCreate(Bundle savedInstanceState) { @@ -72,6 +72,8 @@ public class NewBindDeviceActivity extends AppCompatActivity { initListener(); initWifiName(); checkWifiUtil = new CheckWifiUtil(); + airKissUtil = new AirKissUtil(); + devicetype = getIntent().getStringExtra("devicetype"); //默认AP连网 curConnectType = ConnectType.APConnect; @@ -249,9 +251,10 @@ public class NewBindDeviceActivity extends AppCompatActivity { */ public void connectDevice() { //根据选择的连网类型跳转不同的逻辑 + String ssid = tvWifiName.getText().toString(); String pwd = tvWifiPwd.getText().toString(); //一系列判断逻辑 - boolean canConnect = checkWifiUtil.checkWifiCanUse(this, tvWifiName.getText().toString(), pwd); + boolean canConnect = checkWifiUtil.checkWifiCanUse(this, ssid, pwd); if (!canConnect) { return; } @@ -285,6 +288,7 @@ public class NewBindDeviceActivity extends AppCompatActivity { case AirKiss: // 处理AirKiss逻辑 ToastUtil.show(NewBindDeviceActivity.this, "开始AirKiss连网..."); + airKissUtil.connectDeviceByAirKiss(this,ssid,pwd); break; } } @@ -317,6 +321,7 @@ public class NewBindDeviceActivity extends AppCompatActivity { protected void onDestroy() { super.onDestroy(); EventBus.getDefault().unregister(this); + airKissUtil.unSubscribe(); } public void onEventMainThread(ConnectMessageEvent event) {