셀메이트 안드로이드??

셀메이트에서 안드로이드가 있다는걸 아시지만, 코드나 기술스택에 대해 잘 모르시는 분들이 많을거 같습니다.

우리 셀메이트 안드로이드는요. Kotlin으로된 네이티브 앱입니다!

디자인 패턴은 MVP패턴으로 작성이되어있습니다.

대부분의 구성된 패턴이나 라이브러리들은 OkHttp3 기반 Retrofit RestfulAPI를 사용을 하고, Dagger2를 사용하여 의존성 주입을, RxKotlin을 사용하여 함수형으로 작성되어 있습니다

  • Kotlin(언어) + MVP(Architecture) + Retrofit Restful(API) + RxKotlin(함수형) + Dagger2(의존성 관리)

RFID…?

RFID는 대학교 졸업작품으로도 썻던 부품이라 매우 친근하게 사용할 수 있었지만 그때 당시엔,, 하드웨어가 주라서 C로 작성을 했었습니다..

이렇게 RFID와 한번 친했던적이 있기 때문에 이번 프로젝트는 거부감 없이 다가갈 수 있었고,, 구조부터 이해를 하기 시작 했습니다..

구조이해

셀메이트에서 원하는 RFID는 옵션을 구분하는 SGUID + 발급번호로 이루어진 36진수의 문자 ([A-Z], [a-z], [0-9])였습니다. 하지만, RFID 특성상 16진수가 최대의 진법이였고, 이것을 아스키코드 <> 16진수로 바꿔주는 모듈이 필요해졌습니다.

추가적으로 앞 4자리는 발급할때 공장에서의 번호인듯해 확인해보니 필요없는 번호라서 절삭하기로 했다.

RFID구조
그림1. RFID 구조

상단의 필요없는부분은 빼고 Hex 값을 2자리씩 끊어 우리가 필요한 ASCII로 변환해주면 “A04V00102230000” 라는 36진수의 RFID 코드가 완성이 된다.

라이브러리 구현

기본적으로 제공되는 SDK와 문서를 참조해서 셀메이트에 적합한 라이브러리로 만들어주는 작업을 진행했습니다.

1차적으로 라이브러리에서 셀메이트가 발급한 코드지 확인하고 인터페이스로 넘겨야 보일러플레이팅과 성승이슈가 생기지 않을거 같아서 다음과 같은 동작을 주기로 했습니다.

  • RFID의 앞4자리는 로그인한 업체코드와 동일할것.
  • 기본적으로 라이브러리는 16진수 > 36진수로 변환된 ASCII일것.
  • 필요없는 데이터는 지울것 (NULL)

상단과 같이 적용하니 다음과 같은코드가 나왔습니다.

  • 태그를 읽었을때 인터페이스 호출
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
    override fun onReaderReadTag(p0: ATRfidReader?, p1: String?, p2: Float, p3: Float) {
        if (p1 == null || rfidDataReceive == null) {
            return
        }
        val sellmateRFIDCode = StringUtil.convertHexaToTripleHexa(p1)

        if (RFIDUtil.judgeEqualsSellmateRfid(mPreferencesHelper.companyCode!!, sellmateRFIDCode)) {
            // 읽을때 뒤에 \u0000 이 들어있어서 제거 해줌.
            rfidDataReceive!!.onReceive(sellmateRFIDCode.replace("\u0000", "").toUpperCase())
        }
    }

전반적으로

전반적으로 막힘없이 진행했었지만, 코드의 개선점들이 많이 보이고있고, 특히 RFID의 경우 API응답에 대해서도 느린부분이 있었는데, API자체적인 응답이 느려 성능적인 이슈를 해결해야 할 과제로 보입니다..