SlideShare a Scribd company logo
NCSOFT(2004~2022) Mococo(2000~2004) 한글과컴퓨터(1994~1997) 컬럼/번역
자동테스트기술개발팀(2015~2022)
리니지이터널TD(2007~2013)
모바일게임기개발팀(2004~2006)
임베디드JVM,PDA,
PalmOS기반스마트폰개발
윈도우용아래아한글3.0시리즈
한글96시리즈개발
마이크로소프트웨어,
ZDNet 컬럼 '망치와모루'
윈도우7프로그래밍,
R로마스터하는머신러닝번역등
NCSOFT에서 게임의 자동테스트 기술을 연구하고
실무에 적용하는 업무를 하고 있습니다
세벌식입력의역사 아이폰에서세벌식을 절반의성공,처음부터 단순한장난감을넘어서
한글타자기의역사와같이한
세벌식에대한소개와사용법
기계식블루투스키보드로
아이폰에마음껏한글을입력하고
싶다.블루투스가내장된아두이노
시스템을이용해서해볼수는
없을까?
블루투스키보드로아이폰에서
세벌식입력을할수있게되었으나
사용할수있는키보드가제한되어
있다.여러블루투스키보드에서도
가능하게하려면처음부터다시
만들어야한다
기계식블루투스키보드에서
세벌식입력을할수있게되었고
애플매직키보드로도입력할수
있게되었다.하지만정말모든
것이잘끝난것일까
최초의 안과 전문의
종로 안국동 공안과 개원
최초 한글 시력 검사표 제작
공병우 타자기 발명
최초로 쌍꺼풀 수술 집도
최초로 콘택트 렌즈 도입
한글 문화원 설립(82세, 1988)
자음
모음
초성
중성
종성
3벌식 390을
선택합니다
레오폴드 FC750RBT + 저소음 적축 + 블루투스 5.1
요즘 임베디드 시스템 개발이 쉬워져서
학생들도 쉽게 개발하고
인터넷에서 주문만 하면
다 된다던데…
(그런게 진짜 있을리가)
아두이노?
Adafruit nRF52840
void setup()
{
Serial.begin(115200);
Bluefruit.begin(0, 1);
Bluefruit.setTxPower(4); // Check bluefruit.h for supported values
Bluefruit.setName("Bluefruit52");
// Start Central Scan
Bluefruit.setConnLedInterval(250);
Bluefruit.Scanner.setRxCallback(scan_callback);
Bluefruit.Scanner.start(0);
}
void scan_callback(ble_gap_evt_adv_report_t* report)
{
Serial.println("Timestamp Addr Rssi Data");
Serial.printf("%09d ", millis());
// MAC is in little endian --> print reverse
Serial.printBufferReverse(report->peer_addr.addr, 6, ':');
Serial.printBuffer(report->data.p_data, report->data.len, '-');
Serial.println();
if ( Bluefruit.Scanner.checkReportForUuid(report, UUID16_SVC_HUMAN_INTERFACE_DEVICE) )
{
Serial.println(" BLE HID service detected");
}
Bluefruit.Scanner.resume();
}
void loop()
{
// nothing to do
}
1. BLE 스캔을 하여 광고중인 키보드 검색 및 페어링
2. 페어링 이후 Boot 모드로 키보드 연결
3. 키보드로 advertising(광고)을 하여 아이폰과 키보드로 연결 시도
4. 아이폰과 연결이 되면 키보드에서 오는 report를 아이폰으로 전달
5. 키보드와 블루투스 연결이 끊기면 아이폰과의 연결도 끊음
6. 아이폰과 연결만 끊기면 다시 BLE 키보드로 광고 시작
Boot 모드에서는 8바이트의 고정 길이의 report가 전달된다
typedef struct TU_ATTR_PACKED
{
uint8_t modifier; /**< Keyboard modifier (KEYBOARD_MODIFIER_* masks). */
uint8_t reserved; /**< Reserved for OEM use, always set to 0. */
uint8_t keycode[6]; /**< Key codes of the currently pressed keys. */
} hid_keyboard_report_t;
Boot 모드 / Report 모드
a 0x04 0x00 0x00 0x00 0x00 0x00
a b 0x04 0x05 0x00 0x00 0x00 0x00
a b c 0x04 0x05 0x06 0x00 0x00 0x00
a b 0x04 0x05 0x00 0x00 0x00 0x00
a 0x04 0x00 0x00 0x00 0x00 0x00
0x00 0x00 0x00 0x00 0x00 0x00
세벌식을 두벌식으로 바꾸는 것이 1:1 대응 불가
동시에 키 세 개를 누르는 경우 중복 자음 입력 안 됨
‘ㄴ’ ‘ㅡ’ ‘ㄴ’
초성이 종성으로 들어가 쌍자음 조합 안 됨
‘느끼다’ ‘늑기다’
1. 세벌식 초성, 중성, 종성의 위치의 키를 나타내는 키코드를 찾아 냄
2. 두벌식에 대응하는 키코드로 대응하는 키코드로 1:1 대응 테이블 작성
3. 쉬프트 키를 눌러서 입력을 하였지만 두벌식에서는 쉬프트 키를 누르지 않고 입력하는
경우가 있어 이를 구분하기 위한 플래그 설정
4. ‘ᆻ’처럼 세벌식에서는 쉬프트키를 누르지 않고 입력할 수 있지만 두벌식에서는 쉬프트
키를 눌러야 입력이 가능한 경우가 있어 이를 위한 플래그 설정
5. 하나의 키로 두 개의 키코드를 생성하는 경우. ‘ㅢ'와 같은 복모음이나 ‘ᆰ’, ‘ᆹ’ 같은
종성을 위해 키코드를 두 개를 전달하기 위한 데이터 구조 설계
6. 직전에 입력한 키가 중성/종성이고 지금 입력하려는 키가 초성이면 한글 조합을
중지하도록 하여 현재 키가 초성으로 입력되도록 플래그를 설정
핵심
기계식
키보드가
쓰고
싶어요
클래식 블루투스, BT (블루투스 4.0 이전)
BLE (블루투스 4.0 에 추가된 별도 스펙)
블루투스 4.0부터 BT와 BLE를 구별하지 않으나 서로 다른 별개의 기술
클래식 블루투스와 BLE를 모두 지원하는 ESP32-WROOM-32
ESP32 시스템(WiFi / BLE / Classic BT)
• 기존 아두이노 시스템과 많이 다르며 필요한 예제 부족
• ESP-IDF 예제는 클래식 블루투스 HID 지원 부족
• 결국 BTstack 이라는 독자적인 블루투스 스택 선택
1. 클래식 블루투스의 HID host 초기화
2. Hid keyboard 서비스 탐색 스캔(host 가 시작)
3. 스캔에서 발견한 키보드와 Report 모드로 연결/페어링 진행
4. 키보드에서 HID Descriptor가 오면 연결 과정 종료
5. 키보드 연결 성공 후 ESP32를 BLE 키보드로 광고 시작
6. 아이폰과 BLE키보드로 연결된 후 키보드에서 오는 report를 아이폰으로 전달
7. 아이폰과 연결이 끊겨도 키보드와 연결을 유지하고 그대로 대기함
클래식 블루투스의 Master/Slave inquiry 방식
BLE의 Central/Peripheral 의 scan 방식
그런데 말입니다…
1. 문제없이 잘 될 것으로 예상했지만 페어링이 끝나고 HID descriptor를
받아오는 중에 연결이 종료가 됨
2. HID host 초기화 옵션을 바꿔보고 BLE 초기화를 먼저 하거나 온갖 조합을
시도하였으나 연결에 실패…
3. 결국 BTstack의 소스 코드를 한 줄 한 줄 읽기 시작. 리모트 디버깅을 하려면
추가 하드웨어가 필요해서 포기. 로그 위치와 코드를 추정해서 무슨 일이
일어났는지 코드를 쫓아 다니면서 읽었습니다
결국, 한 줄 고쳐서 애플 매직 키보드 문제는 해결했습니다.
HID_PROTOCOL_MODE_REPORT_WITH_FALLBACK_TO_BOOT
키보드 연결 시 REPORT 모드로 시도를 하고 실패하면 BOOT 모드로 연결하는 옵션
BTstack의 경우 애플 매직 키보드에서 페어링이 끝나고 연결 과정 중에 에러를 발생
이 옵션을 HID_PROTOCOL_MODE_REPORT 로 변경하니 정상적으로 연결 완료
그런데 또 다른 문제가 발생. 애플 페어링 문제 디버깅 때문에 기존 페어링 기록을 초기화
기계식 블루투스 키보드 bonding 정보가 지운 후 다시 페어링을 하니 Pin code 입력
없이 페어링이 되지 않고 Pin code 입력을 요구하는 것을 발견. 클래식 블루투스 2.1
이전 페어링 스펙을 사용
마침내
아이폰에서
세벌식을
쓸 수 있게
됐어요
• 조용히 참고 살던 세벌식 사용자들의 엄청난 관심과 개발에 대한 지지
• 완성되면 꼭 갖고 싶다던 사람, 상품화를 해달라는 사람들
• 하지만 과연 이 물건을 필요로 하는 세벌식 사용자가 얼마나 될까요?
• 애플이 사용자 키보드를 추가할 수 있도록 해주면 되는 일
• 언제까지나 세벌식 키보드를 계속해서 업그레이드를 하며 살아야
할까요? 차라리 오픈소스로 공개하는 것이 더 낫지 않을까 생각을
했지만 쉽게 결정할 문제가 아니었습니다
키보드와 스마트폰을 동시에 연결한다는 것은 악용될 가능성 높음
보안툴을 우회하여 게임 매크로에 사용되는 사례가 있음
키보드 변환기에 키 매크로나 레코더 등의 기능을 덧붙여 확장도 가능
예) 스마트 키 릴레이를 통한 차량 도난 사례
간단한 툴이고 장난감이라 생각했지만 결과에 책임을 가져야
§ 막연히 블루투스 키보드가 간단한 구조를 가지고 있을 것이라 생각하고 시작
§ 아두이노 프로그래밍만으로 블루투스 프로그래밍이 가능하다고 믿음
§ 블루투스 표준이 파편화로 여러 프로토콜을 동시에 지원해야 함
§ 블루투스 키보드의 구현이 제각각이라 주된 기능이 아닌 것에 버그가 있음
§ 블루투스 기기도 스펙에 따라 페어링 과정에서 다른 동작을 함
§ 아이폰/아이패드가 외장형 키보드를 크게 고려한 시스템이 아님
§ 블루투스 키보드가 절전 모드에서 깨어나 재접속을 할 때도 생각해야 함
Wrap up
iOS를 위한 세벌식 블루투스 키보드 제작기
iOS를 위한 세벌식 블루투스 키보드 제작기

