接入airkiss
This commit is contained in:
parent
c3fcea2b0a
commit
e7479a8d7e
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -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) {
|
||||
|
|
|
|||
Loading…
Reference in New Issue