From 9ef9c1e10bdac147a99eceeaee7715d86bf5f4c7 Mon Sep 17 00:00:00 2001 From: Lihongda <963140097@qq.com> Date: Thu, 7 Mar 2024 16:53:06 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E8=AE=BE=E5=A4=87=E5=85=A5?= =?UTF-8?q?=E7=BD=91=E4=BB=A3=E7=A0=81=EF=BC=8C=E5=AE=8C=E5=96=84airkiss?= =?UTF-8?q?=E5=8F=91=E9=80=81=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ifish/activity/newbind/AirKissUtil.java | 323 ++++++++++++------ .../ifish/activity/newbind/DeviceUtils.java | 89 +++++ .../newbind/NewBindDeviceActivity.java | 57 +++- .../java/com/ifish/airkiss/UDPReceiver.java | 24 +- .../main/java/com/ifish/utils/ToastUtil.java | 15 + 5 files changed, 392 insertions(+), 116 deletions(-) create mode 100644 iFish7/src/main/java/com/ifish/activity/newbind/DeviceUtils.java diff --git a/iFish7/src/main/java/com/ifish/activity/newbind/AirKissUtil.java b/iFish7/src/main/java/com/ifish/activity/newbind/AirKissUtil.java index 1492996de..ab9b2a436 100644 --- a/iFish7/src/main/java/com/ifish/activity/newbind/AirKissUtil.java +++ b/iFish7/src/main/java/com/ifish/activity/newbind/AirKissUtil.java @@ -2,10 +2,12 @@ package com.ifish.activity.newbind; import android.app.ProgressDialog; import android.content.Intent; +import android.os.AsyncTask; import android.os.CountDownTimer; import android.os.Handler; import android.text.TextUtils; import android.util.Log; +import android.widget.Toast; import androidx.appcompat.app.AppCompatActivity; @@ -26,12 +28,15 @@ 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.airkiss.UDPReceiver; import com.ifish.basebean.BaseBean; import com.ifish.basebean.Device; import com.ifish.baseclass.BaseGradeActivity; +import com.ifish.esptouch.ByteUtil; +import com.ifish.esptouch.EsptouchTask; +import com.ifish.esptouch.IEsptouchResult; +import com.ifish.esptouch.IEsptouchTask; import com.ifish.utils.AnimationUtil; import com.ifish.utils.Commons; import com.ifish.utils.HttpListener; @@ -40,7 +45,6 @@ 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; @@ -49,12 +53,11 @@ 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; import rx.Observer; import rx.Subscriber; +import rx.Subscription; import rx.android.schedulers.AndroidSchedulers; import rx.schedulers.Schedulers; @@ -77,13 +80,26 @@ public class AirKissUtil { private CountDownTimer deviceIsNullTimer; private SPUtil sp; private AppCompatActivity curActivity; - public void init(AppCompatActivity activity){ + private String bssid = ""; + private String isSsidHiddenStr = "YES"; + + private UDPReceiver udpReceiver = null; + private DatagramSocket sendSocket = null; + ProgressDialog mDialog = null; + + private static final int REPLY_BYTE_CONFIRM_TIMES = 5; + + public void init(AppCompatActivity activity) { wifiUtil = new WifiUtil(activity); sp = SPUtil.getInstance(activity); curActivity = activity; + mDialog = new ProgressDialog(activity); + if (sendSocket != null) { + sendSocket.close(); + } } - public void connectDeviceByAirKiss(AppCompatActivity activity, String ssid, String password) { + public void connectDeviceByAirKiss(AppCompatActivity activity, String ssid, String bssid, String password) { if (sendSubscribe != null && sendSubscribe.isUnsubscribed()) { sendSubscribe.unsubscribe(); } @@ -91,145 +107,120 @@ public class AirKissUtil { receiveSubscribe.unsubscribe(); } AirKissEncoder airKissEncoder = new AirKissEncoder(ssid, password); +// smartLinkExportObject.connectWithSSID(ssid, password, handler); - //发送AirKiss + //注册udp接收器 +// udpReceiver = new UDPReceiver(wifiUtil, new UdpCallback() { +// @Override +// public void onReceive(String data) { +// Log.e("LHD test9999999990", "收到的udp包 数据:" + data); +// curActivity.runOnUiThread(new Runnable() { +// @Override +// public void run() { +// if (mDialog != null) { +// mDialog.dismiss(); +// } +// ToastUtil.show(curActivity, "接收到设备包:" + data); +// } +// }); +// } +// +// @Override +// public void onError(String error) { +// if (mDialog != null) { +// mDialog.dismiss(); +// } +// LogUtils.d("LHD 设备绑定失败:" + error); +// ToastUtil.showLong(curActivity, "设备绑定失败:" + error); +// } +// }); +// udpReceiver.start(); + +// 发送AirKiss sendSubscribe = Observable.create(new Observable.OnSubscribe() { @Override public void call(Subscriber subscriber) { subscriber.onNext("start"); - byte[] sendBuffer = new byte[1500]; - try (DatagramSocket sendSocket = new DatagramSocket()) { - // 创建一个新的DatagramSocket对象,此时系统会随机分配一个可用的UDP端口号。 - // 设置该DatagramSocket为广播模式,允许向广播地址发送数据包。 + byte[] DUMMY_DATA = new byte[1500]; + AirKissEncoder airKissEncoder = new AirKissEncoder(ssid, password); + DatagramSocket sendSocket = null; + try { + sendSocket = new DatagramSocket(); sendSocket.setBroadcast(true); - // 从AirKissEncoder对象中获取编码后的数据数组。 - int[] encoded_data = airKissEncoder.getEncodedData(); - for (int i = 0; i < 2; i++) { - for (int encoded_datum : encoded_data) { - DatagramPacket pkg = new DatagramPacket(sendBuffer, encoded_datum, InetAddress.getByName("255.255.255.255"), 10000); - sendSocket.send(pkg); - Thread.sleep(4); - } - LogUtils.d("LHD 从AirKissEncoder对象中获取编码后的数据数组 encoded_data = "+ Arrays.toString(encoded_data)); - Thread.sleep(200); + 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("255.255.255.255"), + 10000); +// LogUtils.d("LHD 发送的包:encoded_datum = "+ encoded_data[i]); + 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() { - final ProgressDialog mDialog = new ProgressDialog(activity); @Override public void onCompleted() { - LogUtils.d("LHD onCompleted"); -// device_mac = ""; -// device_mac = wifiUtil.getConnectWifiBssid(); -// hm.queryStoreName(new HttpListener>>() { -// @Override -// public void success(final BaseBean> 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()); +// ToastUtil.show(activity, "连接信号发送完成"); } @Override public void onError(Throwable e) { - LogUtils.d("LHD onError"); + LogUtils.d("LHD onError e "+e.getLocalizedMessage()); ToastUtil.show(activity, "连接失败: " + e.getMessage()); } @Override public void onNext(String string) { LogUtils.d("LHD send onNext =" + string); + if (mDialog != null) { + mDialog.dismiss(); + mDialog.setTitle("配网中"); + mDialog.setMessage("发送配网信息..."); + mDialog.setCancelable(false); + mDialog.show(); + } - mDialog.setTitle("配网"); - mDialog.setMessage("发送配网信息..."); - mDialog.setCancelable(false); - mDialog.show(); new Handler().postDelayed(new Runnable() { @Override public void run() { //发送配网ssid pwd,因为字节发送需要时间比较久,此处只是设置比较短的提示,但实际上后台线程还在发送中。 - mDialog.dismiss(); - receiveUDPPackage(activity); + if (mDialog != null) { + mDialog.dismiss(); + mDialog.setTitle("连接设备"); + mDialog.setMessage("正在接受设备信息,请耐心等待..."); + mDialog.setCancelable(false); + mDialog.show(); +// receiveUDPPackage(curActivity); + } } }, 5000); } }); - } - public void receiveUDPPackage(AppCompatActivity activity) { //接收udp包 receiveSubscribe = Observable.create(new Observable.OnSubscribe() { @Override public void call(Subscriber subscriber) { - try (DatagramSocket udpServerSocket = new DatagramSocket(10000)) { - udpServerSocket.setSoTimeout(1000 * 60); - while (true) { - 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)) { - Log.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: "); - } + receivePackage(airKissEncoder, subscriber); } }).subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Subscriber() { - final ProgressDialog mDialog = new ProgressDialog(activity); + @Override public void onStart() { super.onStart(); @@ -245,18 +236,71 @@ public class AirKissUtil { @Override public void onError(Throwable e) { - ToastUtil.show(activity, "连接失败: " + e.getMessage()); - LogUtils.d("LHD received 连接失败: "+e.getMessage()); + Toast.makeText(curActivity, "连接失败: " + e.getMessage(), Toast.LENGTH_SHORT).show(); mDialog.dismiss(); } @Override public void onNext(String s) { - ToastUtil.show(activity, "收到的UDP包:" + s); - doPostBindDevice(); + if ("success".equals(s)) { + Toast.makeText(curActivity, "配网成功:", Toast.LENGTH_SHORT).show(); + } + } + }); + } + + private void receivePackage(AirKissEncoder airKissEncoder, Subscriber subscriber) { + byte[] buffer = new byte[15000]; + DatagramSocket udpServerSocket = null; + char mRandomChar = airKissEncoder.getRandomChar();//获取UDP数据包中的随机字符 + try { + int replyByteCounter = 0; + udpServerSocket = new DatagramSocket(10000); + udpServerSocket.setSoTimeout(1000 * 60);//设置超时时间 + DatagramPacket packet = new DatagramPacket(buffer, buffer.length); + while (true) { + udpServerSocket.receive(packet); + + if(!packet.getAddress().getHostAddress().equals(WifiUtil.intToIp(wifiUtil.getConnectIpAddress()))){ + byte[] receivedData = packet.getData(); + Log.d("LHD","收到消息:"+ Arrays.toString(receivedData)); + + if (receivedData!=null){ + String mac = ByteUtil.parseBssid( + receivedData, + 1, + 6); + device_mac = mac; + LogUtils.d("LHD 获取到的mac地址 = "+mac); + if (!TextUtils.isEmpty(device_mac)){ + stopAirKiss(); + doPostBindDevice(); + } } - }); + for (byte b : receivedData) { + if (b == mRandomChar) + replyByteCounter++; + } + if (replyByteCounter > REPLY_BYTE_CONFIRM_TIMES) { + subscriber.onNext("success"); + break; + } + + } + + } + subscriber.onCompleted(); + } catch (SocketException e) { + subscriber.onError(e); + e.printStackTrace(); + } catch (IOException e) { + subscriber.onError(e); + e.printStackTrace(); + } finally { + udpServerSocket.close(); + udpServerSocket.disconnect(); + } } /** @@ -346,8 +390,18 @@ public class AirKissUtil { } } + public void stopAirKiss() { + if (sendSocket != null) { + sendSocket.close(); + sendSocket.disconnect(); + } + if (udpReceiver != null) { + udpReceiver.stopRunning(); + } + } public void unSubscribe() { + stopAirKiss(); if (sendSubscribe != null && sendSubscribe.isUnsubscribed()) { sendSubscribe.unsubscribe(); } @@ -466,7 +520,7 @@ public class AirKissUtil { 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)){ + } else if (Device.TYPE_4F.equals(type) || Device.TYPE_5F.equals(type)) { i.setClass(curActivity, MainSix_4F_ControlActivity.class); } else { if (controlAmount == null) {//如果控制器返回空 则默认给三控的页面 @@ -541,7 +595,7 @@ public class AirKissUtil { }; private void resetWifiContentView() { - ToastUtil.show(curActivity,"重置联网view"); + ToastUtil.show(curActivity, "重置联网view"); } Handler doPostBindDeviceHandler = new Handler() { @@ -610,7 +664,7 @@ public class AirKissUtil { 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)){ + } else if (Device.TYPE_4F.equals(type) || Device.TYPE_5F.equals(type)) { i.setClass(curActivity, MainSix_4F_ControlActivity.class); } else { if (controlAmount == null) {//如果控制器返回空 则默认给三控的页面 @@ -700,4 +754,61 @@ public class AirKissUtil { } }; + + private IEsptouchTask mEsptouchTask; + private CountDownTimer wifiTimer; + private boolean isTimeout = true; + + public void stopTimer() { + if (wifiTimer != null) { + wifiTimer.cancel(); + } + } + + private class EsptouchAsyncTask2 extends AsyncTask { + @Override + protected void onPreExecute() { + } + + @Override + protected IEsptouchResult doInBackground(String... params) { + String apSsid = params[0]; + String apBssid = params[1]; + String apPassword = params[2]; + String isSsidHiddenStr = params[3]; + + L.i(apSsid + apBssid + apPassword + isSsidHiddenStr); + mEsptouchTask = new EsptouchTask(apSsid, apBssid, apPassword, curActivity); + IEsptouchResult result = mEsptouchTask.executeForResult(); + return result; + } + + @Override + protected void onPostExecute(IEsptouchResult result) { + stopTimer(); + if (isTimeout) { + try { + if (!result.isCancelled()) { + if (result.isSuc()) { + device_mac = ""; + device_mac = result.getBssid(); + + L.i("LHD 绑定的Mac地址" + device_mac); +// doPostBindDevice(); + } else { + ToastUtil.show(curActivity, "绑定设备失败 请重试"); + } + } else { + ToastUtil.show(curActivity, "绑定设备失败 请重试"); + } + } catch (Exception e) { + ToastUtil.show(curActivity, "绑定设备失败 请重试"); + } + } else { + // + } + } + } + + } diff --git a/iFish7/src/main/java/com/ifish/activity/newbind/DeviceUtils.java b/iFish7/src/main/java/com/ifish/activity/newbind/DeviceUtils.java new file mode 100644 index 000000000..4d6e236d4 --- /dev/null +++ b/iFish7/src/main/java/com/ifish/activity/newbind/DeviceUtils.java @@ -0,0 +1,89 @@ +package com.ifish.activity.newbind; + +import android.content.Context; +import android.content.pm.ApplicationInfo; +import android.net.ConnectivityManager; +import android.net.NetworkInfo; +import android.net.wifi.WifiInfo; +import android.net.wifi.WifiManager; +import android.os.Build; +import android.util.Log; +import android.view.View; +import android.view.inputmethod.InputMethodManager; + +public class DeviceUtils { + + /** + * 隐藏软键盘 + *

+ * {@link InputMethodManager#hideSoftInputFromWindow}第一个参数如果使用getCurrentFocus.getWindowToken,在使用模拟器调试时, + * 存在获取不到焦点的情况,故会出现空指针异常。 + * + * @param view 任意一个当前layout的view + */ + public static void hideKeyboard(View view) { + InputMethodManager inputMethodManager = (InputMethodManager) view.getContext() + .getSystemService(Context.INPUT_METHOD_SERVICE); + if (inputMethodManager != null) { + inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(), 0); + } + } + + /** + * 判断网络连接是否是WiFi,否则返回false + */ + public static boolean isWifi(Context context) { + ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); + if (cm != null) { + NetworkInfo netInfo = cm.getActiveNetworkInfo(); + if (netInfo != null && netInfo.isConnected()) { + return netInfo.getType() == ConnectivityManager.TYPE_WIFI; + } + } + return false; + } + + + public static String getSSID(Context context) { + String ssid = "unknown id"; + //android 8.1 + if (Build.VERSION.SDK_INT == Build.VERSION_CODES.O_MR1){ + ConnectivityManager connManager = (ConnectivityManager) context.getApplicationContext(). + getSystemService(Context.CONNECTIVITY_SERVICE); + assert connManager != null; + NetworkInfo networkInfo = connManager.getActiveNetworkInfo(); + if (networkInfo.isConnected()){ + Log.e("DeviceUtils", "getSSID111: "+ networkInfo.getExtraInfo() ); + if (networkInfo.getExtraInfo() != null){ + return networkInfo.getExtraInfo().replace("\"",""); + } + } + }else { + if (isWifi(context)){ + final WifiManager wifiManager = (WifiManager) context.getApplicationContext().getSystemService(Context.WIFI_SERVICE); + WifiInfo connectionInfo = null; + if (wifiManager != null) { + connectionInfo = wifiManager.getConnectionInfo(); + } + if (connectionInfo != null) { + ssid = connectionInfo.getSSID(); + Log.e("DeviceUtils", "getSSID: "+ssid ); + if (ssid.startsWith("\"") && ssid.endsWith("\"")) { + ssid = ssid.replaceAll("^\"|\"$", ""); + } + } + } + } + return ssid; + } + + public static boolean isApkDebuggable(Context context){ + try { + ApplicationInfo info = context.getApplicationInfo(); + return (info.flags & ApplicationInfo.FLAG_DEBUGGABLE)!=0; + }catch (Exception e){ + e.printStackTrace(); + } + return false; + } +} 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 d2dea3ba8..5a0596a9a 100644 --- a/iFish7/src/main/java/com/ifish/activity/newbind/NewBindDeviceActivity.java +++ b/iFish7/src/main/java/com/ifish/activity/newbind/NewBindDeviceActivity.java @@ -1,6 +1,12 @@ package com.ifish.activity.newbind; +import android.Manifest; +import android.app.Activity; +import android.app.AlertDialog; +import android.content.DialogInterface; import android.content.Intent; +import android.content.pm.PackageManager; +import android.os.Build; import android.os.Bundle; import android.provider.Settings; import android.text.TextUtils; @@ -11,6 +17,7 @@ import android.widget.LinearLayout; import android.widget.ProgressBar; import android.widget.TextView; +import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import com.ifish.activity.BindCameraActivity; @@ -62,7 +69,7 @@ public class NewBindDeviceActivity extends AppCompatActivity { //---------------工具类--------------------// private CheckWifiUtil checkWifiUtil; private AirKissUtil airKissUtil; - + private String bssid = ""; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -76,7 +83,7 @@ public class NewBindDeviceActivity extends AppCompatActivity { airKissUtil.init(this); devicetype = getIntent().getStringExtra("devicetype"); //默认AP连网 - curConnectType = ConnectType.APConnect; + curConnectType = ConnectType.AirKiss; switchUIConnectType(curConnectType); EventBus.getDefault().register(this); } @@ -95,7 +102,7 @@ public class NewBindDeviceActivity extends AppCompatActivity { } } tvWifiName.setText(wifiname); - + bssid = wifiAdmin.getBSSID(); if (!TextUtils.isEmpty(wifiname)) { String pwd = KVUtil.getString(wifiname, ""); tvWifiPwd.setText(pwd); @@ -212,6 +219,7 @@ public class NewBindDeviceActivity extends AppCompatActivity { lineApTip.setVisibility(View.GONE); //通用提示布局 tvTips.setVisibility(View.VISIBLE); + airKissUtil.stopAirKiss(); } /** @@ -250,6 +258,7 @@ public class NewBindDeviceActivity extends AppCompatActivity { * 根据连接类型去连接设备 */ public void connectDevice() { + airKissUtil.stopAirKiss(); //根据选择的连网类型跳转不同的逻辑 String ssid = tvWifiName.getText().toString(); String pwd = tvWifiPwd.getText().toString(); @@ -288,7 +297,7 @@ public class NewBindDeviceActivity extends AppCompatActivity { case AirKiss: // 处理AirKiss逻辑 ToastUtil.show(NewBindDeviceActivity.this, "开始AirKiss连网..."); - airKissUtil.connectDeviceByAirKiss(this,ssid,pwd); + airKissUtil.connectDeviceByAirKiss(this,ssid,bssid,pwd); break; } } @@ -328,4 +337,44 @@ public class NewBindDeviceActivity extends AppCompatActivity { finish(); } + + //检查位置权限 + public boolean checkPermission(Activity context) { + //9.0以前版本获取wifi ssid不用申请此权限 + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.P) { + return true; + } + int result = context.checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION); + if (result == PackageManager.PERMISSION_GRANTED) { + return true; + } + String[] permission = {Manifest.permission.ACCESS_COARSE_LOCATION}; + context.requestPermissions(permission, 1001); + return false; + } + + @Override + public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults); + if (requestCode == 1001) { + if (grantResults.length > 0 && PackageManager.PERMISSION_GRANTED == grantResults[0]) { + if (DeviceUtils.isWifi(this)) { +// ssidET.setText(DeviceUtils.getSSID(this)); + } + } else { + AlertDialog.Builder alertDialog = new AlertDialog.Builder(this); + alertDialog.setTitle("权限拒绝"); + alertDialog.setMessage("请在设置中打开此应用的位置权限后重试"); + alertDialog.setCancelable(false); + alertDialog.setPositiveButton("确定", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + finish(); + } + }); + alertDialog.show(); + } + } + } + } \ No newline at end of file diff --git a/iFish7/src/main/java/com/ifish/airkiss/UDPReceiver.java b/iFish7/src/main/java/com/ifish/airkiss/UDPReceiver.java index 5d79d48fc..05ae13cff 100644 --- a/iFish7/src/main/java/com/ifish/airkiss/UDPReceiver.java +++ b/iFish7/src/main/java/com/ifish/airkiss/UDPReceiver.java @@ -3,9 +3,11 @@ package com.ifish.airkiss; import android.util.Log; import com.ifish.utils.WifiUtil; +import com.lidroid.xutils.util.LogUtils; import java.net.DatagramPacket; import java.net.DatagramSocket; +import java.net.InetSocketAddress; import java.net.SocketException; import java.nio.charset.StandardCharsets; @@ -16,7 +18,7 @@ import java.nio.charset.StandardCharsets; */ // 创建一个接收器类 public class UDPReceiver extends Thread { - private static final int MAX_UDP_DATAGRAM_LEN = 1500; + private static final int MAX_UDP_DATAGRAM_LEN = 15000; private DatagramSocket mSocket; private boolean mRunning; private UdpCallback resultBack; @@ -32,7 +34,9 @@ public class UDPReceiver extends Thread { mSocket = null; } // 创建一个UDP套接字 - mSocket = new DatagramSocket(10000); + mSocket = new DatagramSocket(null); + mSocket.bind(new InetSocketAddress(10000)); + mSocket.setSoTimeout(1000 * 60); } catch (SocketException e) { e.printStackTrace(); } @@ -46,15 +50,22 @@ public class UDPReceiver extends Thread { while (mRunning) { try { + LogUtils.d("LHD 开始接受"); // 接收UDP数据包 mSocket.receive(packet); -// String hexString = Str_Hex.byte2hex(packet.getData()); - String data = new String(packet.getData(), 0, packet.getLength(), StandardCharsets.UTF_8); - Log.e("test9999999990","收到的udp包 ip=" + packet.getAddress().getHostAddress()); + String ip3 = WifiUtil.intToIp(wifiUtil.getConnectIpAddress()); + LogUtils.d("LHD 开始接受 = "+" ip3 = "+ip3); +// Log.e("LHD test9999999990","收到的udp包 ip=" + packet.getAddress().getHostAddress()+" ip3 = "+ip3); // 处理接收到的数据 if(!packet.getAddress().getHostAddress().equals(WifiUtil.intToIp(wifiUtil.getConnectIpAddress()))){ - handleData(data); + String data = new String(packet.getData(), 0, packet.getLength(), StandardCharsets.UTF_8); + String hexString = Str_Hex.byte2hex(packet.getData()); + handleData(hexString); } + }catch (SocketException e) { + LogUtils.d("LHD SocketException : " + e.getLocalizedMessage()); + handleErrorData(e.toString()); + e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); handleErrorData(e.toString()); @@ -79,6 +90,7 @@ public class UDPReceiver extends Thread { } private void handleErrorData(String data) { + stopRunning(); // 处理接收到的数据 if(resultBack != null){ resultBack.onError(data); diff --git a/iFish7/src/main/java/com/ifish/utils/ToastUtil.java b/iFish7/src/main/java/com/ifish/utils/ToastUtil.java index d2637ab52..143d14e09 100644 --- a/iFish7/src/main/java/com/ifish/utils/ToastUtil.java +++ b/iFish7/src/main/java/com/ifish/utils/ToastUtil.java @@ -37,6 +37,11 @@ public class ToastUtil { public static void show( Context context,CharSequence text) { showToast(context.getApplicationContext(),text, false); } + + public static void showLong( Context context,CharSequence text) { + showLongToast(context.getApplicationContext(),text, false); + } + /** * 特殊情况显示的toast */ @@ -92,6 +97,16 @@ public class ToastUtil { tipToast.show(); } + public static void showLongToast(Context context, CharSequence message, boolean isShowIco) { + if (tipToast == null) { + tipToast = TipsToast.makeText(context, message, Toast.LENGTH_LONG); + } else { + tipToast.setText(message); + } +// tipToast.setIsShowIco(isShowIco); + tipToast.show(); + } + // public static void showToast(int message) { // showToast(BaseApplication.getInstance().getString(message), false); // }