More Related Content

What's hot

NDC 2015 삼시세끼 빌드만들기
NDC 2015 삼시세끼 빌드만들기NDC 2015 삼시세끼 빌드만들기
NDC 2015 삼시세끼 빌드만들기
Hyunsuk Ahn
 
Ansible入門.pptx
Ansible入門.pptxAnsible入門.pptx
Ansible入門.pptx
洵貴 佐川
 
오픈 소스를 활용한 캐쥬얼 게임 서버 프레임워크 개발
오픈 소스를 활용한 캐쥬얼 게임 서버 프레임워크 개발오픈 소스를 활용한 캐쥬얼 게임 서버 프레임워크 개발
오픈 소스를 활용한 캐쥬얼 게임 서버 프레임워크 개발주항 박
 
世界と日本のDNSSEC
世界と日本のDNSSEC世界と日本のDNSSEC
世界と日本のDNSSEC
IIJ
 
オープンソースのクラウド基盤 CloudStackによるIaaS構築入門 @OSC 2013 Nagoya
オープンソースのクラウド基盤 CloudStackによるIaaS構築入門 @OSC 2013 Nagoyaオープンソースのクラウド基盤 CloudStackによるIaaS構築入門 @OSC 2013 Nagoya
オープンソースのクラウド基盤 CloudStackによるIaaS構築入門 @OSC 2013 Nagoya
Satoshi Shimazaki
 
