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.BaseDaoSingleton;
|
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 = BaseDaoSingleton.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;
|
}
|
|
}
|