Skip to content

Serial API ​

토스 프론트에서 시리얼 포트 통신을 위한 API예요. 외부 장치와의 데이터 송수신을 지원해요.

Serial API를 통한 결제 처리

프론트에서 Serial API를 통해 결제를 처리하려면 멀티패드 연동 예제 소스를 참고해 주세요.

Methods ​

open ​

시리얼 포트를 열고 통신을 시작해요.

Parameters ​

파라미터타입필수기본값설명
optionsObject-시리얼 포트 설정
options.baudRatenumber9600통신 속도
options.interceptbooleanfalseVAN 결제 전문을 플러그인이 먼저 수신할지 여부

Example ​

js
/**
 * 시리얼 포트 열기
 * @param {Object} options 시리얼 포트 설정
 * @param {number} options.baudRate 통신 속도 (기본값: 9600)
 * @param {boolean} options.intercept VAN 결제 전문 인터셉트 여부 (기본값: false)
 */
await sdk.serial.open({ baudRate: 9600 });

Serial API를 통한 결제 처리에서는 VAN 결제 전문을 플러그인이 먼저 수신해야 하므로 intercept: true 설정이 필수예요.

js
await sdk.serial.open({ baudRate: 115200, intercept: true });

close ​

열려있는 시리얼 포트를 닫아요.

Example ​

js
/**
 * 시리얼 포트 닫기
 */
await sdk.serial.close();

write ​

시리얼 포트를 통해 데이터를 송신해요.

Parameters ​

파라미터타입필수기본값설명
dataObject✓-송신할 데이터 객체
data.dataUint8Array✓-송신할 데이터 배열

Example ​

js
/**
 * 시리얼 데이터 송신
 * @param {Object} data 송신할 데이터
 * @param {Uint8Array} data.data 송신할 데이터 배열
 */
await sdk.serial.write({ data: Uint8Array.from([0x04]) });

listen ​

시리얼 포트로부터 데이터를 수신해요.

Parameters ​

파라미터타입필수기본값설명
callbackFunction✓-수신된 데이터를 처리할 콜백 함수

콜백 함수 파라미터:

  • params.data (Uint8Array): 수신된 데이터 배열

Example ​

js
/**
 * 시리얼 데이터 수신 이벤트 리스너 등록
 * @param {Function} callback 수신된 데이터를 처리할 콜백 함수
 * @returns {Function} 이벤트 리스너 해제 함수
 */
const unlisten = sdk.serial.listen((params) => {
  console.log("수신된 데이터:", params.data); // Uint8Array
});

// 이벤트 리스너 해제
unlisten();

사용 예시 ​

시리얼 통신 관리 클래스 ​

js
class SerialManager {
  constructor() {
    this.isOpen = false;
    this.unlisten = null;
  }

  /**
   * 시리얼 포트 열기
   * @param {number} baudRate 통신 속도
   */
  async open(baudRate = 9600) {
    if (this.isOpen) {
      console.warn("이미 시리얼 포트가 열려있습니다.");
      return;
    }

    try {
      await sdk.serial.open({ baudRate });
      this.isOpen = true;
      this.setupEventListener();
    } catch (error) {
      console.error("시리얼 포트 열기 실패:", error);
      throw error;
    }
  }

  /**
   * 시리얼 포트 닫기
   */
  async close() {
    if (!this.isOpen) {
      console.warn("시리얼 포트가 열려있지 않습니다.");
      return;
    }

    try {
      await sdk.serial.close();
      this.isOpen = false;
      this.cleanupEventListener();
    } catch (error) {
      console.error("시리얼 포트 닫기 실패:", error);
      throw error;
    }
  }

  /**
   * 데이터 송신
   * @param {Uint8Array} data 송신할 데이터
   */
  async write(data) {
    if (!this.isOpen) {
      throw new Error("시리얼 포트가 열려있지 않습니다.");
    }

    try {
      await sdk.serial.write({ data });
    } catch (error) {
      console.error("데이터 송신 실패:", error);
      throw error;
    }
  }

  /**
   * 이벤트 리스너 설정
   */
  setupEventListener() {
    this.unlisten = sdk.serial.listen(this.handleData.bind(this));
  }

  /**
   * 이벤트 리스너 정리
   */
  cleanupEventListener() {
    if (this.unlisten) {
      this.unlisten();
      this.unlisten = null;
    }
  }

  /**
   * 수신 데이터 처리
   * @param {Object} params 수신된 데이터
   * @param {Uint8Array} params.data 수신된 데이터 배열
   */
  handleData(params) {
    console.log("수신된 데이터:", params.data);
    // 수신된 데이터에 따른 추가 처리 로직
  }
}

// 사용 예시
async function communicateWithDevice() {
  const serial = new SerialManager();

  try {
    // 시리얼 포트 열기
    await serial.open(9600);

    // 데이터 송신
    await serial.write(Uint8Array.from([0x04]));

    // 일정 시간 후 시리얼 포트 닫기
    setTimeout(async () => {
      await serial.close();
    }, 5000);
  } catch (error) {
    console.error("시리얼 통신 중 오류 발생:", error);
  }
}