milter-managerが便利な話
milter-managerが便利な話milter-managerが便利な話
milter-managerが便利な話
Kiyoshi SATOH
 
Mock Server Using WireMock
Mock Server Using WireMockMock Server Using WireMock
Mock Server Using WireMock
Globant
 
Raspberry Piで Wifiルータを作る
Raspberry PiでWifiルータを作るRaspberry PiでWifiルータを作る
Raspberry Piで Wifiルータを作る
nishio
 
ローカルネットワーク費用は誰が負担すべきか:韓国 vs. NETFLIXから学べること
ローカルネットワーク費用は誰が負担すべきか:韓国 vs. NETFLIXから学べることローカルネットワーク費用は誰が負担すべきか:韓国 vs. NETFLIXから学べること
ローカルネットワーク費用は誰が負担すべきか:韓国 vs. NETFLIXから学べること
Toshiya Jitsuzumi
 
1998 INFINITI QX4 Service Repair Manual
1998 INFINITI QX4 Service Repair Manual1998 INFINITI QX4 Service Repair Manual
1998 INFINITI QX4 Service Repair Manual
海 雨
 
How to Break your App - Best Practices in Mobile App Testing
How to Break your App - Best Practices in Mobile App TestingHow to Break your App - Best Practices in Mobile App Testing
How to Break your App - Best Practices in Mobile App Testing
Daniel Knott
 
강좌 04 펌웨어 구조 설계
강좌 04 펌웨어 구조 설계강좌 04 펌웨어 구조 설계
강좌 04 펌웨어 구조 설계
chcbaram
 
IPsec VPNとSSL-VPNの違い
IPsec VPNとSSL-VPNの違いIPsec VPNとSSL-VPNの違い
いまさら聞けないDockerコンテナ超入門
いまさら聞けないDockerコンテナ超入門 いまさら聞けないDockerコンテナ超入門
いまさら聞けないDockerコンテナ超入門
VirtualTech Japan Inc./Begi.net Inc.
 

What's hot (14)

NDC 2015 삼시세끼 빌드만들기
NDC 2015 삼시세끼 빌드만들기NDC 2015 삼시세끼 빌드만들기
NDC 2015 삼시세끼 빌드만들기
 
Ansible入門.pptx
Ansible入門.pptxAnsible入門.pptx
Ansible入門.pptx
 
오픈 소스를 활용한 캐쥬얼 게임 서버 프레임워크 개발
오픈 소스를 활용한 캐쥬얼 게임 서버 프레임워크 개발오픈 소스를 활용한 캐쥬얼 게임 서버 프레임워크 개발
오픈 소스를 활용한 캐쥬얼 게임 서버 프레임워크 개발
 
世界と日本のDNSSEC
世界と日本のDNSSEC世界と日本のDNSSEC
世界と日本のDNSSEC
 
オープンソースのクラウド基盤 CloudStackによるIaaS構築入門 @OSC 2013 Nagoya
オープンソースのクラウド基盤 CloudStackによるIaaS構築入門 @OSC 2013 Nagoyaオープンソースのクラウド基盤 CloudStackによるIaaS構築入門 @OSC 2013 Nagoya
オープンソースのクラウド基盤 CloudStackによるIaaS構築入門 @OSC 2013 Nagoya
 
milter-managerが便利な話
milter-managerが便利な話milter-managerが便利な話
milter-managerが便利な話
 
Mock Server Using WireMock
Mock Server Using WireMockMock Server Using WireMock
Mock Server Using WireMock
 
Raspberry Piで Wifiルータを作る
Raspberry PiでWifiルータを作るRaspberry PiでWifiルータを作る
Raspberry Piで Wifiルータを作る
 
