接入airkiss

This commit is contained in:
Lihongda 2024-02-23 05:27:53 +08:00
parent c3fcea2b0a
commit e7479a8d7e
2 changed files with 198 additions and 2 deletions

View File

@ -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<String>() {
@Override
public void call(Subscriber<? super String> 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<String>() {
@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<String>() {
@Override
public void call(Subscriber<? super String> 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<String>() {
@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();
}
}
}

View File

@ -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) {