描述:Log工具,类似android.util.Log。
26 | * tag自动产生,格式: customTagPrefix:className.methodName(L:lineNumber), 27 | * customTagPrefix为空时只输出:className.methodName(L:lineNumber)。 28 | * 29 | * 30 | * @author ~若相惜 31 | * @version v1.0 32 | * @date 2015-8-25 下午1:57:44 33 | */ 34 | public class LogUtil { 35 | 36 | public static String customTagPrefix = "HetCommonUsbSerialSdk"; 37 | 38 | private LogUtil() { 39 | } 40 | 41 | public static boolean allowD = true; 42 | public static boolean allowE = true; 43 | public static boolean allowI = true; 44 | public static boolean allowV = true; 45 | public static boolean allowW = true; 46 | public static boolean allowWtf = true; 47 | 48 | private static String generateTag(StackTraceElement caller) { 49 | String tag = "%s.%s(L:%d)"; 50 | String callerClazzName = caller.getClassName(); 51 | callerClazzName = callerClazzName.substring(callerClazzName.lastIndexOf(".") + 1); 52 | tag = String.format(tag, callerClazzName, caller.getMethodName(), caller.getLineNumber()); 53 | tag = TextUtils.isEmpty(customTagPrefix) ? tag : customTagPrefix + ":" + tag; 54 | return tag; 55 | } 56 | 57 | public static CustomLogger customLogger; 58 | 59 | public interface CustomLogger { 60 | void d(String tag, String content); 61 | 62 | void d(String tag, String content, Throwable tr); 63 | 64 | void e(String tag, String content); 65 | 66 | void e(String tag, String content, Throwable tr); 67 | 68 | void i(String tag, String content); 69 | 70 | void i(String tag, String content, Throwable tr); 71 | 72 | void v(String tag, String content); 73 | 74 | void v(String tag, String content, Throwable tr); 75 | 76 | void w(String tag, String content); 77 | 78 | void w(String tag, String content, Throwable tr); 79 | 80 | void w(String tag, Throwable tr); 81 | 82 | void wtf(String tag, String content); 83 | 84 | void wtf(String tag, String content, Throwable tr); 85 | 86 | void wtf(String tag, Throwable tr); 87 | } 88 | 89 | public static void d(String content) { 90 | if (!allowD) return; 91 | StackTraceElement caller = getCallerStackTraceElement(); 92 | String tag = generateTag(caller); 93 | 94 | if (customLogger != null) { 95 | customLogger.d(tag, content); 96 | } else { 97 | Log.d(tag, content); 98 | } 99 | } 100 | 101 | public static StackTraceElement getCallerStackTraceElement() { 102 | return Thread.currentThread().getStackTrace()[4]; 103 | } 104 | 105 | public static void d(String content, Throwable tr) { 106 | if (!allowD) return; 107 | StackTraceElement caller = getCallerStackTraceElement(); 108 | String tag = generateTag(caller); 109 | 110 | if (customLogger != null) { 111 | customLogger.d(tag, content, tr); 112 | } else { 113 | Log.d(tag, content, tr); 114 | } 115 | } 116 | 117 | public static void e(String content) { 118 | if (!allowE) return; 119 | StackTraceElement caller = getCallerStackTraceElement(); 120 | String tag = generateTag(caller); 121 | 122 | if (customLogger != null) { 123 | customLogger.e(tag, content); 124 | } else { 125 | Log.e(tag, content); 126 | } 127 | } 128 | 129 | public static void e(String content, Throwable tr) { 130 | if (!allowE) return; 131 | StackTraceElement caller = getCallerStackTraceElement(); 132 | String tag = generateTag(caller); 133 | 134 | if (customLogger != null) { 135 | customLogger.e(tag, content, tr); 136 | } else { 137 | Log.e(tag, content, tr); 138 | } 139 | } 140 | 141 | public static void i(String content) { 142 | if (!allowI) return; 143 | StackTraceElement caller = getCallerStackTraceElement(); 144 | String tag = generateTag(caller); 145 | 146 | if (customLogger != null) { 147 | customLogger.i(tag, content); 148 | } else { 149 | Log.i(tag, content); 150 | } 151 | } 152 | 153 | public static void i(String content, Throwable tr) { 154 | if (!allowI) return; 155 | StackTraceElement caller = getCallerStackTraceElement(); 156 | String tag = generateTag(caller); 157 | 158 | if (customLogger != null) { 159 | customLogger.i(tag, content, tr); 160 | } else { 161 | Log.i(tag, content, tr); 162 | } 163 | } 164 | 165 | public static void v(String content) { 166 | if (!allowV) return; 167 | StackTraceElement caller = getCallerStackTraceElement(); 168 | String tag = generateTag(caller); 169 | 170 | if (customLogger != null) { 171 | customLogger.v(tag, content); 172 | } else { 173 | Log.v(tag, content); 174 | } 175 | } 176 | 177 | public static void v(String content, Throwable tr) { 178 | if (!allowV) return; 179 | StackTraceElement caller = getCallerStackTraceElement(); 180 | String tag = generateTag(caller); 181 | 182 | if (customLogger != null) { 183 | customLogger.v(tag, content, tr); 184 | } else { 185 | Log.v(tag, content, tr); 186 | } 187 | } 188 | 189 | public static void w(String content) { 190 | if (!allowW) return; 191 | StackTraceElement caller = getCallerStackTraceElement(); 192 | String tag = generateTag(caller); 193 | 194 | if (customLogger != null) { 195 | customLogger.w(tag, content); 196 | } else { 197 | Log.w(tag, content); 198 | } 199 | } 200 | 201 | public static void w(String content, Throwable tr) { 202 | if (!allowW) return; 203 | StackTraceElement caller = getCallerStackTraceElement(); 204 | String tag = generateTag(caller); 205 | 206 | if (customLogger != null) { 207 | customLogger.w(tag, content, tr); 208 | } else { 209 | Log.w(tag, content, tr); 210 | } 211 | } 212 | 213 | public static void w(Throwable tr) { 214 | if (!allowW) return; 215 | StackTraceElement caller = getCallerStackTraceElement(); 216 | String tag = generateTag(caller); 217 | 218 | if (customLogger != null) { 219 | customLogger.w(tag, tr); 220 | } else { 221 | Log.w(tag, tr); 222 | } 223 | } 224 | 225 | public static void wtf(String content) { 226 | if (!allowWtf) return; 227 | StackTraceElement caller = getCallerStackTraceElement(); 228 | String tag = generateTag(caller); 229 | 230 | if (customLogger != null) { 231 | customLogger.wtf(tag, content); 232 | } else { 233 | Log.wtf(tag, content); 234 | } 235 | } 236 | 237 | public static void wtf(String content, Throwable tr) { 238 | if (!allowWtf) return; 239 | StackTraceElement caller = getCallerStackTraceElement(); 240 | String tag = generateTag(caller); 241 | 242 | if (customLogger != null) { 243 | customLogger.wtf(tag, content, tr); 244 | } else { 245 | Log.wtf(tag, content, tr); 246 | } 247 | } 248 | 249 | public static void wtf(Throwable tr) { 250 | if (!allowWtf) return; 251 | StackTraceElement caller = getCallerStackTraceElement(); 252 | String tag = generateTag(caller); 253 | 254 | if (customLogger != null) { 255 | customLogger.wtf(tag, tr); 256 | } else { 257 | Log.wtf(tag, tr); 258 | } 259 | } 260 | 261 | } 262 | -------------------------------------------------------------------------------- /commonusbserialsdk/src/main/java/com/lgh/commonusbserialsdk/CommonUsbSerialSdk.java: -------------------------------------------------------------------------------- 1 | package com.lgh.commonusbserialsdk; 2 | 3 | import android.content.Context; 4 | import android.hardware.usb.UsbDevice; 5 | 6 | import com.lgh.commonusbserialsdk.listen.UsbConnectListener; 7 | import com.lgh.commonusbserialsdk.listen.UsbSerialListener; 8 | import com.lgh.commonusbserialsdk.thread.BaseThread; 9 | import com.lgh.commonusbserialsdk.thread.ReadThread; 10 | import com.lgh.commonusbserialsdk.thread.WriteThread; 11 | import com.lgh.commonusbserialsdk.usb.UsbManagerUtil; 12 | import com.lgh.commonusbserialsdk.usb.CustomUsbPort; 13 | import com.lgh.commonusbserialsdk.usb.IDeviceFilter; 14 | import com.lgh.commonusbserialsdk.usb.PortType; 15 | import com.lgh.commonusbserialsdk.utils.LogUtil; 16 | import com.hoho.android.usbserial.driver.UsbSerialDriver; 17 | import com.hoho.android.usbserial.driver.UsbSerialPort; 18 | import com.hoho.android.usbserial.driver.UsbSerialProber; 19 | 20 | import java.io.IOException; 21 | 22 | /** 23 | * 描述:HetCommonUsbSerialSdk 24 | * 作者:liugh 25 | * 日期:2021/11/22 26 | * 版本:V1.0.0 27 | */ 28 | public class CommonUsbSerialSdk implements IUsbSerialSdk { 29 | protected UsbManagerUtil mUsbManager; // USB工具类 30 | protected UsbSerialPort mUsbSerialPort; // 串口通信工具类 31 | protected UsbConnectListener mUsbConnectListener; // USB连接监听 32 | protected UsbSerialListener mUsbSerialListener; // 读写数据回调 33 | protected BaseThread mWriteThread; // 数据下发线程 34 | protected BaseThread mReadThread; // 数据接收线程 35 | private int mPort = 0; // 通信端口,一般只有一个 36 | private int mBaudRate = 115200; // 波特率 37 | private int mDataBits = UsbSerialPort.DATABITS_8; // 数据位 38 | private int mStopBits = UsbSerialPort.STOPBITS_1; // 停止位 39 | private int mParity = UsbSerialPort.PARITY_NONE; // 奇偶校验位 40 | private boolean forceGrant; // 是否强制授权,点取消授权会重新弹出授权弹窗,直至授权成功 41 | private PortType mPortType = PortType.USB_TO_SERIAL; // 通信类型 42 | 43 | public CommonUsbSerialSdk(Context context) { 44 | this.mUsbManager = new UsbManagerUtil(context); 45 | } 46 | 47 | public UsbManagerUtil getUsbManager() { 48 | return mUsbManager; 49 | } 50 | 51 | @Override 52 | public boolean hasTargetDevice() { 53 | return mUsbManager.hasTargetDevice(); 54 | } 55 | 56 | /** 57 | * 查找指定设备,适用于没有USB插拔的场景,如连上设备后再进入页面 58 | */ 59 | @Override 60 | public void checkTargetDevice() { 61 | LogUtil.i("checkTargetDevice"); 62 | mUsbManager.registerReceiver(); 63 | mUsbManager.checkTargetDevice(); 64 | } 65 | 66 | /** 67 | * 检查串口驱动 68 | * 69 | * @param usbDevice 70 | */ 71 | public void checkDriver(UsbDevice usbDevice) { 72 | LogUtil.i("checkDriver"); 73 | UsbSerialDriver driver = UsbSerialProber.getDefaultProber().probeDevice(usbDevice); 74 | if (mUsbConnectListener != null) { 75 | mUsbConnectListener.onDriverFound(usbDevice, driver); 76 | } 77 | } 78 | 79 | /** 80 | * 打开通信端口 81 | * 82 | * @param driver 83 | */ 84 | @Override 85 | public void openSerialPort(UsbSerialDriver driver, UsbDevice usbDevice) { 86 | LogUtil.i("openSerialPort"); 87 | try { 88 | if (mPortType == PortType.USB) { // USB通信,使用USB专用通信端口 89 | mUsbSerialPort = new CustomUsbPort(usbDevice, 0); 90 | } else if (mPortType == PortType.USB_TO_SERIAL) { // USB转串口通信,匹配对应驱动 91 | mUsbSerialPort = driver.getPorts().get(mPort); 92 | } 93 | mUsbSerialPort.open(mUsbManager.getConnection(usbDevice)); 94 | mUsbSerialPort.setParameters(mBaudRate, mDataBits, mStopBits, mParity); 95 | if (mUsbConnectListener != null) { 96 | mUsbConnectListener.onDeviceOpened(usbDevice, true); 97 | } 98 | } catch (Exception e) { 99 | e.printStackTrace(); 100 | if (mUsbConnectListener != null) { 101 | mUsbConnectListener.onDeviceOpened(usbDevice, false); 102 | } 103 | } 104 | } 105 | 106 | /** 107 | * 关闭串口 108 | */ 109 | @Override 110 | public void closeSerialPort() { 111 | LogUtil.i("closeSerialPort"); 112 | try { 113 | if (mUsbSerialPort != null) { 114 | mUsbSerialPort.close(); 115 | mUsbSerialPort = null; 116 | } 117 | } catch (IOException e) { 118 | e.printStackTrace(); 119 | } 120 | stopThread(); 121 | } 122 | 123 | /** 124 | * 启动数据接收线程,写线程在发送第一条指令时再判断启动 125 | */ 126 | @Override 127 | public void startThread() { 128 | if (mReadThread != null && !mReadThread.isStart()) { 129 | LogUtil.i("start read thread"); 130 | mReadThread.start(mUsbSerialPort); 131 | } 132 | if (mWriteThread != null && !mWriteThread.isStart()) { 133 | LogUtil.i("start write thread"); 134 | mWriteThread.start(mUsbSerialPort); 135 | } 136 | } 137 | 138 | /** 139 | * 停止读写线程 140 | */ 141 | @Override 142 | public void stopThread() { 143 | LogUtil.i("stop thread"); 144 | if (mReadThread != null) { 145 | mReadThread.stop(); 146 | } 147 | if (mWriteThread != null) { 148 | mWriteThread.stop(); 149 | } 150 | } 151 | 152 | /** 153 | * 发送指令 154 | * 155 | * @param src 156 | */ 157 | @Override 158 | public void write(byte[] bytes) { 159 | if (mUsbSerialPort == null) { 160 | LogUtil.e("UsbSerialPort can not be null!"); 161 | checkTargetDevice(); 162 | return; 163 | } 164 | if (bytes == null) { 165 | LogUtil.e("bytes can not be null!"); 166 | return; 167 | } 168 | startThread(); 169 | if (mWriteThread != null) { 170 | mWriteThread.write(bytes); 171 | } else { 172 | LogUtil.e("WriteThread can not be null!"); 173 | } 174 | } 175 | 176 | /** 177 | * 关闭串口设备 178 | */ 179 | @Override 180 | public void release() { 181 | LogUtil.i("release"); 182 | closeSerialPort(); 183 | mUsbManager.unregisterReceiver(); 184 | } 185 | 186 | /** 187 | * 设置USB连接监听器 188 | * 189 | * @param listener 190 | * @return 191 | */ 192 | public CommonUsbSerialSdk setUsbConnectListener(UsbConnectListener listener) { 193 | this.mUsbConnectListener = listener; 194 | mUsbManager.setUsbConnectListen(listener); 195 | return this; 196 | } 197 | 198 | /** 199 | * 串口数据收发回调 200 | * 201 | * @param listener 202 | * @return 203 | */ 204 | public CommonUsbSerialSdk setUsbSerialListener(UsbSerialListener listener) { 205 | this.mUsbSerialListener = listener; 206 | return this; 207 | } 208 | 209 | /** 210 | * 设置数据下发线程,不设置则使用默认 211 | * 212 | * @param writeThread 213 | * @return 214 | */ 215 | public CommonUsbSerialSdk setWriteThread(BaseThread writeThread) { 216 | this.mWriteThread = writeThread; 217 | return this; 218 | } 219 | 220 | /** 221 | * 设置数据接收线程,不设置则使用默认 222 | * 223 | * @param readThread 224 | * @return 225 | */ 226 | public CommonUsbSerialSdk setReadThread(BaseThread readThread) { 227 | this.mReadThread = readThread; 228 | return this; 229 | } 230 | 231 | /** 232 | * 设备过滤 233 | * 234 | * @param filter 235 | * @return 236 | */ 237 | public CommonUsbSerialSdk setDeviceFilter(IDeviceFilter filter) { 238 | mUsbManager.setDeviceFilter(filter); 239 | return this; 240 | } 241 | 242 | /** 243 | * 通信端口,一般只有一个 244 | * 245 | * @param port 246 | * @return 247 | */ 248 | public CommonUsbSerialSdk setPort(int port) { 249 | this.mPort = port; 250 | return this; 251 | } 252 | 253 | /** 254 | * 波特率 255 | * 256 | * @param baudRate 257 | * @return 258 | */ 259 | public CommonUsbSerialSdk setBaudRate(int baudRate) { 260 | this.mBaudRate = baudRate; 261 | return this; 262 | } 263 | 264 | /** 265 | * 数据位 266 | * 267 | * @param dataBits 268 | * @return 269 | */ 270 | public CommonUsbSerialSdk setDataBits(int dataBits) { 271 | this.mDataBits = dataBits; 272 | return this; 273 | } 274 | 275 | /** 276 | * 停止位 277 | * 278 | * @param stopBits 279 | * @return 280 | */ 281 | public CommonUsbSerialSdk setStopBits(int stopBits) { 282 | this.mStopBits = stopBits; 283 | return this; 284 | } 285 | 286 | /** 287 | * 奇偶检验位 288 | * 289 | * @param parity 290 | * @return 291 | */ 292 | public CommonUsbSerialSdk setParity(@UsbSerialPort.Parity int parity) { 293 | this.mParity = parity; 294 | return this; 295 | } 296 | 297 | /** 298 | * 是否强制授权 299 | * 300 | * @param forceGrant 301 | * @return 302 | */ 303 | public CommonUsbSerialSdk setForceGrant(boolean forceGrant) { 304 | this.forceGrant = forceGrant; 305 | return this; 306 | } 307 | 308 | /** 309 | * 设置通信类型,USB通信或者USB转串口通信 310 | * 311 | * @param portType 312 | * @return 313 | */ 314 | public CommonUsbSerialSdk setPortType(PortType portType) { 315 | this.mPortType = portType; 316 | return this; 317 | } 318 | 319 | /** 320 | * 非必需,调用该方法即使用默认流程,不调用则需自己处理相关流程 321 | * 322 | * @return 323 | */ 324 | public CommonUsbSerialSdk create() { 325 | if (mUsbConnectListener == null) { 326 | mUsbConnectListener = getDefaultUsbConnectListener(); 327 | mUsbManager.setUsbConnectListen(mUsbConnectListener); 328 | } 329 | if (mWriteThread == null) { 330 | mWriteThread = new WriteThread(mUsbSerialListener); 331 | } 332 | if (mReadThread == null) { 333 | mReadThread = new ReadThread(mUsbSerialListener); 334 | } 335 | return this; 336 | } 337 | 338 | /** 339 | * 默认listener,默认使用通用连接流程 340 | * 341 | * @return 342 | */ 343 | protected UsbConnectListener getDefaultUsbConnectListener() { 344 | return new DefaultUsbConnectListener(); 345 | } 346 | 347 | /** 348 | * 默认listener,默认使用通用连接流程 349 | * 1.查找设备 2.授权 3.连接 4.检查驱动 5.打开串口 6.开启数据接收线程 350 | */ 351 | protected class DefaultUsbConnectListener implements UsbConnectListener { 352 | @Override 353 | public void onAttached(UsbDevice usbDevice) { 354 | mUsbManager.requestPermission(usbDevice); 355 | } 356 | 357 | @Override 358 | public void onGranted(UsbDevice usbDevice, boolean granted) { 359 | if (granted) { 360 | mUsbManager.connectDevice(usbDevice); 361 | } else { 362 | if (forceGrant) { 363 | mUsbManager.requestPermission(usbDevice); 364 | } 365 | } 366 | } 367 | 368 | @Override 369 | public void onConnected(UsbDevice usbDevice, boolean connected) { 370 | if (connected) { 371 | if (mPortType == PortType.USB) { // USB通信,连接成功直接打开串口,不需要驱动 372 | openSerialPort(null, usbDevice); 373 | } else if (mPortType == PortType.USB_TO_SERIAL) { // USB转串口通信,连接成功检查驱动 374 | checkDriver(usbDevice); 375 | } 376 | } 377 | } 378 | 379 | @Override 380 | public void onDriverFound(UsbDevice usbDevice, UsbSerialDriver driver) { 381 | if (driver != null) { 382 | openSerialPort(driver, usbDevice); 383 | } 384 | } 385 | 386 | @Override 387 | public void onDeviceOpened(UsbDevice usbDevice, boolean success) { 388 | } 389 | 390 | @Override 391 | public void onDetached(UsbDevice usbDevice) { 392 | closeSerialPort(); 393 | } 394 | } 395 | 396 | } 397 | --------------------------------------------------------------------------------