ローカルネットワーク費用は誰が負担すべきか:韓国 vs. NETFLIXから学べること
ローカルネットワーク費用は誰が負担すべきか:韓国 vs. NETFLIXから学べることローカルネットワーク費用は誰が負担すべきか:韓国 vs. NETFLIXから学べること
ローカルネットワーク費用は誰が負担すべきか:韓国 vs. NETFLIXから学べること
 
1998 INFINITI QX4 Service Repair Manual
1998 INFINITI QX4 Service Repair Manual1998 INFINITI QX4 Service Repair Manual
1998 INFINITI QX4 Service Repair Manual
 
How to Break your App - Best Practices in Mobile App Testing
How to Break your App - Best Practices in Mobile App TestingHow to Break your App - Best Practices in Mobile App Testing
How to Break your App - Best Practices in Mobile App Testing
 
강좌 04 펌웨어 구조 설계
강좌 04 펌웨어 구조 설계강좌 04 펌웨어 구조 설계
강좌 04 펌웨어 구조 설계
 
IPsec VPNとSSL-VPNの違い
IPsec VPNとSSL-VPNの違いIPsec VPNとSSL-VPNの違い
IPsec VPNとSSL-VPNの違い
 
いまさら聞けないDockerコンテナ超入門
いまさら聞けないDockerコンテナ超入門 いまさら聞けないDockerコンテナ超入門
いまさら聞けないDockerコンテナ超入門
 

Similar to iOS를 위한 세벌식 블루투스 키보드 제작기

[135]모바일 키보드, 스마트보드에 AI 적용하기
[135]모바일 키보드, 스마트보드에 AI 적용하기[135]모바일 키보드, 스마트보드에 AI 적용하기
[135]모바일 키보드, 스마트보드에 AI 적용하기
NAVER D2
 
재사용가능한 서비스코드제작
재사용가능한 서비스코드제작재사용가능한 서비스코드제작
재사용가능한 서비스코드제작
지수 윤
 
유니티로 해보는 게임 프로토타이핑
유니티로 해보는 게임 프로토타이핑유니티로 해보는 게임 프로토타이핑
유니티로 해보는 게임 프로토타이핑
Kiyoung Moon
 
SNS 기본도구 "한키"
SNS 기본도구 "한키"SNS 기본도구 "한키"
SNS 기본도구 "한키"
영진 유
 
[W3C HTML5 2016] 일렉트론, 웹 기술로 담아내는 데스크탑 애플리케이션
[W3C HTML5 2016] 일렉트론, 웹 기술로 담아내는 데스크탑 애플리케이션[W3C HTML5 2016] 일렉트론, 웹 기술로 담아내는 데스크탑 애플리케이션
[W3C HTML5 2016] 일렉트론, 웹 기술로 담아내는 데스크탑 애플리케이션
양재동 코드랩
 
아이폰에 포팅해보기
아이폰에 포팅해보기아이폰에 포팅해보기
아이폰에 포팅해보기
changehee lee
 
국내외모바일Os동향및플랫폼동향
국내외모바일Os동향및플랫폼동향국내외모바일Os동향및플랫폼동향
국내외모바일Os동향및플랫폼동향Jong Jin Hong
 
20150306 파이썬기초 IPython을이용한프로그래밍_이태영
20150306 파이썬기초 IPython을이용한프로그래밍_이태영20150306 파이썬기초 IPython을이용한프로그래밍_이태영
20150306 파이썬기초 IPython을이용한프로그래밍_이태영
Tae Young Lee
 
(게임개발을위한) printf("Hello World!"); 그 이상의 콘솔 프로그래밍
(게임개발을위한) printf("Hello World!"); 그 이상의 콘솔 프로그래밍(게임개발을위한) printf("Hello World!"); 그 이상의 콘솔 프로그래밍
(게임개발을위한) printf("Hello World!"); 그 이상의 콘솔 프로그래밍
NDOORS
 
취미로 엔진 만들기
취미로 엔진 만들기취미로 엔진 만들기
취미로 엔진 만들기
Jiho Choi
 
2010년 여름 신입부원 프로젝트 제안서(수정)
2010년 여름 신입부원 프로젝트 제안서(수정)2010년 여름 신입부원 프로젝트 제안서(수정)
2010년 여름 신입부원 프로젝트 제안서(수정)
Woojin Joe
 
Unite Seoul 2016 - 스매싱 더 배틀의 멀티플랫폼 개발
Unite Seoul 2016 - 스매싱 더 배틀의 멀티플랫폼 개발 Unite Seoul 2016 - 스매싱 더 배틀의 멀티플랫폼 개발
Unite Seoul 2016 - 스매싱 더 배틀의 멀티플랫폼 개발
Daehoon Han
 
“머신러닝 엔지니어가 다녀온 F8” 김준성 - F8 2019 Meetup:Seoul
“머신러닝 엔지니어가 다녀온 F8” 김준성 - F8 2019 Meetup:Seoul“머신러닝 엔지니어가 다녀온 F8” 김준성 - F8 2019 Meetup:Seoul
“머신러닝 엔지니어가 다녀온 F8” 김준성 - F8 2019 Meetup:Seoul
Junseong Kim
 
당신의 디버깅에 니코니코니
당신의 디버깅에 니코니코니당신의 디버깅에 니코니코니
당신의 디버깅에 니코니코니
Lusain Kim
 
