| package com.dayu.henanlibrary; | 
|   | 
| import android.app.Application; | 
| import android.os.Handler; | 
| import android.os.Message; | 
| import android.text.TextUtils; | 
| import android.util.Log; | 
|   | 
| import com.dayu.baselibrary.tools.BcdUtil; | 
| import com.dayu.baselibrary.tools.HexUtil; | 
| import com.dayu.baselibrary.utils.CRC8; | 
| import com.dayu.henanlibrary.utils.DeviceNumberUtils; | 
| import com.dayu.baselibrary.utils.ToastUtil; | 
| import com.dayu.henanlibrary.dao.HNBaseDaoSingleton; | 
| import com.dayu.henanlibrary.dbBean.IpBean; | 
| import com.dayu.henanlibrary.net.CallbackIDFactoryImpl; | 
| import com.dayu.henanlibrary.net.ScoketMessageProtocol; | 
| import com.dayu.henanlibrary.net.SocketCallBack; | 
| import com.dayu.henanlibrary.net.SocketData; | 
| import com.dayu.henanlibrary.net.SocketNet; | 
| import com.dayu.henanlibrary.socketBean.ConfirmMachineRequestBean; | 
| import com.dayu.henanlibrary.socketBean.InitMachineBackBean; | 
| import com.dayu.henanlibrary.socketBean.InitMachineRequestBean; | 
| import com.dayu.henanlibrary.utils.SocketUtil; | 
| import com.easysocket.EasySocket; | 
| import com.easysocket.config.EasySocketOptions; | 
| import com.easysocket.entity.SocketAddress; | 
|   | 
| import java.net.InetAddress; | 
| import java.util.Arrays; | 
|   | 
| public class HeNanApplication { | 
|     public static String TAG = "MyApplication"; | 
|     public static HeNanApplication myApplication; | 
|     public Application application; | 
|     SocketNet.CreateBack createBack; | 
|     //是否正在请求初始化接口 | 
|     public boolean isDoInitMachine = false; | 
|     //是否连接服务器成功 | 
|     public boolean isConncet = false; | 
|   | 
|     //每次启动程序只去注册一遍,不再重新注册。 | 
|     public static boolean isCreate = false; | 
|   | 
|   | 
|     public static HeNanApplication getInstance() { | 
|         if (myApplication == null) { | 
|             myApplication = new HeNanApplication(); | 
|         } | 
|         return myApplication; | 
|     } | 
|   | 
|   | 
|     public IpBean ipBean; | 
|   | 
|     /** | 
|      * 初始化EasySocket | 
|      */ | 
|     public void initEasySocket(boolean isCreate, SocketNet.CreateBack createBack) { | 
|         try { | 
| //            this.createBack = createBack; | 
|             try { | 
|                 ipBean = HNBaseDaoSingleton.getInstance(HeNanApplication.myApplication.application).ipDao().findFirst(); | 
|             } catch (Exception e) { | 
|                 e.printStackTrace(); | 
|             } | 
|             if (ipBean == null) { | 
|                 ipBean = new IpBean(); | 
|                 ipBean.setIp("newreceive.hnsjgg.com"); | 
|                 ipBean.setPort(9999); | 
| //                ipBean.setIp("dayuyanjiuyuan.top"); | 
| //                ipBean.setPort(8888); | 
|             } | 
|             if (SocketNet.getInstance().isNetworkAvailable(HeNanApplication.myApplication.application)) { | 
|                 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(), "0", 88); | 
|                                         break; | 
|                                     case 2: | 
|                                         InetAddress[] data = (InetAddress[]) msg.obj; | 
|                                         createSocket(data[0].getHostAddress(), ipBean.getPort(), data[1].getHostAddress(), ipBean.getPort()); | 
|                                         break; | 
|                                     case -1: | 
|                                         ToastUtil.show("DNS解析失败"); | 
|                                         break; | 
|                                 } | 
|   | 
|                             } | 
|                         }); | 
|   | 
|                     } else { | 
|                         //ip方式 | 
|                         if (EasySocket.getInstance().getContext() == null || isCreate) { | 
|                             createSocket(ipBean.getIp(), ipBean.getPort(), "0", 88); | 
|                         } 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(); | 
|                                     } | 
|                                 } | 
|                             } | 
|                         } | 
|   | 
|                     } | 
|                 } | 
|             } else { | 
|                 ToastUtil.show("请检查网络连接"); | 
|             } | 
|   | 
|         } 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)) { | 
|   | 
|             Log.i("initMachineRequestBean", "开始注册设备"); | 
|             if (EasySocket.getInstance().getDefconnection() != null) { | 
|                 isDoInitMachine = true; | 
|                 InitMachineRequestBean initMachineRequestBean = new InitMachineRequestBean(); | 
|                 initMachineRequestBean.setControl("01"); | 
|                 //130107200008    112    青泉居委会 | 
|                 initMachineRequestBean.setAddress(addressCode); | 
|                 initMachineRequestBean.setXuLie(SocketUtil.getXuLie(HeNanApplication.myApplication.application)); | 
|                 initMachineRequestBean.setAFN("91"); | 
|                 SocketNet.getInstance().sendTestMessage(initMachineRequestBean.pack(), "91", 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(HeNanApplication.myApplication.application)); | 
|                             confirmMachineRequestBean.setAFN("92"); | 
|                             confirmMachineRequestBean.setInitCode(initCode); | 
|                             Log.i("Socket", "确认注册报文"); | 
|                             SocketNet.getInstance().sendTestMessage(confirmMachineRequestBean.pack(), "92", new SocketCallBack() { | 
|   | 
|                                 @Override | 
|                                 public void onSocketResponse(SocketData readData) { | 
|                                     isDoInitMachine = false; | 
|                                     HeNanApplication.myApplication.isCreate = true; | 
|                                     if (CRC8.isCRC8(readData.getOriginDataBytes())) { | 
|                                         byte stateByte = readData.getBodyBytes()[2]; | 
|                                         String state = BcdUtil.bcdToStr(stateByte); | 
|                                         //BCD码00成功01失败(注册号不是服务器返回信息) | 
|                                         if (state.equalsIgnoreCase("00")) { | 
|                                             //保存设备注册号 | 
|                                             if (!TextUtils.isEmpty(initCode)) { | 
|                                                 DeviceNumberUtils.setDeviceNumber(initCode); | 
|                                             } | 
|                                             Log.i(TAG, "onSuccess: 设备注册号:" + initCode); | 
| //                                            WSHelper.getInstance(MyApplication.this).put("initCode", initCode); | 
|                                             ToastUtil.show("充值管理注册报文获取成功"); | 
|                                         } else { | 
|                                             Log.i(TAG, "注册失败--- 状态码:" + state); | 
|                                             //校验CRC错误 | 
| //                                            ToastUtil.show("确认收到注册报文状态失败"); | 
|                                         } | 
|                                     } else { | 
|                                         //校验CRC错误 | 
|                                         ToastUtil.show("确认收到注册报文校验CRC错误"); | 
|                                     } | 
|                                 } | 
|   | 
|                                 @Override | 
|                                 public void onSocketError(int code, String msg) { | 
|   | 
|                                 } | 
|                             }); | 
|                         } else {//校验CRC错误 | 
|                             ToastUtil.show("充值管理注册报文校验CRC错误"); | 
|                         } | 
|                     } | 
|   | 
|                     @Override | 
|                     public void onSocketError(int code, String msg) { | 
|   | 
|                     } | 
|                 }); | 
|   | 
|             } | 
|         } | 
|   | 
|     } | 
|   | 
|     private void createSocket(String ip, int port, String backUpIp, int backUpPort) { | 
|         // socket配置 | 
|         EasySocketOptions options = new EasySocketOptions.Builder() | 
|                 // 主机地址,请填写自己的IP地址,以getString的方式是为了隐藏作者自己的IP地址 | 
|                 .setSocketAddress(new SocketAddress(ip, port)) | 
|                 // 定义消息协议,方便解决 socket黏包、分包的问题 | 
|                 .setReaderProtocol(new ScoketMessageProtocol()) | 
|                 .setCallbackIDFactory(new CallbackIDFactoryImpl()) | 
|                 .setMaxWriteBytes(150) | 
|                 .setMaxReadBytes(150) | 
|                 .setRequestTimeout(20 * 1000) | 
|                 .setBackupAddress(new SocketAddress(backUpIp, backUpPort)) | 
|                 .build(); | 
|   | 
|         // 初始化 | 
|         EasySocket.getInstance().createConnection(options, HeNanApplication.myApplication.application);// 创建一个socket连接 | 
|         EasySocket.getInstance().subscribeSocketAction(SocketNet.getInstance().socketNet.socketActionListener); | 
|     } | 
|   | 
|   | 
| } |