728x90
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 으로 권한 설정하면 쉽게 할 수 있다.

블로그 이미지

Link2Me

,