[IGC 2017] 넥스트플로어 김영수 - Protocol:hyperspace Diver 개발 포스트모템
[IGC 2017] 넥스트플로어 김영수 - Protocol:hyperspace Diver 개발 포스트모템[IGC 2017] 넥스트플로어 김영수 - Protocol:hyperspace Diver 개발 포스트모템
[IGC 2017] 넥스트플로어 김영수 - Protocol:hyperspace Diver 개발 포스트모템
강 민우
 
NDC 2013 Monkeyrunner를 이용한 모바일 테스트 자동화
NDC 2013 Monkeyrunner를 이용한 모바일 테스트 자동화NDC 2013 Monkeyrunner를 이용한 모바일 테스트 자동화
NDC 2013 Monkeyrunner를 이용한 모바일 테스트 자동화
ByungJoon Lee
 
게임프로그래밍입문 2주차
게임프로그래밍입문 2주차게임프로그래밍입문 2주차
게임프로그래밍입문 2주차
Yeonah Ki
 
[IGC2017] Protocol:hyperspace Diver 개발 포스트모템
[IGC2017] Protocol:hyperspace Diver 개발 포스트모템[IGC2017] Protocol:hyperspace Diver 개발 포스트모템
[IGC2017] Protocol:hyperspace Diver 개발 포스트모템
Young Soo Kim
 
2016317 파이썬기초_파이썬_다중설치부터_Jupyter를이용한프로그래밍_이태영
2016317 파이썬기초_파이썬_다중설치부터_Jupyter를이용한프로그래밍_이태영2016317 파이썬기초_파이썬_다중설치부터_Jupyter를이용한프로그래밍_이태영
2016317 파이썬기초_파이썬_다중설치부터_Jupyter를이용한프로그래밍_이태영
Tae Young Lee
 
NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들
NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들
NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들
영욱 오
 

Similar to iOS를 위한 세벌식 블루투스 키보드 제작기 (20)

[135]모바일 키보드, 스마트보드에 AI 적용하기
[135]모바일 키보드, 스마트보드에 AI 적용하기[135]모바일 키보드, 스마트보드에 AI 적용하기
[135]모바일 키보드, 스마트보드에 AI 적용하기
 
재사용가능한 서비스코드제작
재사용가능한 서비스코드제작재사용가능한 서비스코드제작
재사용가능한 서비스코드제작
 
유니티로 해보는 게임 프로토타이핑
유니티로 해보는 게임 프로토타이핑유니티로 해보는 게임 프로토타이핑
유니티로 해보는 게임 프로토타이핑
 
SNS 기본도구 "한키"
SNS 기본도구 "한키"SNS 기본도구 "한키"
SNS 기본도구 "한키"
 
[W3C HTML5 2016] 일렉트론, 웹 기술로 담아내는 데스크탑 애플리케이션
[W3C HTML5 2016] 일렉트론, 웹 기술로 담아내는 데스크탑 애플리케이션[W3C HTML5 2016] 일렉트론, 웹 기술로 담아내는 데스크탑 애플리케이션
[W3C HTML5 2016] 일렉트론, 웹 기술로 담아내는 데스크탑 애플리케이션
 
아이폰에 포팅해보기
아이폰에 포팅해보기아이폰에 포팅해보기
아이폰에 포팅해보기
 
국내외모바일Os동향및플랫폼동향
국내외모바일Os동향및플랫폼동향국내외모바일Os동향및플랫폼동향
국내외모바일Os동향및플랫폼동향
 
20150306 파이썬기초 IPython을이용한프로그래밍_이태영
20150306 파이썬기초 IPython을이용한프로그래밍_이태영20150306 파이썬기초 IPython을이용한프로그래밍_이태영
20150306 파이썬기초 IPython을이용한프로그래밍_이태영
 
(게임개발을위한) printf("Hello World!"); 그 이상의 콘솔 프로그래밍
(게임개발을위한) printf("Hello World!"); 그 이상의 콘솔 프로그래밍(게임개발을위한) printf("Hello World!"); 그 이상의 콘솔 프로그래밍
(게임개발을위한) printf("Hello World!"); 그 이상의 콘솔 프로그래밍
 
취미로 엔진 만들기
취미로 엔진 만들기취미로 엔진 만들기
취미로 엔진 만들기
 
2010년 여름 신입부원 프로젝트 제안서(수정)
2010년 여름 신입부원 프로젝트 제안서(수정)2010년 여름 신입부원 프로젝트 제안서(수정)
2010년 여름 신입부원 프로젝트 제안서(수정)
 
Unite Seoul 2016 - 스매싱 더 배틀의 멀티플랫폼 개발
Unite Seoul 2016 - 스매싱 더 배틀의 멀티플랫폼 개발 Unite Seoul 2016 - 스매싱 더 배틀의 멀티플랫폼 개발
Unite Seoul 2016 - 스매싱 더 배틀의 멀티플랫폼 개발
 
“머신러닝 엔지니어가 다녀온 F8” 김준성 - F8 2019 Meetup:Seoul
“머신러닝 엔지니어가 다녀온 F8” 김준성 - F8 2019 Meetup:Seoul“머신러닝 엔지니어가 다녀온 F8” 김준성 - F8 2019 Meetup:Seoul
“머신러닝 엔지니어가 다녀온 F8” 김준성 - F8 2019 Meetup:Seoul
 
