package com.dayu.henanlibrary.net; import android.content.Context; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.text.TextUtils; import android.util.Log; import com.dayu.henanlibrary.HeNanApplication; import com.dayu.henanlibrary.activity.HomeActivity; import com.dayu.henanlibrary.dao.HNBaseDaoSingleton; import com.dayu.henanlibrary.dbBean.AdminDataBean; import com.easysocket.EasySocket; import com.easysocket.callback.SimpleCallBack; import com.easysocket.entity.OriginReadData; import com.easysocket.entity.SocketAddress; import com.easysocket.exception.RequestTimeOutException; import com.easysocket.interfaces.conn.ISocketActionListener; import com.easysocket.interfaces.conn.SocketActionListener; import com.easysocket.utils.HexUtil; import com.tencent.bugly.crashreport.CrashReport; /** * Copyright (C), 2022, * Author: zuo * Date: 2022/2/8 21:30 * Description: Socket通信 */ public class SocketNet { public static SocketNet socketNet; SocketCallBack myCallBack; // byte[] dataMessage; boolean isTest = false; Context mContext; CallbackSender mSender; public static SocketNet getInstance() { if (socketNet == null) { socketNet = new SocketNet(); } return socketNet; } /** * 发送一个的消息, */ public void sendTestMessage(byte[] dataMessage, String AFN, SocketCallBack callBack) { myCallBack = callBack; isTest = false; mSender = new CallbackSender(); mSender.setAFN(AFN); mSender.setData(dataMessage); if (isNetworkAvailable(HeNanApplication.myApplication.application)) { // 发送 if (EasySocket.getInstance().getDefconnection() != null) { // EasySocket.getInstance().upMessage(dataMessage); EasySocket.getInstance().upCallbackMessage(mSender).onCallBack(new SimpleCallBack(AFN) { @Override public void onResponse(OriginReadData data) { try { mSender = null; myCallBack = null; Log.i("SocketActionListener", "SimpleCallBack收到数据-->" + HexUtil.bytesToHex(data.getBodyBytes())); SocketData socketData = new SocketData(); socketData.setBodyData(data.getBodyBytes()); socketData.setHeaderData(data.getHeaderData()); // dataMessage = null; if (callBack != null) { callBack.onSocketResponse(socketData); } } catch (Exception e) { e.printStackTrace(); } } @Override public void onError(Exception e) { super.onError(e); mSender = null; myCallBack = null; try { if (e instanceof RequestTimeOutException) { // 在这里执行需要在主线程中执行的操作 callBack.onSocketError(-3, "请求超时,正在重试"); //超时后重新连接 EasySocket.getInstance().disconnect(true); } } catch (Exception ex) { throw new RuntimeException(ex); } } }); } else { callBack.onSocketError(-2, "与服务器连接断开,请检查网络稍后再试"); HeNanApplication.myApplication.initEasySocket(false, null); } } else { callBack.onSocketError(-2, "请检查网络连接"); } } /** * 测试socket是否连接通畅 * * @param context */ public void isConnect(Context context) { Log.i("SocketActionListener", "测试连接"); isTest = true; mContext = context; if (EasySocket.getInstance().getDefOptions().getSocketAddress() != null && !HeNanApplication.myApplication.isDoInitMachine) { // EasySocket.getInstance().disconnect(false); // EasySocket.getInstance().connect(); } else { // ToastUtil.show(mContext, "Socket地址为空"); } } public interface CreateBack { void Success(); void error(); } /** * socket行为监听 */ public ISocketActionListener socketActionListener = new SocketActionListener() { /** * socket连接成功 * @param socketAddress */ @Override public void onSocketConnSuccess(SocketAddress socketAddress) { Log.i("SocketActionListener1111", "连接成功"); HeNanApplication.myApplication.isConncet = true; try { AdminDataBean adminData = HNBaseDaoSingleton.getInstance(HeNanApplication.myApplication.application).adminDao().findFirst(); Log.i("SocketActionListener1111", "isDoInitMachine==" + HeNanApplication.myApplication.isDoInitMachine + ""); //每次连接成功注册一次设备 if (!HeNanApplication.myApplication.isDoInitMachine) { Log.i("SocketActionListener1111", "isDoInitMachine"); if (HeNanApplication.myApplication.ipBean != null && adminData != null) { if (!TextUtils.isEmpty(adminData.getAddressCode()) && !HeNanApplication.myApplication.isCreate) { Log.i("SocketActionListener1111", "initMachineRequestBean"); HeNanApplication.myApplication.initMachineRequestBean(HeNanApplication.myApplication.ipBean.getIp(), HeNanApplication.myApplication.ipBean.getPort(), adminData.getAddressCode()); } } } try { if (mSender != null) { sendTestMessage(mSender.getData(), mSender.getAFN(), myCallBack); } } catch (Exception e) { e.printStackTrace(); } } catch (Exception e) { CrashReport.postCatchedException(e); } rushState(); } /** * socket连接失败 * @param socketAddress * @param isNeedReconnect 是否需要重连 */ @Override public void onSocketConnFail(SocketAddress socketAddress, boolean isNeedReconnect) { HeNanApplication.myApplication.isConncet = false; rushState(); Log.i("SocketActionListener", "socket连接失败"); // if (myCallBack != null) { // myCallBack.onSocketError(-1, "连接数据中心失败,请检查网络"); // } // myCallBack = null; } /** * socket断开连接 * @param socketAddress * @param isNeedReconnect 是否需要重连 */ @Override public void onSocketDisconnect(SocketAddress socketAddress, boolean isNeedReconnect) { Log.i("SocketActionListener", "---> socket断开连接,是否需要重连:" + isNeedReconnect); HeNanApplication.myApplication.isConncet = false; rushState(); try { if (myCallBack != null) { myCallBack.onSocketError(-2, "与服务器连接断开,请检查网络"); } myCallBack = null; } catch (Exception e) { throw new RuntimeException(e); } } /** * socket接收的数据 * @param socketAddress * @param originReadData */ @Override public void onSocketResponse(SocketAddress socketAddress, OriginReadData originReadData) { super.onSocketResponse(socketAddress, originReadData); Log.i("SocketActionListener", "SocketActionListener收到数据-->" + HexUtil.bytesToHex(originReadData.getBodyBytes())); // SocketData socketData = new SocketData(); // socketData.setBodyData(originReadData.getBodyBytes()); // socketData.setHeaderData(originReadData.getHeaderData()); //// dataMessage = null; // if (myCallBack != null) { // myCallBack.onSocketResponse(socketData); // } // myCallBack = null; } }; private void rushState() { try { if (HomeActivity.homeActivity != null) { HomeActivity.homeActivity.rushState(); } } catch (Exception e) { e.printStackTrace(); } } // 检查网络连接是否可用 public boolean isNetworkAvailable(Context context) { if (context != null) { ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); if (connectivityManager != null) { NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo(); return activeNetworkInfo != null && activeNetworkInfo.isConnected(); } } return false; } }