USB Console 접속 코드를 구현해보는 중이다.
콘솔포트 - USB 케이블 - 스마트폰 연결을 하면 PC에 설치된 Android Studio 콘솔에서 Log 보는 것을 할 수가 없다.
에러가 발생하면 에러 메시지 분석이 쉽지 않다.
04-25 23:04:20.613: V/MainActivity(12928): VendorID : 1659 , ProductID : 8963 04-25 23:04:20.617: V/MainActivity(12928): controlTransfer(SET_CONTROL_LINE_STATE): 0 04-25 23:04:20.618: V/MainActivity(12928): controlTransfer(RQSID_SET_LINE_CODING): 7
|
04-25 23:20:54.285: V/MainActivity(18765): VendorID : 1027 , ProductID : 24577 04-25 23:20:54.289: V/MainActivity(18765): controlTransfer(SET_CONTROL_LINE_STATE): -1 04-25 23:20:54.291: V/MainActivity(18765): controlTransfer(RQSID_SET_LINE_CODING): -1
|
위와 같이 메시지가 스마트폰에 파일로 저장된다.<?xml version="1.0" encoding="utf-8"?> <resources> <!-- Application이 원하는 장치에 대해서만 통보를 받을 수 있다. --> <!-- 0x0403 / 0x6001: FTDI FT232R UART --> <usb-device vendor-id="1027" product-id="24577" /> <!-- 0x0403 / 0x6015: FTDI FT231X --> <usb-device vendor-id="1027" product-id="24597" />
<!-- 0x2341 / Arduino --> <usb-device vendor-id="9025" />
<!-- 0x16C0 / 0x0483: Teensyduino --> <usb-device vendor-id="5824" product-id="1155" />
<!-- 0x10C4 / 0xEA60: CP210x UART Bridge --> <usb-device vendor-id="4292" product-id="60000" />
<!-- 0x1a86 / 0x7523: Qinheng CH340 --> <usb-device vendor-id="6790" product-id="29987" />
<!-- 0x067B / 0x2303: Prolific PL2303 --> <usb-device vendor-id="1659" product-id="8963" /> <usb-device vendor-id="1659" product-id="8964" /> <usb-device vendor-id="1659" product-id="41216" /> <!-- usb-device vendor-id="1659=0x067B" product-id="8963=0x2303" --> <!-- usb-device vendor-id="1659=0x067B" product-id="8964=0x2304" --> <!-- usb-device vendor-id="1659=0x067B" product-id="41216=0xA100" --> </resources> |
칩셋이 FTDI 칩셋인 경우에 보여주는 메시지와 PL2303 칩셋일 때 보여주는 메시지가 다르다.내가 테스트하는 코드가 PL2303은 정상적으로 잘 동작하는데 FTDI 칩셋은 오류를 뿌리고 바로 죽는다.
import android.os.Binder; import android.os.Environment; import android.util.Log;
import java.io.File; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Locale; import java.util.logging.FileHandler; import java.util.logging.Formatter; import java.util.logging.Level; import java.util.logging.LogRecord; import java.util.logging.Logger;
public class LogWrapper { private static final String TAG = "LogWrapper"; private static final int LOG_FILE_SIZE_LIMIT = 512 * 1024; private static final int LOG_FILE_MAX_COUNT = 2; private static final String LOG_FILE_NAME = "FileLog%g.txt"; private static final SimpleDateFormat formatter = new SimpleDateFormat("MM-dd HH:mm:ss.SSS: ", Locale.getDefault()); private static final Date date = new Date(); private static Logger logger; private static FileHandler fileHandler;
static { try { fileHandler = new FileHandler(Environment.getExternalStorageDirectory() + File.separator + LOG_FILE_NAME, LOG_FILE_SIZE_LIMIT, LOG_FILE_MAX_COUNT, true); fileHandler.setFormatter(new Formatter() { @Override public String format(LogRecord r) { date.setTime(System.currentTimeMillis());
StringBuilder ret = new StringBuilder(80); ret.append(formatter.format(date)); ret.append(r.getMessage()); return ret.toString(); } });
logger = Logger.getLogger(LogWrapper.class.getName()); logger.addHandler(fileHandler); logger.setLevel(Level.ALL); logger.setUseParentHandlers(false); Log.d(TAG, "init success"); } catch (IOException e) { Log.d(TAG, "init failure"); } }
public static void v(String tag, String msg) { if (logger != null) { logger.log(Level.INFO, String.format("V/%s(%d): %s\n", tag, Binder.getCallingPid(), msg)); }
Log.v(tag, msg); }
} |
위 코드의 출처는 https://abydos.tistory.com/23 이다.테스트 결과 메시지가 출력되는 걸 확인할 수 있다.
Android Studio 에서 출력하는 완벽한 Log는 아니지만 에러가 발생하는 부분을 조금이라도 추적할 수는 있을 거 같다.
파일로 저장되므로 구글 드라이브에 공유로 폰에서 올리면 PC에서 EditPlus로 보기 편하게 볼 수 있더라.
아래 코드도 파일로 잘 저장된다.
public static void writeLog(String str) { String str_Path_Full = Environment.getExternalStorageDirectory() .getAbsolutePath() + "/download/logdata.txt"; File file = new File(str_Path_Full); if (file.exists() == false) { try { file.createNewFile(); } catch (IOException e) { } } else { try { BufferedWriter bfw = new BufferedWriter(new FileWriter(str_Path_Full,true)); bfw.write(str); bfw.write("\n"); bfw.flush(); bfw.close(); } catch (FileNotFoundException e) {
} catch (IOException e) {
} } }
|
외부저장소에 저장하기 위해서는 위험권한을 설정해야만 저장되므로 관련 코드는 구현해야 한다.
TEDpermission 으로 권한 설정하면 쉽게 할 수 있다.