당신의 디버깅에 니코니코니
당신의 디버깅에 니코니코니당신의 디버깅에 니코니코니
당신의 디버깅에 니코니코니
 
[IGC 2017] 넥스트플로어 김영수 - Protocol:hyperspace Diver 개발 포스트모템
[IGC 2017] 넥스트플로어 김영수 - Protocol:hyperspace Diver 개발 포스트모템[IGC 2017] 넥스트플로어 김영수 - Protocol:hyperspace Diver 개발 포스트모템
[IGC 2017] 넥스트플로어 김영수 - Protocol:hyperspace Diver 개발 포스트모템
 
NDC 2013 Monkeyrunner를 이용한 모바일 테스트 자동화
NDC 2013 Monkeyrunner를 이용한 모바일 테스트 자동화NDC 2013 Monkeyrunner를 이용한 모바일 테스트 자동화
NDC 2013 Monkeyrunner를 이용한 모바일 테스트 자동화
 
게임프로그래밍입문 2주차
게임프로그래밍입문 2주차게임프로그래밍입문 2주차
게임프로그래밍입문 2주차
 
[IGC2017] Protocol:hyperspace Diver 개발 포스트모템
[IGC2017] Protocol:hyperspace Diver 개발 포스트모템[IGC2017] Protocol:hyperspace Diver 개발 포스트모템
[IGC2017] Protocol:hyperspace Diver 개발 포스트모템
 
2016317 파이썬기초_파이썬_다중설치부터_Jupyter를이용한프로그래밍_이태영
2016317 파이썬기초_파이썬_다중설치부터_Jupyter를이용한프로그래밍_이태영2016317 파이썬기초_파이썬_다중설치부터_Jupyter를이용한프로그래밍_이태영
2016317 파이썬기초_파이썬_다중설치부터_Jupyter를이용한프로그래밍_이태영
 
NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들
NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들
NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들
 

More from Jongwon Kim

NDC21_게임테스트자동화5년의기록_NCSOFT_김종원.pdf
NDC21_게임테스트자동화5년의기록_NCSOFT_김종원.pdfNDC21_게임테스트자동화5년의기록_NCSOFT_김종원.pdf
NDC21_게임테스트자동화5년의기록_NCSOFT_김종원.pdf
Jongwon Kim
 
모바일 게임 테스트 자동화 Igc 2016
모바일 게임 테스트 자동화 Igc 2016모바일 게임 테스트 자동화 Igc 2016
모바일 게임 테스트 자동화 Igc 2016
Jongwon Kim
 
모바일 게임 테스트 자동화 (Appium 확장)
모바일 게임 테스트 자동화 (Appium 확장)모바일 게임 테스트 자동화 (Appium 확장)
모바일 게임 테스트 자동화 (Appium 확장)
Jongwon Kim
 
KGC 2014 프로파일러를 이용한 게임 클라이언트 최적화
KGC 2014 프로파일러를 이용한 게임 클라이언트 최적화KGC 2014 프로파일러를 이용한 게임 클라이언트 최적화
KGC 2014 프로파일러를 이용한 게임 클라이언트 최적화
Jongwon Kim
 
Next mmorpg architecture-siggraph_asia2010
Next mmorpg architecture-siggraph_asia2010Next mmorpg architecture-siggraph_asia2010
Next mmorpg architecture-siggraph_asia2010
Jongwon Kim
 
Next-generation MMORPG service architecture
Next-generation MMORPG service architectureNext-generation MMORPG service architecture
Next-generation MMORPG service architecture
Jongwon Kim
 

More from Jongwon Kim (6)

NDC21_게임테스트자동화5년의기록_NCSOFT_김종원.pdf
NDC21_게임테스트자동화5년의기록_NCSOFT_김종원.pdfNDC21_게임테스트자동화5년의기록_NCSOFT_김종원.pdf
NDC21_게임테스트자동화5년의기록_NCSOFT_김종원.pdf
 
모바일 게임 테스트 자동화 Igc 2016
모바일 게임 테스트 자동화 Igc 2016모바일 게임 테스트 자동화 Igc 2016
모바일 게임 테스트 자동화 Igc 2016
 
모바일 게임 테스트 자동화 (Appium 확장)
모바일 게임 테스트 자동화 (Appium 확장)모바일 게임 테스트 자동화 (Appium 확장)
모바일 게임 테스트 자동화 (Appium 확장)
 
KGC 2014 프로파일러를 이용한 게임 클라이언트 최적화
KGC 2014 프로파일러를 이용한 게임 클라이언트 최적화KGC 2014 프로파일러를 이용한 게임 클라이언트 최적화
KGC 2014 프로파일러를 이용한 게임 클라이언트 최적화
 
Next mmorpg architecture-siggraph_asia2010
Next mmorpg architecture-siggraph_asia2010Next mmorpg architecture-siggraph_asia2010
Next mmorpg architecture-siggraph_asia2010
 
Next-generation MMORPG service architecture
Next-generation MMORPG service architectureNext-generation MMORPG service architecture
Next-generation MMORPG service architecture
 

