package com.doumee.keyCabinet.utils.i485; import android.content.Context; import android.hardware.usb.UsbConstants; import android.hardware.usb.UsbDevice; import android.hardware.usb.UsbInterface; import android.hardware.usb.UsbManager; import java.util.ArrayList; import java.util.List; public class SportUtils { public static List getSerialPortPaths(Context context) { UsbManager usbManager = (UsbManager) context.getSystemService(Context.USB_SERVICE); List devices = new ArrayList<>(usbManager.getDeviceList().values()); List serialPaths = new ArrayList<>(); for (UsbDevice device : devices) { for (int i = 0; i < device.getInterfaceCount(); i++) { UsbInterface intf = device.getInterface(i); if (intf.getInterfaceClass() == UsbConstants.USB_CLASS_CDC_DATA) { serialPaths.add(device.getDeviceName()); break; } } } if(serialPaths.size()==0){ serialPaths.add("/dev/ttyS0"); serialPaths.add("/dev/ttyS1"); serialPaths.add("/dev/ttyS2"); serialPaths.add("/dev/ttyS3"); serialPaths.add("/dev/ttyS4"); serialPaths.add("/dev/ttyS5"); serialPaths.add("/dev/ttyS6"); serialPaths.add("/dev/ttyS7"); } return serialPaths; } /** * 字节数组转16进制 * @param bytes 需要转换的byte数组 * @return 转换后的Hex字符串 */ public static String bytesToHexSimple(byte[] bytes) { StringBuilder sb = new StringBuilder(); for (byte b : bytes) { sb.append(String.format("%02x", b & 0xFF)); } return sb.toString(); } /** * hex字符串转byte数组 * @param inHex 待转换的Hex字符串 * @return 转换后的byte数组结果 */ public static byte[] hexToByteArray(String inHex){ int hexlen = inHex.length(); byte[] result; if (hexlen % 2 == 1){ //奇数 hexlen++; result = new byte[(hexlen/2)]; inHex="0"+inHex; }else { //偶数 result = new byte[(hexlen/2)]; } int j=0; for (int i = 0; i < hexlen; i+=2){ result[j]=hexToByte(inHex.substring(i,i+2)); j++; } return result; } /** * 校验数据是否正确 * @param data * @return */ public static boolean checkData(String data){ if(data.length()>2){ String d = data.substring(0,data.length()-2); String hz = data.substring(data.length()-2,data.length()); if(hz.equals(SportUtils.getBCC(d))){ return true; } } return false; } /** * Hex字符串转byte * @param inHex 待转换的Hex字符串 * @return 转换后的byte */ public static byte hexToByte(String inHex){ return (byte)Integer.parseInt(inHex,16); } public static String getBCC(String hex) { int i = 0, j = 0; int len = hex.length(); short inb[] = new short[len]; for (i = 0; i < len; i++) { inb[i] = charToHex(hex.charAt(i)); //将String里的每一个char转换为Hex } for (i = 0; i < len; i++) { //将每两个Hex合并成一个byte inb[j] = (byte) (((inb[i] << 4) & 0x00f0) | ((inb[i + 1]) & 0x000f)); i++; j++; } byte temp = 0x00; //校验值 for (i = 0; i < len / 2; i++) { //异或 temp ^= inb[i]; } byte[] bytes = new byte[1]; bytes[0] = temp; return byteToStr(bytes, bytes.length); } /** * 接收到的字节数组转换16进制字符串 */ public static String byteToStr(byte[] b, int size) { String ret = ""; for (int i = 0; i < size; i++) { String hex = Integer.toHexString(b[i] & 0xFF); if (hex.length() == 1) { hex = '0' + hex; } ret += hex.toUpperCase(); } return ret; } public static short charToHex(char x) { //将单个char转换为Hex short result = 0; switch (x) { case 'a': result = 10; break; case 'b': result = 11; break; case 'c': result = 12; break; case 'd': result = 13; break; case 'e': result = 14; break; case 'f': result = 15; break; case 'A': result = 10; break; case 'B': result = 11; break; case 'C': result = 12; break; case 'D': result = 13; break; case 'E': result = 14; break; case 'F': result = 15; break; default: result = (short) Character.getNumericValue(x); break; } return result; } public static String intToHex(int n) { //StringBuffer s = new StringBuffer(); StringBuilder sb = new StringBuilder(2); String a; char []b = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}; while(n != 0){ sb = sb.append(b[n%16]); n = n/16; } if(sb.length()==1){ sb.append("0"); } a = sb.reverse().toString(); return a; } /** * 16进制转2进制 * @param hexString * @return */ public static String hexToBinary(String hexString) { StringBuilder binary = new StringBuilder(); for (char c : hexString.toCharArray()) { int value = Character.digit(c, 16); String bits = String.format("%4s", Integer.toBinaryString(value)).replace(' ', '0'); binary.append(bits); } return binary.toString(); } }