iFish7/iFish7/src/main/java/com/ifish/activity/BindWifiTankActivity.java

622 lines
24 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* @Title: BindWifiTankActivity.java
* @Package com.ifish.activity
* @Description: TODO
* @author Jacky dada
* @date 2015-9-10 下午7:20:14
*/
package com.ifish.activity;
import android.app.AlertDialog.Builder;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.wifi.ScanResult;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.os.Handler;
import android.text.TextUtils;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.EditText;
import com.ifish.basebean.BaseBean;
import com.ifish.basebean.Device;
import com.ifish.basebean.FinishObj;
import com.ifish.baseclass.BaseActivity;
import com.ifish.tcp.ModelCodec;
import com.ifish.tcp.OrderBindWifiModel;
import com.ifish.tcp.OrderModel;
import com.ifish.utils.AnimationUtil;
import com.ifish.utils.ByteUtil;
import com.ifish.utils.Commons;
import com.ifish.utils.Commons.LoginSPKey;
import com.ifish.utils.Commons.NetWork;
import com.ifish.utils.Commons.Text;
import com.ifish.utils.HttpListener;
import com.ifish.utils.HttpManager;
import com.ifish.utils.SPUtil;
import com.ifish.utils.ToastUtil;
import com.ifish.utils.WifiAdmin;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.lang.reflect.Field;
import java.net.Socket;
import java.util.Arrays;
import java.util.List;
import de.greenrobot.event.EventBus;
/**
* @author Jacky dada
* @ClassName: BindWifiTankActivity
* @Description: 绑定新的鱼缸(无效的界面)
* @date 2015-9-24 下午4:27:11
*/
public class BindWifiTankActivity extends BaseActivity {
private HttpManager hm = HttpManager.getInstance();
long waitTime = 2000;//2秒退出时间
long touchTime = 0;
private WifiAdmin wifiAdmin;
private List<ScanResult> wifiList;
private String ifish_device = "ESP_";//硬件设备的固定wifi头部
private String ifish_device_ssid, et_wifi_psw_string, replaceAlls, device_mac, progressTitle, wifissid = "";
private boolean device_wifi_flag = false;
private boolean home_wifi_flag = false;
private boolean isHaveDevice = false;
private CountDownTimer device_wifi_timer;
private CountDownTimer home_wifi_timer;
private CountDownTimer imgTimer;
private int home_wifi_workid = 0;
private Socket socket = null;
private OutputStream out = null;
private View viewConnection;
private EditText et_wifi_psw;
private Device deviceObj;
private IntentFilter mFilter = new IntentFilter();
private SPUtil sp;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.bindtank_activity);
initTitle("绑定鱼缸");
initView();
initListener();
init();
}
private void stopAllTime() {
if (device_wifi_timer != null) {
device_wifi_timer.cancel();
}
if (home_wifi_timer != null) {
home_wifi_timer.cancel();
}
}
private void init() {
wifiAdmin = new WifiAdmin(this);
//让接受者只收到网络发生改变的广播
mFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
registerReceiver(wifiChangeReciver, mFilter);//注册监听wifi改变的广播接收者
sp = SPUtil.getInstance(BindWifiTankActivity.this);
}
private void initView() {
}
private void initListener() {
// findViewById(R.id.bt_feedback).setOnClickListener(this);
// findViewById(R.id.bt_service).setOnClickListener(this);
findViewById(R.id.bt_connetdevice).setOnClickListener(this);
}
@Override
protected void onDestroy() {
unregisterReceiver(wifiChangeReciver);//activity销毁的时候需要解除注册
super.onDestroy();
}
/**
* 监听wifi广播
*/
private BroadcastReceiver wifiChangeReciver = new BroadcastReceiver() {
private ConnectivityManager connectivityManager;
private NetworkInfo info;
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (action.equals(ConnectivityManager.CONNECTIVITY_ACTION)) {//当网络发生改变 进入此判断
System.out.println("网络状态已经改变");
Log.d("mark", "网络状态已经改变");
connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
//得到连接管理者的里面的信息
info = connectivityManager.getActiveNetworkInfo();
if (info != null && info.isAvailable()) {//当信息不为空 且可用的时候进来
String name = info.getTypeName();
if (name.equals("WIFI")) {
wifiAdmin = new WifiAdmin(BindWifiTankActivity.this);
String testssid = wifiAdmin.getSSID();
testssid = testssid.replaceAll("\"", "");
System.out.println("testssid===========" + testssid);
/**
* 连接上设备 开始入网
*/
if (device_wifi_flag) {
if (!TextUtils.isEmpty(testssid)) {
if (testssid.equals(ifish_device_ssid)) {
device_wifi_flag = false;
if (device_wifi_timer != null) {
device_wifi_timer.cancel();
}
initTimer();
BindDevice(wifissid, replaceAlls);
}
}
}
/**
* 拿到设备mac 给服务器发请求上传mac
*/
if (home_wifi_flag) {
if (!TextUtils.isEmpty(wifissid)) {
if (wifissid.equals(testssid)) {
device_wifi_flag = false;
if (home_wifi_timer != null) {
home_wifi_timer.cancel();
}
doPostBindDevice();
}
}
}
}
System.out.println("当前网络名称:" + name);
Log.d("mark", "当前网络名称:" + name);
} else {
Log.d("mark", "没有可用网络");
System.out.println("没有可用网络");
}
}
}
};
private void initTimer() {
home_wifi_timer = new CountDownTimer(18000, 3000) {//倒数18S 寻找原来的wifi
@Override
public void onTick(long millisUntilFinished) {
}
@Override
public void onFinish() {//倒计时结束 没有找到homewifi
home_wifi_flag = false;
ToastUtil.show(BindWifiTankActivity.this, "无法找到" + wifissid + " 请重试");
dismissProgressDialog();
}
};
}
public Handler UIHandler = new Handler() {
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
case 777:
home_wifi_timer.start();
wifiAdmin.addNetwork(wifiAdmin.CreateWifiInfo(wifissid, replaceAlls, 3));
System.out.println("==============连接家里的wifi=" + wifissid + "=============" + replaceAlls);
System.out.println("==============连接设备的wifi=" + ifish_device_ssid + "=============" + replaceAlls);
//连接hi wifi
break;
case 888:
wifiAdmin.addNetwork(wifiAdmin.CreateWifiInfo(wifissid, replaceAlls, 3));
System.out.println("=========执行888=========");
break;
default:
break;
}
}
;
};
Handler progressDialogHandler = new Handler() {
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
case 1:
showProgressDialog();
break;
case 0:
dismissProgressDialog();
break;
case 3:
setProgressDialogTitle(progressTitle);
break;
case 4:
dismissProgressDialog();
ToastUtil.show(BindWifiTankActivity.this, "绑定设备出错 请重试");
break;
case 5:
dismissProgressDialog();
ToastUtil.show(BindWifiTankActivity.this, "绑定设备出错 请重试");
break;
case 777:
wifiAdmin.CreateWifiInfo(wifissid, replaceAlls, 3);//连接hi wifi
break;
default:
break;
}
}
};
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
super.onClick(v);
switch (v.getId()) {
// case R.id.bt_feedback:
// startActivity(TellUSActivity.class);
// AnimationUtil.startAnimation(this);
// break;
case R.id.bt_connetdevice:
connection();
break;
// case R.id.bt_service:
// service();
// break;
default:
break;
}
}
private void service() {
}
//点击连接设备按钮
private void connection() {
wifiAdmin = new WifiAdmin(BindWifiTankActivity.this);
showProgressDialog();
setProgressDialogTitle("检查WiFi是否打开");
if (!wifiAdmin.checkWifi()) {
ToastUtil.show(getApplicationContext(), "请检查WiFi是否开启");
dismissProgressDialog();
return;
}
setProgressDialogTitle("检查设备WiFi是否在附近");
wifiAdmin.startScan();
if (wifiList != null) {
wifiList.clear();
System.out.println("清空集合");
}
wifiList = wifiAdmin.getWifiList();
if (wifiList == null) {
System.out.println("wifi集合为空");
ToastUtil.show(getApplicationContext(), "没有找到设备发射的WiFi信号");
dismissProgressDialog();
return;
}
isHaveDevice = false;
for (int i = 0; i < wifiList.size(); i++) {
String ssid = wifiList.get(i).SSID;
System.out.println(ssid);
if (ssid.contains(ifish_device)) {
ifish_device_ssid = ssid;
ifish_device_ssid = ifish_device_ssid.replaceAll("\"", "");
isHaveDevice = true;
// int level = wifiList.get(i).level;
// WifiUtil wifiUtil = new WifiUtil(BindWifiTankActivity.this);
// if (!wifiUtil.is24GHzWifi(level)) {
// AlertDialog.Builder dialog = new AlertDialog.Builder(BindWifiTankActivity.this);
// dialog.setMessage("仅支持2.4G Wi-Fi网络请重新选择");
// dialog.setPositiveButton("去更改", new DialogInterface.OnClickListener() {
// @Override
// public void onClick(DialogInterface dialog, int which) {
// Intent i = new Intent();
// i = new Intent(Settings.ACTION_WIFI_SETTINGS);
// startActivity(i);
// }
// });
// dialog.show();
// dismissProgressDialog();
// return;
// }
System.out.println("成功找到设备的WiFi");
break;
}
}
if (!isHaveDevice) {
System.out.println("没有找到设备");
ToastUtil.show(getApplicationContext(), "没有找到设备发射的WiFi信号");
dismissProgressDialog();
return;
}
setProgressDialogTitle("检查是否连接WiFi");
wifissid = wifiAdmin.getSSID();
wifissid = wifissid.replaceAll("\"", "");
home_wifi_workid = wifiAdmin.getNetworkId();
if (TextUtils.isEmpty(wifissid)) {
ToastUtil.show(getApplicationContext(), "您没有连接WiFi");
dismissProgressDialog();
return;
}
if (wifissid.contains(ifish_device)) {
ToastUtil.show(getApplicationContext(), "请先连接可用WiFi 不需要连接设备WiFi");
dismissProgressDialog();
return;
}
dismissProgressDialog();
showWIFIdialog();
}
//输入wifi密码连接对话框
private void showWIFIdialog() {
LayoutInflater inflater = LayoutInflater.from(BindWifiTankActivity.this);
viewConnection = inflater.inflate(R.layout.dialog_submit_psw, null);
et_wifi_psw = (EditText) viewConnection.findViewById(R.id.et_wifi_psw);
et_wifi_psw.setText("bieshu007");
Builder dialog = new Builder(BindWifiTankActivity.this);
dialog.setTitle("请输入" + wifissid + "的密码");
dialog.setView(viewConnection);
dialog.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
try {
//关闭
Field field = dialog.getClass().getSuperclass().getDeclaredField("mShowing");
field.setAccessible(true);
field.set(dialog, true);
dialog.dismiss();
} catch (Exception e) {
e.printStackTrace();
}
}
});
dialog.setPositiveButton("连接", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
et_wifi_psw_string = et_wifi_psw.getText().toString().replaceAll(" ", "");
if (et_wifi_psw_string.length() == 0) {
ToastUtil.show(getApplicationContext(), "请输入密码");
try {
//不关闭
Field field = dialog.getClass().getSuperclass().getDeclaredField("mShowing");
field.setAccessible(true);
field.set(dialog, false);
dialog.dismiss();
} catch (Exception e) {
e.printStackTrace();
}
return;
}
hideKeyboard();
showProgressDialog();
setProgressDialogTitle("正在接入设备的WiFi信号 请稍候...");
device_wifi_flag = true;//开放广播接收者的入口 检测是否连上设备的wifi
ConnectionWifi(wifissid, et_wifi_psw.getText().toString().replaceAll(" ", ""));
}
private void ConnectionWifi(String wifissid, String replaceAll) {
replaceAlls = replaceAll;
wifiAdmin.addNetwork(wifiAdmin.CreateWifiInfo(ifish_device_ssid, null, 1));//连接设备的wifi
device_wifi_timer = new CountDownTimer(13000, 1000) {
@Override
public void onTick(long millisUntilFinished) {
}
@Override
public void onFinish() {//倒计时结束 没有找到设备wifi
device_wifi_flag = false;
ToastUtil.show(BindWifiTankActivity.this, "无法找到设备WiFi 请重试");
dismissProgressDialog();
}
};
device_wifi_timer.start();
}
});
dialog.show();
/**
*
*/
}
/**
* @param
* @Description: 给设备发送入网指令
* @author Jacky dada
* @date 2015-9-21 下午3:05:01
*/
private void BindDevice(final String ssid, final String psw) {
setProgressDialogTitle("正在努力绑定设备 请稍候...");
new Thread() {
private boolean progressDialog_flag = false;
@Override
public void run() {
super.run();
try {
if (socket == null) {
socket = new Socket("192.168.4.1", 333);
try {
Thread.sleep(1000);//睡一秒 否则无法创建连接
} catch (InterruptedException e) {
e.printStackTrace();
}
}
if (socket != null) {
out = socket.getOutputStream();
OrderBindWifiModel model = OrderModel.OrderBindWifiModel(ssid, psw);
out.write(ModelCodec.enCode(model));
out.flush();
InputStream in = socket.getInputStream();
byte[] buffer = new byte[18];
in.read(buffer);
try {
Thread.sleep(1000);//睡一秒 否则响应不过来
} catch (InterruptedException e) {
e.printStackTrace();
}
out.close();
String bytesToHexString = ByteUtil.bytesToHexString(ModelCodec.enCode(model));
System.out.println("bytesToHexString=" + bytesToHexString);
System.out.println("==============没转之前buffer=" + Arrays.toString(buffer));
Object deCode = ModelCodec.deCode(buffer);
// if (deCode instanceof BackBindWifiModel) {
// BackBindWifiModel back= (BackBindWifiModel) deCode;
// device_mac = ByteUtil.bytesToHexString(back.getSrc());
// if ("0001000000000000".equals(device_mac)) {
// L.i("==============设备mac是0001000000000000==================");
// stopAllTime();
// progressDialogHandler.sendEmptyMessage(4);
// UIHandler.sendEmptyMessage(888);
// return;
// }
// progressTitle="已获取到设备信息 正在连接"+wifissid+"请耐心等候10秒左右...";
// progressDialogHandler.sendEmptyMessage(3);
// System.out.println("==============attays="+Arrays.toString(back.getSrc()));
// System.out.println("==============device_mac="+device_mac);
// home_wifi_flag=true;
// progressDialog_flag=true;
// Message msg=new Message();
// msg.what=777;
// UIHandler.sendMessageDelayed(msg, 1000);
// }else{
// progressDialogHandler.sendEmptyMessage(4);
// UIHandler.sendEmptyMessage(888);
// }
}
} catch (Exception e) {
e.printStackTrace();
progressDialogHandler.sendEmptyMessage(4);
if (home_wifi_timer != null) {
home_wifi_timer.cancel();
}
home_wifi_flag = false;
UIHandler.sendEmptyMessage(888);
} finally {
if (socket != null) {
try {
socket.close();
socket = null;
} catch (IOException e) {
e.printStackTrace();
}
}
if (!progressDialog_flag) {
//消失进度条对话框
progressDialogHandler.sendEmptyMessage(0);
}
}
}
}.start();
}
private void doPostBindDevice() {
setProgressDialogTitle("正在上传设备信息至服务器 请稍候...");
hm.bindDevice(new HttpListener<BaseBean<Device>>() {
private int result;
@Override
public void success(BaseBean<Device> baseBean) {
result = baseBean.result;
if (result == NetWork.Success) {
deviceObj = baseBean.data;
deviceObj.setMacAddress(device_mac);
}
}
@Override
public void finish() {
doPostBindDeviceHandler.sendEmptyMessage(result);
}
@Override
public void error(Exception e, String msg) {
result = NetWork.ERROR;
}
}, Commons.USER.getUserId(), device_mac);
}
Handler doPostBindDeviceHandler = new Handler() {
public void handleMessage(android.os.Message msg) {
dismissProgressDialog();
switch (msg.what) {
/**
* 1绑定成功
0绑定失败
-4请求验证失败请重新登陆
-5请求被舍弃未执行
*/
case NetWork.Success:
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(LoginSPKey.Position, i);
isSameName = true;
break;
}
}
}
}
} catch (Exception e) {
}
if (!isSameName) {
Commons.DEVICE.add(deviceObj);
try {
sp.putInt(LoginSPKey.Position, Commons.DEVICE.size() - 1);
} catch (Exception e) {
}
}
Commons.IS_EventBus = true;
EventBus.getDefault().post(device_mac);
EventBus.getDefault().post(new FinishObj());
ToastUtil.show(BindWifiTankActivity.this, "绑定设备成功");
sendBroadcast(new Intent("ResetSButtonReciver"));
Commons.HAVE_DEVICE = true;//改变判断是否绑定的变量
finish();
AnimationUtil.finishAnimation(BindWifiTankActivity.this);
System.out.println("===================绑定设备成功=" + device_mac);
break;
case NetWork.Fail:
ToastUtil.show(BindWifiTankActivity.this, "绑定设备失败 请重试");
break;
case NetWork.DEVICETYPEERROR:
ToastUtil.show(BindWifiTankActivity.this, "设备类型不匹配,请重新选择入口绑定");
break;
case NetWork.ReLogin:
ToastUtil.show(getApplicationContext(), "请求验证失败 请重新登陆");
Commons.clean();
startActivity(new Intent(BindWifiTankActivity.this, LoadingActivity.class));
finish();
break;
case NetWork.ERROR:
ToastUtil.show(getApplicationContext(), Text.ERROR);
break;
case NetWork.NotImplemented:
ToastUtil.show(getApplicationContext(), Text.Unknown);
break;
default:
ToastUtil.show(getApplicationContext(), Text.ServerException);
break;
}
}
};
}