iOS를 위한 세벌식 블루투스 키보드 제작기

  • 1.
  • 2. NCSOFT(2004~2022) Mococo(2000~2004) 한글과컴퓨터(1994~1997) 컬럼/번역 자동테스트기술개발팀(2015~2022) 리니지이터널TD(2007~2013) 모바일게임기개발팀(2004~2006) 임베디드JVM,PDA, PalmOS기반스마트폰개발 윈도우용아래아한글3.0시리즈 한글96시리즈개발 마이크로소프트웨어, ZDNet 컬럼 '망치와모루' 윈도우7프로그래밍, R로마스터하는머신러닝번역등 NCSOFT에서 게임의 자동테스트 기술을 연구하고 실무에 적용하는 업무를 하고 있습니다
  • 3. 세벌식입력의역사 아이폰에서세벌식을 절반의성공,처음부터 단순한장난감을넘어서 한글타자기의역사와같이한 세벌식에대한소개와사용법 기계식블루투스키보드로 아이폰에마음껏한글을입력하고 싶다.블루투스가내장된아두이노 시스템을이용해서해볼수는 없을까? 블루투스키보드로아이폰에서 세벌식입력을할수있게되었으나 사용할수있는키보드가제한되어 있다.여러블루투스키보드에서도 가능하게하려면처음부터다시 만들어야한다 기계식블루투스키보드에서 세벌식입력을할수있게되었고 애플매직키보드로도입력할수 있게되었다.하지만정말모든 것이잘끝난것일까
  • 4.
  • 5.
  • 6.
  • 7. 최초의 안과 전문의 종로 안국동 공안과 개원 최초 한글 시력 검사표 제작 공병우 타자기 발명 최초로 쌍꺼풀 수술 집도 최초로 콘택트 렌즈 도입 한글 문화원 설립(82세, 1988)
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20. 레오폴드 FC750RBT + 저소음 적축 + 블루투스 5.1
  • 21. 요즘 임베디드 시스템 개발이 쉬워져서 학생들도 쉽게 개발하고 인터넷에서 주문만 하면 다 된다던데… (그런게 진짜 있을리가)
  • 24.
  • 25. void setup() { Serial.begin(115200); Bluefruit.begin(0, 1); Bluefruit.setTxPower(4); // Check bluefruit.h for supported values Bluefruit.setName("Bluefruit52"); // Start Central Scan Bluefruit.setConnLedInterval(250); Bluefruit.Scanner.setRxCallback(scan_callback); Bluefruit.Scanner.start(0); } void scan_callback(ble_gap_evt_adv_report_t* report) { Serial.println("Timestamp Addr Rssi Data"); Serial.printf("%09d ", millis()); // MAC is in little endian --> print reverse Serial.printBufferReverse(report->peer_addr.addr, 6, ':'); Serial.printBuffer(report->data.p_data, report->data.len, '-'); Serial.println(); if ( Bluefruit.Scanner.checkReportForUuid(report, UUID16_SVC_HUMAN_INTERFACE_DEVICE) ) { Serial.println(" BLE HID service detected"); } Bluefruit.Scanner.resume(); } void loop() { // nothing to do }
  • 26.
  • 27.
  • 28. 1. BLE 스캔을 하여 광고중인 키보드 검색 및 페어링 2. 페어링 이후 Boot 모드로 키보드 연결 3. 키보드로 advertising(광고)을 하여 아이폰과 키보드로 연결 시도 4. 아이폰과 연결이 되면 키보드에서 오는 report를 아이폰으로 전달 5. 키보드와 블루투스 연결이 끊기면 아이폰과의 연결도 끊음 6. 아이폰과 연결만 끊기면 다시 BLE 키보드로 광고 시작
  • 29. Boot 모드에서는 8바이트의 고정 길이의 report가 전달된다 typedef struct TU_ATTR_PACKED { uint8_t modifier; /**< Keyboard modifier (KEYBOARD_MODIFIER_* masks). */ uint8_t reserved; /**< Reserved for OEM use, always set to 0. */ uint8_t keycode[6]; /**< Key codes of the currently pressed keys. */ } hid_keyboard_report_t;
  • 30. Boot 모드 / Report 모드
  • 31.
  • 32. a 0x04 0x00 0x00 0x00 0x00 0x00 a b 0x04 0x05 0x00 0x00 0x00 0x00 a b c 0x04 0x05 0x06 0x00 0x00 0x00 a b 0x04 0x05 0x00 0x00 0x00 0x00 a 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
  • 33. 세벌식을 두벌식으로 바꾸는 것이 1:1 대응 불가 동시에 키 세 개를 누르는 경우 중복 자음 입력 안 됨 ‘ㄴ’ ‘ㅡ’ ‘ㄴ’ 초성이 종성으로 들어가 쌍자음 조합 안 됨 ‘느끼다’ ‘늑기다’
  • 34. 1. 세벌식 초성, 중성, 종성의 위치의 키를 나타내는 키코드를 찾아 냄 2. 두벌식에 대응하는 키코드로 대응하는 키코드로 1:1 대응 테이블 작성 3. 쉬프트 키를 눌러서 입력을 하였지만 두벌식에서는 쉬프트 키를 누르지 않고 입력하는 경우가 있어 이를 구분하기 위한 플래그 설정 4. ‘ᆻ’처럼 세벌식에서는 쉬프트키를 누르지 않고 입력할 수 있지만 두벌식에서는 쉬프트 키를 눌러야 입력이 가능한 경우가 있어 이를 위한 플래그 설정 5. 하나의 키로 두 개의 키코드를 생성하는 경우. ‘ㅢ'와 같은 복모음이나 ‘ᆰ’, ‘ᆹ’ 같은 종성을 위해 키코드를 두 개를 전달하기 위한 데이터 구조 설계 6. 직전에 입력한 키가 중성/종성이고 지금 입력하려는 키가 초성이면 한글 조합을 중지하도록 하여 현재 키가 초성으로 입력되도록 플래그를 설정 핵심
  • 35.
  • 36.
  • 38. 클래식 블루투스, BT (블루투스 4.0 이전) BLE (블루투스 4.0 에 추가된 별도 스펙) 블루투스 4.0부터 BT와 BLE를 구별하지 않으나 서로 다른 별개의 기술
  • 39.
  • 40. 클래식 블루투스와 BLE를 모두 지원하는 ESP32-WROOM-32
  • 41. ESP32 시스템(WiFi / BLE / Classic BT) • 기존 아두이노 시스템과 많이 다르며 필요한 예제 부족 • ESP-IDF 예제는 클래식 블루투스 HID 지원 부족 • 결국 BTstack 이라는 독자적인 블루투스 스택 선택
  • 42. 1. 클래식 블루투스의 HID host 초기화 2. Hid keyboard 서비스 탐색 스캔(host 가 시작) 3. 스캔에서 발견한 키보드와 Report 모드로 연결/페어링 진행 4. 키보드에서 HID Descriptor가 오면 연결 과정 종료 5. 키보드 연결 성공 후 ESP32를 BLE 키보드로 광고 시작 6. 아이폰과 BLE키보드로 연결된 후 키보드에서 오는 report를 아이폰으로 전달 7. 아이폰과 연결이 끊겨도 키보드와 연결을 유지하고 그대로 대기함
  • 45.
  • 46.
  • 47. 그런데 말입니다… 1. 문제없이 잘 될 것으로 예상했지만 페어링이 끝나고 HID descriptor를 받아오는 중에 연결이 종료가 됨 2. HID host 초기화 옵션을 바꿔보고 BLE 초기화를 먼저 하거나 온갖 조합을 시도하였으나 연결에 실패… 3. 결국 BTstack의 소스 코드를 한 줄 한 줄 읽기 시작. 리모트 디버깅을 하려면 추가 하드웨어가 필요해서 포기. 로그 위치와 코드를 추정해서 무슨 일이 일어났는지 코드를 쫓아 다니면서 읽었습니다
  • 48. 결국, 한 줄 고쳐서 애플 매직 키보드 문제는 해결했습니다. HID_PROTOCOL_MODE_REPORT_WITH_FALLBACK_TO_BOOT 키보드 연결 시 REPORT 모드로 시도를 하고 실패하면 BOOT 모드로 연결하는 옵션 BTstack의 경우 애플 매직 키보드에서 페어링이 끝나고 연결 과정 중에 에러를 발생 이 옵션을 HID_PROTOCOL_MODE_REPORT 로 변경하니 정상적으로 연결 완료 그런데 또 다른 문제가 발생. 애플 페어링 문제 디버깅 때문에 기존 페어링 기록을 초기화 기계식 블루투스 키보드 bonding 정보가 지운 후 다시 페어링을 하니 Pin code 입력 없이 페어링이 되지 않고 Pin code 입력을 요구하는 것을 발견. 클래식 블루투스 2.1 이전 페어링 스펙을 사용
  • 50.
  • 51. • 조용히 참고 살던 세벌식 사용자들의 엄청난 관심과 개발에 대한 지지 • 완성되면 꼭 갖고 싶다던 사람, 상품화를 해달라는 사람들 • 하지만 과연 이 물건을 필요로 하는 세벌식 사용자가 얼마나 될까요? • 애플이 사용자 키보드를 추가할 수 있도록 해주면 되는 일 • 언제까지나 세벌식 키보드를 계속해서 업그레이드를 하며 살아야 할까요? 차라리 오픈소스로 공개하는 것이 더 낫지 않을까 생각을 했지만 쉽게 결정할 문제가 아니었습니다
  • 52. 키보드와 스마트폰을 동시에 연결한다는 것은 악용될 가능성 높음 보안툴을 우회하여 게임 매크로에 사용되는 사례가 있음 키보드 변환기에 키 매크로나 레코더 등의 기능을 덧붙여 확장도 가능 예) 스마트 키 릴레이를 통한 차량 도난 사례
  • 53. 간단한 툴이고 장난감이라 생각했지만 결과에 책임을 가져야
  • 54. § 막연히 블루투스 키보드가 간단한 구조를 가지고 있을 것이라 생각하고 시작 § 아두이노 프로그래밍만으로 블루투스 프로그래밍이 가능하다고 믿음 § 블루투스 표준이 파편화로 여러 프로토콜을 동시에 지원해야 함 § 블루투스 키보드의 구현이 제각각이라 주된 기능이 아닌 것에 버그가 있음 § 블루투스 기기도 스펙에 따라 페어링 과정에서 다른 동작을 함 § 아이폰/아이패드가 외장형 키보드를 크게 고려한 시스템이 아님 § 블루투스 키보드가 절전 모드에서 깨어나 재접속을 할 때도 생각해야 함 Wrap up