package com.ectrip.cyt.config; import java.io.File; import java.io.IOException; import java.lang.reflect.Method; import java.net.InetAddress; import java.net.NetworkInterface; import java.security.InvalidParameterException; import java.util.ArrayList; import java.util.Enumeration; import com.ectrip.cyt.bean.ConfigBean; import com.ectrip.cyt.db.DbManager; import com.ectrip.cyt.utils.LogUtil; import com.hdx.lib.printer.SerialPrinter; import com.hdx.lib.serial.SerialParam; import com.hdx.lib.serial.SerialPortOperaion; import com.hdx.lib.serial.SerialPortOperaion.SerialReadData; import android.content.Context; import android.content.SharedPreferences; import android.content.res.Configuration; import android.content.res.Resources.NotFoundException; import android.net.wifi.WifiInfo; import android.net.wifi.WifiManager; import android.os.Build; import android.os.Handler; import android.os.Message; import android.telephony.TelephonyManager; import android.text.TextUtils; import android.util.DisplayMetrics; import android.util.Log; import android.view.Display; import android.view.WindowManager; import javax.crypto.Mac; import android_serialport_api.SerialPort; import android_serialport_api.SerialPortFinderHandset; import android_serialport_api.SerialPortHandset; import android_serialport_api.SerialPortNewHandset; import android_serialport_pos_id_api.SerialIdCardPort; /** * 设备信息工具类,获取设备编号,型号等 * * @author Administrator */ public class DevicTool { public SerialPortFinderHandset mSerialPortFinder = new SerialPortFinderHandset(); private SerialPortHandset mSerialPortHandset = null; private static DevicTool tool; private String devId = "";// 设备号 private Context context = MyApp.getInstance(); private DevicTool() { super(); } public static DevicTool getInstance() { if (tool == null) { synchronized (DevicTool.class) { tool = new DevicTool(); } } return tool; } public String getDevId() { if (devId.equals("")) { devId = getDeviceId(); } else if (devId.equals("000000000000000") || devId.equals("00:E0:4C:87:00:00") || devId.equals("00:E0:4C:87:00:00")) { devId = getDeviceId(); } return devId; } /** * @return 获取设备id */ public String getDeviceId() { String devId = ""; ArrayList beans = DbManager.GetConfigs(); if (beans != null && beans.size() > 0) { devId = beans.get(0).getEc_mac(); if (!devId.equals("000000000000000") && !devId.equals("02:00:00:00:00:00")) { return devId; } } if ((getSerialNumber() != null && getSerialNumber().contains("CYT") && getSerialNumber() .substring(0, 3).equals("CYT")) || (getSerialNumber() != null && getSerialNumber().contains("CTY") && getSerialNumber() .substring(0, 3).equals("CTY"))) { devId = getSerialNumber(); } else if ((getSerialNumber() != null && getSerialNumber().contains("LY") && getSerialNumber() .substring(0, 2).equals("LY"))) { devId = getSerialNumber(); } else if ((getSerialNumber() != null && getSerialNumber().contains("DY") && getSerialNumber() .substring(0, 2).equals("DY"))) { devId = getSerialNumber(); } else { if(Build.VERSION.SDK_INT>=28){ devId = getLocalMacIdFromIp(); }else{ devId = getLocalMacAddress(); } if (devId.equals("打开wifi才能获取mac")) { // 在获取一遍mac地址 devId = getLocalMacAddress(); } if (devId.equals("00:E0:4C:87:00:00") || devId.equals("打开wifi才能获取mac") || devId.equals("02:00:00:00:00:00")) { try { devId = ((TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE)) .getDeviceId(); if (devId != null && devId.length() > 0) { if (devId.contains("+ESN:")) { devId = devId.replace("+ESN:", ""); } } if (devId.length() < 15) { int size = 15 - devId.length(); for (int i = 0; i < size; i++) { devId += "0"; } } if (devId.equals("000000000000000") || devId.equals("02:00:00:00:00:00")) { // 如果等于0 devId = ((TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE)) .getDeviceId();//返回pos机的IMEI/SV码 if (devId != null && devId.length() > 0) { if (devId.contains("+ESN:")) { devId = devId.replace("+ESN:", ""); } } if (devId.length() < 15) { int size = 15 - devId.length(); for (int i = 0; i < size; i++) { devId += "0"; } } if (devId.equals("000000000000000") || devId.equals("02:00:00:00:00:00")) { devId = android.os.Build.SERIAL; // 2.3之后才有这儿接口 } } } catch (Exception e) { e.printStackTrace(); devId = android.os.Build.SERIAL; // 2.3之后才有这儿接口 } } } return devId; } public static String getSerialNumber() { String serial = null; try { Class c = Class.forName("android.os.SystemProperties"); Method get = c.getMethod("get", String.class); serial = (String) get.invoke(c, "ro.serialno"); } catch (Exception e) { e.printStackTrace(); } return serial; } public static String getLocalMacIdFromIp(){ String strMacAddr = ""; try { InetAddress ip = getLocalInetAddress(); byte[] b = NetworkInterface.getByInetAddress(ip) .getHardwareAddress(); StringBuffer buffer = new StringBuffer(); for (int i = 0; i < b.length; i++) { if (i != 0) { buffer.append(':'); } String str = Integer.toHexString(b[i]&0xFF); buffer.append(str.length() == 1 ? 0 + str : str); } strMacAddr = buffer.toString().toUpperCase(); } catch (Exception e) { // TODO Auto-generated catch block strMacAddr = "打开wifi才能获取mac"; e.printStackTrace(); } return strMacAddr; } /** * 获取设备本地IP */ protected static InetAddress getLocalInetAddress() { InetAddress ip = null; try { //列举 Enumeration en_netInterface = NetworkInterface.getNetworkInterfaces(); while (en_netInterface.hasMoreElements()) {//是否还有元素 NetworkInterface ni = (NetworkInterface) en_netInterface.nextElement();//得到下一个元素 Enumeration en_ip = ni.getInetAddresses();//得到一个ip地址的列举 while (en_ip.hasMoreElements()) { ip = (InetAddress) en_ip.nextElement(); if (!ip.isLoopbackAddress() && ip.getHostAddress().indexOf(":") == -1) break; else ip = null; } if (ip != null) { break; } } } catch (Exception e) { e.printStackTrace(); } return ip; } /** * @return 打開wifi才能获取mac地址 */ public String getLocalMacAddress() { WifiManager wifi = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); WifiInfo info = wifi.getConnectionInfo(); String mac = info.getMacAddress(); if (TextUtils.isEmpty(mac)) { if (wifi.isWifiEnabled()) { wifi.setWifiEnabled(false); } else { wifi.setWifiEnabled(true); } return "打开wifi才能获取mac"; } else { return mac.toUpperCase(); } } /**************************************************************************/ /** * 判断当前设备是手机还是平板,代码来自 Google I/O App for Android * * @param context * @return 平板返回 True,手机返回 False */ public boolean isTablet(Context context) { return isTabletDevice(context); } private boolean isTabletDevice(Context context) { try { return ((context.getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) >= Configuration.SCREENLAYOUT_SIZE_LARGE) && isPad(); } catch (NotFoundException e) { e.printStackTrace(); } return false; } /** * 判断是否为平板 * * @return */ private boolean isPad() { WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); Display display = wm.getDefaultDisplay(); // 屏幕宽度 // float screenWidth = display.getWidth(); // 屏幕高度 // float screenHeight = display.getHeight(); DisplayMetrics dm = new DisplayMetrics(); display.getMetrics(dm); double x = Math.pow(dm.widthPixels / dm.xdpi, 2); double y = Math.pow(dm.heightPixels / dm.ydpi, 2); // 屏幕尺寸 double screenInches = Math.sqrt(x + y); // 大于6尺寸则为Pad if (screenInches >= 6.5) { return true; } return false; } /* .............................手持机串口............................... */ public SerialPortHandset getSerialPortHandset() throws SecurityException, IOException, InvalidParameterException { if (mSerialPortHandset == null) { String path = "/dev/ttySAC1"; int baudrate = 9600; mSerialPortHandset = new SerialPortHandset(new File(path), baudrate, 0); } return mSerialPortHandset; } /** * 判断二维码读头,根据是否能生成串口对象 */ public boolean isSerialPortHandset() { try { if (getSerialPortHandset() != null) { return true; } else { return false; } } catch (InvalidParameterException e) { e.printStackTrace(); return false; } catch (SecurityException e) { e.printStackTrace(); return false; } catch (IOException e) { e.printStackTrace(); return false; } catch (Exception e) { e.printStackTrace(); return false; } } public void closeSerialPortHandset() { if (mSerialPortHandset != null) { mSerialPortHandset.close(); mSerialPortHandset = null; } } /****************************** 新版手持机 ***************************************/ private SerialPortNewHandset mSerialPortNewHandset = null; public SerialPortNewHandset getSerialPortNewHandset() throws SecurityException, IOException, InvalidParameterException { if (mSerialPortNewHandset == null) { String path = "/dev/ttySAC1"; int baudrate = 9600; mSerialPortNewHandset = new SerialPortNewHandset(new File(path), baudrate, 0); } return mSerialPortNewHandset; } public void closeSerialPortNewHandset() { if (mSerialPortNewHandset != null) { mSerialPortNewHandset.close(); mSerialPortNewHandset = null; } } /* * id pos 打印判断 */ public boolean isIdPosPrint() { try { SerialPrinter mSerialPrinter2 = SerialPrinter.GetSerialPrinter(); mSerialPrinter2.OpenPrinter( new SerialParam(115200, "/dev/ttyS1", 0), new SerialDataHandler(), null); mSerialPrinter2.ClosePrinter(); return true; } catch (Exception e1) { e1.printStackTrace(); return false; } catch (Throwable e) { e.printStackTrace(); return false; } } private class SerialDataHandler extends Handler { public void handleMessage(Message msg) { switch (msg.what) { case SerialPortOperaion.SERIAL_RECEIVED_DATA_MSG: SerialReadData data = (SerialReadData) msg.obj; StringBuilder sb = new StringBuilder(); for (int x = 0; x < data.size; x++) sb.append(String.format("%02x", data.data[x])); } } } public void closeSerialPort() { if (mSerialPort != null) { mSerialPort.close(); mSerialPort = null; } } /* .............................039BPOS机串口............................... */ SerialIdCardPort mSerialIdCardPort = null; public SerialIdCardPort getSerialIdCardPort() throws SecurityException, IOException, InvalidParameterException { if (mSerialIdCardPort == null) { mSerialIdCardPort = new SerialIdCardPort(new File("/dev/ttyS1"), 115200, 0); mSerialIdCardPort.setMaxRFByte((byte) 0x50); } return mSerialIdCardPort; } /* .............................039BPOS机串口............................... */ /* ...............................判断是否是039BPOS机.......................... */ public boolean isPos() { try { if (getSerialIdCardPort() != null) { return true; } else { return false; } } catch (Exception e) { e.printStackTrace(); return false; } } /* ...............................判断是否是039BPOS机.......................... */ /***************************** Pos机 串口,打印 *********************************/ private SerialPort mSerialPort = null; public SerialPort getSerialPort() throws SecurityException, IOException, InvalidParameterException { if (mSerialPort == null) { /* Read serial port parameters */ SharedPreferences sp = context.getSharedPreferences( "android_serialport_api.sample_preferences", Context.MODE_PRIVATE); String path = "/dev/ttyS2"; ;// sp.getString("DEVICE", ""); int baudrate = 115200;// Integer.decode(sp.getString("BAUDRATE", // "-1")); /* Check parameters */ if ((path.length() == 0) || (baudrate == -1)) { // throw new InvalidParameterException(); /* use default value. Nirvana 0710 */ path = "/dev/ttyS2"; baudrate = 115200; } /* Open the serial port */ mSerialPort = new SerialPort(new File(path), baudrate, 0); // (new File(path), baudrate, 0); } return mSerialPort; } public boolean isSerialPort() { try { if (getSerialPort() != null) { return true; } else { return false; } } catch (InvalidParameterException e) { e.printStackTrace(); return false; } catch (SecurityException e) { e.printStackTrace(); return false; } catch (IOException e) { e.printStackTrace(); return false; } } public static boolean isHiboryPos() { try { String sn = android.os.Build.MODEL; LogUtil.d("SN", sn); if (TextUtils.equals(sn, "5501H")) { return true; } else { return false; } } catch (Exception e) { e.printStackTrace(); return false; } } }