增加设备入网代码,完善airkiss发送逻辑

This commit is contained in:
Lihongda 2024-02-24 01:09:21 +08:00
parent ac765ef03d
commit 14bd2910aa
2 changed files with 519 additions and 12 deletions

View File

@ -1,15 +1,46 @@
package com.ifish.activity.newbind;
import android.app.ProgressDialog;
import android.content.Intent;
import android.os.CountDownTimer;
import android.os.Handler;
import android.text.TextUtils;
import android.util.Log;
import androidx.appcompat.app.AppCompatActivity;
import com.ifish.activity.BlackListActivity;
import com.ifish.activity.LoadingActivity;
import com.ifish.activity.MainEightControlActivity;
import com.ifish.activity.MainFiveBDControlActivity;
import com.ifish.activity.MainFiveControlActivity;
import com.ifish.activity.MainFourControlActivity;
import com.ifish.activity.MainFour_2B_ControlActivity;
import com.ifish.activity.MainFour_3F_ControlActivity;
import com.ifish.activity.MainHot_3A_ControlActivity;
import com.ifish.activity.MainSeven_2F_ControlActivity;
import com.ifish.activity.MainSixControlActivity;
import com.ifish.activity.MainSix_2A_ControlActivity;
import com.ifish.activity.MainSix_4F_ControlActivity;
import com.ifish.activity.MainThree1CControlActivity;
import com.ifish.activity.MainThreeControlActivity;
import com.ifish.activity.MainTwoControlActivity;
import com.ifish.activity.MainZeroControlActivity;
import com.ifish.activity.NewBindDeviceChoiceActivity;
import com.ifish.airkiss.AirKissEncoder;
import com.ifish.airkiss.Str_Hex;
import com.ifish.basebean.BaseBean;
import com.ifish.basebean.Device;
import com.ifish.baseclass.BaseGradeActivity;
import com.ifish.utils.AnimationUtil;
import com.ifish.utils.Commons;
import com.ifish.utils.HttpListener;
import com.ifish.utils.HttpManager;
import com.ifish.utils.L;
import com.ifish.utils.SPUtil;
import com.ifish.utils.ToastUtil;
import com.ifish.utils.WifiUtil;
import com.ifish.view.PetPopupChoice;
import com.lidroid.xutils.util.LogUtils;
import java.io.IOException;
@ -18,6 +49,7 @@ import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.util.Arrays;
import java.util.List;
import rx.Observable;
import rx.Subscription;
@ -37,6 +69,19 @@ public class AirKissUtil {
private Subscription sendSubscribe;
private Subscription receiveSubscribe;
private String device_mac;
private WifiUtil wifiUtil;
private Device deviceObj;
private HttpManager hm = HttpManager.getInstance();
private boolean deviceIsNull = false;///当服务器返回的设备控制器数和定时器数为null的时候 改变标记的值 不跳转进入主界面
private int deviceIsNullNum = 0;//循环请求次数
private CountDownTimer deviceIsNullTimer;
private SPUtil sp;
private AppCompatActivity curActivity;
public void init(AppCompatActivity activity){
wifiUtil = new WifiUtil(activity);
sp = SPUtil.getInstance(activity);
curActivity = activity;
}
public void connectDeviceByAirKiss(AppCompatActivity activity, String ssid, String password) {
if (sendSubscribe != null && sendSubscribe.isUnsubscribed()) {
@ -59,9 +104,9 @@ public class AirKissUtil {
sendSocket.setBroadcast(true);
// 从AirKissEncoder对象中获取编码后的数据数组
int[] encoded_data = airKissEncoder.getEncodedData();
for (int i = 0; i < 5; i++) {
for (int i = 0; i < 2; i++) {
for (int encoded_datum : encoded_data) {
DatagramPacket pkg = new DatagramPacket(sendBuffer, encoded_datum, InetAddress.getByName("192.168.4.1"), 333);
DatagramPacket pkg = new DatagramPacket(sendBuffer, encoded_datum, InetAddress.getByName("255.255.255.255"), 10000);
sendSocket.send(pkg);
Thread.sleep(4);
}
@ -82,6 +127,35 @@ public class AirKissUtil {
@Override
public void onCompleted() {
LogUtils.d("LHD onCompleted");
// device_mac = "";
// device_mac = wifiUtil.getConnectWifiBssid();
// hm.queryStoreName(new HttpListener<BaseBean<List<String>>>() {
// @Override
// public void success(final BaseBean<List<String>> baseBean) {
// activity.runOnUiThread(new Runnable() {
// @Override
// public void run() {
// new PetPopupChoice(activity, new PetPopupChoice.OnChoiceListener() {
// @Override
// public void onChoice(String s) {
// doPostBindDevice(s);
// }
// }, baseBean.data).showDialog();
// }
// });
// }
//
// @Override
// public void error(Exception e, String msg) {
//// resetWifiContentView();
// ToastUtil.show(activity, msg);
// }
//
// @Override
// public void finish() {
//
// }
// }, Commons.USER.getUserId());
}
@Override
@ -109,30 +183,31 @@ public class AirKissUtil {
}
});
// receiveUDPPackage(activity);
}
public void receiveUDPPackage(AppCompatActivity activity) {
//接收udp包
receiveSubscribe = Observable.create(new Observable.OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> subscriber) {
byte[] buffer = new byte[15000];
try (DatagramSocket udpServerSocket = new DatagramSocket(9954)) {
try (DatagramSocket udpServerSocket = new DatagramSocket(10000)) {
udpServerSocket.setSoTimeout(1000 * 60);
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
while (true) {
LogUtils.d("LHD receiveUDP status running");
byte[] buffer = new byte[1024];
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
udpServerSocket.receive(packet);
buffer = packet.getData();
Log.e("LHD test9999999990","收到的udp包 1" + new String(buffer));
String hexString = Str_Hex.byte2hex(buffer);
Log.e("LHD test9999999990","收到的udp包地址" + packet.getAddress() + "///"+ WifiUtil.intToIp(wifiUtil.getConnectIpAddress()));
Log.e("LHD test9999999990","收到的udp包 2" + hexString);
LogUtils.d("LHD airkiss = "+packet.getSocketAddress()+" port = "+packet.getPort());
//对收到的UDP包进行解码
//各个设备返回的UDP包格式不一样 将解码的UDP包通过RxJava发送到主线程 进行UI处理
if (!TextUtils.isEmpty(hexString)) {
LogUtils.d("LHD receiveUDP : " + hexString);
Log.d("LHD received:", hexString);
subscriber.onNext(hexString);
break;
}
@ -178,11 +253,99 @@ public class AirKissUtil {
@Override
public void onNext(String s) {
ToastUtil.show(activity, "收到的UDP包" + s);
doPostBindDevice();
}
});
}
/**
* @param
* @Description: 给设备发送入网指令
* @author Jacky dada
* @date 2015-9-21 下午3:05:01
*/
private void doPostBindDevice() {
try {
hm.bindDevice(new HttpListener<BaseBean<Device>>() {
private int result;
@Override
public void success(BaseBean<Device> baseBean) {
result = baseBean.result;
if (result == Commons.NetWork.Success) {
deviceObj = baseBean.data;
deviceObj.setMacAddress(device_mac);
/**
//当服务器返回的设备控制器数和定时器数为null的时候 不跳转进入主界面
*/
if (deviceObj.getControlAmount() == null || deviceObj.getTimerAmount() == null) {
L.i("第一次获取空");
deviceIsNull = true;
deviceIsNullNum = 0;
startDeviceIsNullTimer();//启动倒计时
}
}
}
@Override
public void finish() {
doPostBindDeviceHandler.sendEmptyMessage(result);
}
@Override
public void error(Exception e, String msg) {
result = Commons.NetWork.ERROR;
}
}, Commons.USER.getUserId(), device_mac);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* @param
* @Description: 给宠物设备发送入网指令
* @author Jacky dada
* @date 2015-9-21 下午3:05:01
*/
private void doPostBindPetDevice(String storeName) {
try {
hm.bindPetDevice(new HttpListener<BaseBean<Device>>() {
private int result;
@Override
public void success(BaseBean<Device> baseBean) {
result = baseBean.result;
if (result == Commons.NetWork.Success) {
deviceObj = baseBean.data;
deviceObj.setMacAddress(device_mac);
/**
//当服务器返回的设备控制器数和定时器数为null的时候 不跳转进入主界面
*/
if (deviceObj.getControlAmount() == null || deviceObj.getTimerAmount() == null) {
deviceIsNull = true;
deviceIsNullNum = 0;
startDeviceIsNullTimer();//启动倒计时
}
}
}
@Override
public void finish() {
doPostBindDeviceHandler.sendEmptyMessage(result);
}
@Override
public void error(Exception e, String msg) {
result = Commons.NetWork.ERROR;
}
}, Commons.USER.getUserId(), device_mac, storeName);
} catch (Exception e) {
e.printStackTrace();
}
}
public void unSubscribe() {
if (sendSubscribe != null && sendSubscribe.isUnsubscribed()) {
@ -193,4 +356,348 @@ public class AirKissUtil {
}
}
public void startDeviceIsNullTimer() {
if (deviceIsNullTimer == null) {
deviceIsNullTimer = new CountDownTimer(2000, 1000) {
@Override
public void onTick(long arg0) {
}
@Override
public void onFinish() {
L.i("重新请求");
//拿到设备id 去服务器查询 看看是否为空
try {
hm.getSingleDeviceInf(new HttpListener<BaseBean<Device>>() {
private int result;
@Override
public void success(BaseBean<Device> baseBean) {
result = baseBean.result;
deviceObj = baseBean.data;
}
@Override
public void finish() {
deviceIsNullHandler.sendEmptyMessage(result);
}
@Override
public void error(Exception e, String msg) {
result = Commons.NetWork.ERROR;
}
}, deviceObj.getDeviceId(), Commons.USER.getUserId());
} catch (Exception e) {
e.printStackTrace();
}
}
};
}
deviceIsNullTimer.start();
}
Handler deviceIsNullHandler = new Handler() {
public void handleMessage(android.os.Message msg) {
L.i("请求结束");
switch (msg.what) {
case Commons.NetWork.Success:
if (deviceObj.getControlAmount() == null || deviceObj.getTimerAmount() == null) {
deviceIsNullNum = deviceIsNullNum + 1;
if (deviceIsNullNum < 3) {
startDeviceIsNullTimer();
} else {
resetWifiContentView();
ToastUtil.show(curActivity, "绑定设备失败 请重试");
}
return;
}
boolean isSameName = false;
try {
if (Commons.DEVICE != null) {
if (Commons.DEVICE.size() != 0) {
for (int i = 0; i < Commons.DEVICE.size(); i++) {
if (device_mac.equals(Commons.DEVICE.get(i).getMacAddress())) {
sp.putInt(Commons.LoginSPKey.Position, i);
Commons.DevicePosition = i;
isSameName = true;
break;
}
}
}
}
} catch (Exception e) {
}
if (!isSameName) {
Commons.DEVICE.add(deviceObj);
try {
sp.putInt(Commons.LoginSPKey.Position, Commons.DEVICE.size() - 1);
Commons.DevicePosition = Commons.DEVICE.size() - 1;
} catch (Exception e) {
}
}
Commons.IS_EventBus = true;
Commons.HAVE_DEVICE = true;//改变判断是否绑定的变量
Commons.IS_CAMERA = false;
sp.putBoolean(Commons.LoginSPKey.IS_CAMERA, Commons.IS_CAMERA);
Intent i = new Intent();
try {
Integer controlAmount = Commons.DEVICE.get(Commons.DevicePosition).getControlAmount();
Integer timerAmount = Commons.DEVICE.get(Commons.DevicePosition).getTimerAmount();
String type = Commons.DEVICE.get(Commons.DevicePosition).type;
if (Commons.FishKey.On.equals(Commons.DEVICE.get(Commons.DevicePosition).isBlacklist)) {//黑名单
i.setClass(curActivity, BlackListActivity.class);
} else {
if (Device.TYPE_1C.equals(type)) {
i.setClass(curActivity, MainThree1CControlActivity.class);
} else if (Device.TYPE_AA.equals(type)) {
i.setClass(curActivity, MainFiveControlActivity.class);
} else if (Device.TYPE_BD.equals(type)) {
i.setClass(curActivity, MainFiveBDControlActivity.class);
} else if (Device.TYPE_2A.equals(type)) {
i.setClass(curActivity, MainSix_2A_ControlActivity.class);
} else if (Device.TYPE_2B.equals(type)) {
i.setClass(curActivity, MainFour_2B_ControlActivity.class);
} else if (Device.TYPE_3A.equals(type)) {
i.setClass(curActivity, MainHot_3A_ControlActivity.class);
} else if (Device.TYPE_2F.equals(type)) {
i.setClass(curActivity, MainSeven_2F_ControlActivity.class);
} else if (Device.TYPE_3F.equals(type)) {
i.setClass(curActivity, MainFour_3F_ControlActivity.class);
} else if (Device.TYPE_4F.equals(type) || Device.TYPE_5F.equals(type)){
i.setClass(curActivity, MainSix_4F_ControlActivity.class);
} else {
if (controlAmount == null) {//如果控制器返回空 则默认给三控的页面
i.setClass(curActivity, MainThreeControlActivity.class);
} else {
i.setClass(curActivity, MainThreeControlActivity.class);
switch (controlAmount) {
case 0: {
i.setClass(curActivity, MainZeroControlActivity.class);
break;
}
case 2: {
i.setClass(curActivity, MainTwoControlActivity.class);
break;
}
case 3: {
i.setClass(curActivity, MainThreeControlActivity.class);
break;
}
case 4: {
if (timerAmount == 6) { // 可丽爱
i.setClass(curActivity, MainFiveControlActivity.class);
} else {//4控
i.setClass(curActivity, MainFourControlActivity.class);
}
break;
}
case 5: {
if (6 == timerAmount) {//5控六定时器 询多页面
i.setClass(curActivity, MainSixControlActivity.class);
}
break;
}
case 8: {
i.setClass(curActivity, MainEightControlActivity.class);
break;
}
default: {
i.setClass(curActivity, MainThreeControlActivity.class);
break;
}
}
}
}
}
} catch (Exception e) {
i.setClass(curActivity, MainThreeControlActivity.class);
}
i.putExtra(BaseGradeActivity.BINDDEVICE, true);//绑定成功增加经验
ToastUtil.show(curActivity, "绑定设备成功");
curActivity.startActivity(i);
AnimationUtil.startAnimation(curActivity);
curActivity.finish();
L.i("===================绑定设备成功=" + device_mac);
break;
case Commons.NetWork.ERROR:
resetWifiContentView();
ToastUtil.show(curActivity, Commons.Text.ERROR);
break;
case Commons.NetWork.Fail:
resetWifiContentView();
ToastUtil.show(curActivity, Commons.Text.Repat);
break;
default:
resetWifiContentView();
ToastUtil.show(curActivity, Commons.Text.ServerException);
break;
}
}
};
private void resetWifiContentView() {
ToastUtil.show(curActivity,"重置联网view");
}
Handler doPostBindDeviceHandler = new Handler() {
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
/**
* 1绑定成功
0绑定失败
-4请求验证失败请重新登陆
-5请求被舍弃未执行
*/
case Commons.NetWork.Success:
if (deviceIsNull) {//当服务器返回的设备控制器数和定时器数为null的时候 不跳转进入主界面
return;
}
boolean isSameName = false;
try {
if (Commons.DEVICE != null) {
if (Commons.DEVICE.size() != 0) {
for (int i = 0; i < Commons.DEVICE.size(); i++) {
if (device_mac.equals(Commons.DEVICE.get(i).getMacAddress())) {
sp.putInt(Commons.LoginSPKey.Position, i);
Commons.DevicePosition = i;
isSameName = true;
break;
}
}
}
}
} catch (Exception e) {
}
if (!isSameName) {
Commons.DEVICE.add(deviceObj);
try {
sp.putInt(Commons.LoginSPKey.Position, Commons.DEVICE.size() - 1);
Commons.DevicePosition = Commons.DEVICE.size() - 1;
} catch (Exception e) {
}
}
Commons.IS_EventBus = true;
Commons.HAVE_DEVICE = true;//改变判断是否绑定的变量
Commons.IS_CAMERA = false;
sp.putBoolean(Commons.LoginSPKey.IS_CAMERA, Commons.IS_CAMERA);
Intent i = new Intent();
try {
Integer controlAmount = Commons.DEVICE.get(Commons.DevicePosition).getControlAmount();
Integer timerAmount = Commons.DEVICE.get(Commons.DevicePosition).getTimerAmount();
String type = Commons.DEVICE.get(Commons.DevicePosition).type;
if (Commons.FishKey.On.equals(Commons.DEVICE.get(Commons.DevicePosition).isBlacklist)) {//黑名单
i.setClass(curActivity, BlackListActivity.class);
} else {
if (Device.TYPE_1C.equals(type)) {
i.setClass(curActivity, MainThree1CControlActivity.class);
} else if (Device.TYPE_AA.equals(type)) {
i.setClass(curActivity, MainFiveControlActivity.class);
} else if (Device.TYPE_BD.equals(type)) {
i.setClass(curActivity, MainFiveBDControlActivity.class);
} else if (Device.TYPE_2A.equals(type)) {
i.setClass(curActivity, MainSix_2A_ControlActivity.class);
} else if (Device.TYPE_2B.equals(type)) {
i.setClass(curActivity, MainFour_2B_ControlActivity.class);
} else if (Device.TYPE_3A.equals(type)) {
i.setClass(curActivity, MainHot_3A_ControlActivity.class);
} else if (Device.TYPE_2F.equals(type)) {
i.setClass(curActivity, MainSeven_2F_ControlActivity.class);
} else if (Device.TYPE_3F.equals(type)) {
i.setClass(curActivity, MainFour_3F_ControlActivity.class);
} else if (Device.TYPE_4F.equals(type) || Device.TYPE_5F.equals(type)){
i.setClass(curActivity, MainSix_4F_ControlActivity.class);
} else {
if (controlAmount == null) {//如果控制器返回空 则默认给三控的页面
i.setClass(curActivity, MainThreeControlActivity.class);
} else {
i.setClass(curActivity, MainThreeControlActivity.class);
switch (controlAmount) {
case 0: {
i.setClass(curActivity, MainZeroControlActivity.class);
break;
}
case 2: {
i.setClass(curActivity, MainTwoControlActivity.class);
break;
}
case 3: {
i.setClass(curActivity, MainThreeControlActivity.class);
break;
}
case 4: {
if (timerAmount == 6) { // 可丽爱
i.setClass(curActivity, MainFiveControlActivity.class);
} else {//4控
i.setClass(curActivity, MainFourControlActivity.class);
}
break;
}
case 5: {
if (6 == timerAmount) {//5控六定时器 询多页面
i.setClass(curActivity, MainSixControlActivity.class);
}
break;
}
case 8: {
i.setClass(curActivity, MainEightControlActivity.class);
break;
}
default: {
i.setClass(curActivity, MainThreeControlActivity.class);
break;
}
}
}
}
}
} catch (Exception e) {
i.setClass(curActivity, MainThreeControlActivity.class);
}
i.putExtra(BaseGradeActivity.BINDDEVICE, true);//绑定成功增加经验
ToastUtil.show(curActivity, "绑定设备成功");
curActivity.startActivity(i);
AnimationUtil.startAnimation(curActivity);
curActivity.finish();
L.i("===================绑定设备成功=" + device_mac);
break;
case Commons.NetWork.Fail:
resetWifiContentView();
ToastUtil.show(curActivity, "绑定设备失败 请重试");
// ToastUtil.show(BindTankPetActivity.this, HttpManager.petdevice);
break;
case Commons.NetWork.DEVICETYPEERROR:
resetWifiContentView();
ToastUtil.show(curActivity, "设备类型不匹配,请重新选择入口绑定");
break;
case Commons.NetWork.ReLogin:
resetWifiContentView();
ToastUtil.show(curActivity.getApplicationContext(), "请求验证失败 请重新登陆");
Commons.clean();
curActivity.startActivity(new Intent(curActivity, LoadingActivity.class));
curActivity.finish();
break;
case Commons.NetWork.ERROR:
resetWifiContentView();
ToastUtil.show(curActivity.getApplicationContext(), Commons.Text.ERROR);
break;
case Commons.NetWork.NotImplemented:
resetWifiContentView();
ToastUtil.show(curActivity.getApplicationContext(), Commons.Text.Unknown);
break;
default:
resetWifiContentView();
ToastUtil.show(curActivity.getApplicationContext(), Commons.Text.ServerException);
break;
}
}
};
}

View File

@ -73,7 +73,7 @@ public class NewBindDeviceActivity extends AppCompatActivity {
initWifiName();
checkWifiUtil = new CheckWifiUtil();
airKissUtil = new AirKissUtil();
airKissUtil.init(this);
devicetype = getIntent().getStringExtra("devicetype");
//默认AP连网
curConnectType = ConnectType.APConnect;