package com.dayu.recharge; import android.app.Application; import android.os.Handler; import android.os.Message; import android.text.TextUtils; import android.util.Log; import com.dayu.recharge.dao.BaseDaoSingleton; import com.dayu.recharge.dbBean.IpBean; import com.easysocket.EasySocket; import com.easysocket.config.EasySocketOptions; import com.easysocket.entity.SocketAddress; import com.tencent.bugly.crashreport.CrashReport; import com.dayu.recharge.net.ScoketMessageProtocol; import com.dayu.recharge.net.SocketCallBack; import com.dayu.recharge.net.SocketData; import com.dayu.recharge.net.SocketNet; import com.dayu.recharge.socketBean.ConfirmMachineRequestBean; import com.dayu.recharge.socketBean.InitMachineBackBean; import com.dayu.recharge.socketBean.InitMachineRequestBean; import com.dayu.recharge.tools.BcdUtil; import com.dayu.recharge.tools.HexUtil; import com.dayu.recharge.utils.AidlUtil; import com.dayu.recharge.utils.CRC8; import com.dayu.recharge.utils.SocketUtil; import com.dayu.recharge.utils.ToastUtil; import com.dayu.recharge.utils.WSHelper; import java.util.Arrays; import java.util.Timer; import java.util.TimerTask; public class MyApplication extends Application { public static MyApplication myApplication; private String address; SocketNet.CreateBack createBack; //是否正在请求初始化接口 public boolean isDoInitMachine = false; //是否连接服务器成功 public boolean isConncet = false; private final Timer timer = new Timer(); @Override public void onCreate() { super.onCreate(); myApplication = this; isAidl = true; AidlUtil.getInstance().connectPrinterService(this); initEasySocket(false, null); socketConnect(); CrashReport.initCrashReport(getApplicationContext(), "846987eae9", true); } private boolean isAidl; public boolean isAidl() { return isAidl; } public void setAidl(boolean aidl) { isAidl = aidl; } /** * 初始化EasySocket */ public void initEasySocket(boolean isCreate, SocketNet.CreateBack createBack) { try { this.createBack = createBack; IpBean ipBean = BaseDaoSingleton.getInstance(MyApplication.myApplication).ipDao().findFirst(); if (ipBean != null) { try { //处理当连接上IP后修改ip不生效问题 if (EasySocket.getInstance().getDefconnection() != null) { SocketAddress address = EasySocket.getInstance().getDefconnection().getOptions().getSocketAddress(); if (address != null) { if (!address.getIp().equals(ipBean.getIp()) || address.getPort() != ipBean.getPort()) { EasySocket.getInstance().destroyConnection(); } } } } catch (Exception e) { e.printStackTrace(); } if (!SocketUtil.isInteger(ipBean.getIp())) { //域名方式 SocketUtil.parseHostGetIPAddress(ipBean.getIp(), new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what) { case 1: createSocket(msg.obj + "", ipBean.getPort()); break; case 2: ToastUtil.show(MyApplication.this, "DNS解析失败"); break; } } }); } else { //ip方式 if (EasySocket.getInstance().getContext() == null || isCreate) { createSocket(ipBean.getIp(), ipBean.getPort()); } else { if (EasySocket.getInstance().getDefconnection() != null) { SocketAddress address = EasySocket.getInstance().getDefconnection().getOptions().getSocketAddress(); if (address != null) { if (!address.getIp().equals(ipBean.getIp()) || address.getPort() != ipBean.getPort()) { EasySocket.getInstance().destroyConnection(); } } } } } } } catch (Exception e) { e.printStackTrace(); } } /** * 充值管理机注册 */ public void initMachineRequestBean(String ip, int port, String addressCode) { if (!TextUtils.isEmpty(ip) && !TextUtils.isEmpty(String.valueOf(port)) && !TextUtils.isEmpty(addressCode)) { isDoInitMachine = true; InitMachineRequestBean initMachineRequestBean = new InitMachineRequestBean(); initMachineRequestBean.setControl("01"); //130107200008 112 青泉居委会 initMachineRequestBean.setAddress(addressCode); initMachineRequestBean.setXuLie(SocketUtil.getXuLie(this)); initMachineRequestBean.setAFN("91"); // Log.i("Socket", "注册报文"); SocketNet.getInstance().sendTestMessage(initMachineRequestBean.pack(), new SocketCallBack() { @Override public void onSocketResponse(SocketData readData) { if (CRC8.isCRC8(readData.getOriginDataBytes())) { //校验CRC成功 InitMachineBackBean initMachineBackBean = new InitMachineBackBean(); String initCode = HexUtil.bytesToHex(Arrays.copyOfRange(readData.getBodyBytes(), 2, 18)); //确认收到注册号报文 ConfirmMachineRequestBean confirmMachineRequestBean = new ConfirmMachineRequestBean(); confirmMachineRequestBean.setControl("01"); //130107200008 112 青泉居委会 confirmMachineRequestBean.setAddress(addressCode); confirmMachineRequestBean.setXuLie(SocketUtil.getXuLie(MyApplication.this)); confirmMachineRequestBean.setAFN("92"); confirmMachineRequestBean.setInitCode(initCode); Log.i("Socket", "确认注册报文"); SocketNet.getInstance().sendTestMessage(confirmMachineRequestBean.pack(), new SocketCallBack() { @Override public void onSocketResponse(SocketData readData) { isDoInitMachine = false; if (CRC8.isCRC8(readData.getOriginDataBytes())) { byte stateByte = readData.getBodyBytes()[2]; String state = BcdUtil.bcdToStr(stateByte); //BCD码00成功01失败(注册号不是服务器返回信息) if (state.equalsIgnoreCase("00")) { //保存设备注册号 BaseDaoSingleton.getInstance(MyApplication.myApplication).ipDao().findFirst(); WSHelper.getInstance(MyApplication.this).put("initCode", initCode); ToastUtil.show(MyApplication.this, "充值管理注册报文获取成功"); } else { //校验CRC错误 ToastUtil.show(MyApplication.this, "确认收到注册报文状态失败"); } } else { //校验CRC错误 ToastUtil.show(MyApplication.this, "确认收到注册报文校验CRC错误"); } } @Override public void onSocketError(int code, String msg) { } }); } else {//校验CRC错误 ToastUtil.show(MyApplication.this, "充值管理注册报文校验CRC错误"); } } @Override public void onSocketError(int code, String msg) { } }); } } private void createSocket(String ip, int port) { // socket配置 EasySocketOptions options = new EasySocketOptions.Builder() // 主机地址,请填写自己的IP地址,以getString的方式是为了隐藏作者自己的IP地址 .setSocketAddress(new SocketAddress(ip, port)) // 定义消息协议,方便解决 socket黏包、分包的问题 .setReaderProtocol(new ScoketMessageProtocol()) .setMaxWriteBytes(1024) .setMaxReadBytes(1024) .setRequestTimeout(10 * 1000) .build(); // 初始化 EasySocket.getInstance().createConnection(options, this);// 创建一个socket连接 // EasySocket.getInstance().subscribeSocketAction(socketActionListener); EasySocket.getInstance().subscribeSocketAction(SocketNet.getInstance().socketNet.socketActionListener); } /** * 定时重连服务器 */ private void socketConnect() { try { TimerTask task = new TimerTask() { @Override public void run() { // TODO Auto-generated method stub Message message = new Message(); message.what = 1; handler.sendMessage(message); } }; // timer.schedule(task, 5000, 1000 * 60 * 3); timer.schedule(task, 5000, 1000 * 60 * 3); } catch (Exception e) { e.printStackTrace(); } } Handler handler = new Handler() { @Override public void handleMessage(Message msg) { // TODO Auto-generated method stub // 要做的事情 super.handleMessage(msg); try { SocketNet.getInstance().isConnect(MyApplication.this); } catch (Exception e) { e.printStackTrace(); } } }; }