SlideShare a Scribd company logo
1 of 56
Download to read offline
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

iOSにおける自動テストの並列化
iOSにおける自動テストの並列化iOSにおける自動テストの並列化
iOSにおける自動テストの並列化Toshiyuki Hirata
 
Microsoftの認証システムの歴史と 過渡期におけるWAPの活用 +Next Generation Credentials
Microsoftの認証システムの歴史と過渡期におけるWAPの活用+Next Generation CredentialsMicrosoftの認証システムの歴史と過渡期におけるWAPの活用+Next Generation Credentials
Microsoftの認証システムの歴史と 過渡期におけるWAPの活用 +Next Generation CredentialsNaohiro Fujie
 
オブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメオブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメYoji Kanno
 
VSCodeで作るPostgreSQL開発環境(第25回 PostgreSQLアンカンファレンス@オンライン 発表資料)
VSCodeで作るPostgreSQL開発環境(第25回 PostgreSQLアンカンファレンス@オンライン 発表資料)VSCodeで作るPostgreSQL開発環境(第25回 PostgreSQLアンカンファレンス@オンライン 発表資料)
VSCodeで作るPostgreSQL開発環境(第25回 PostgreSQLアンカンファレンス@オンライン 発表資料)NTT DATA Technology & Innovation
 
診断ツールの使い方(Owasp zapの場合)
診断ツールの使い方(Owasp zapの場合)診断ツールの使い方(Owasp zapの場合)
診断ツールの使い方(Owasp zapの場合)shingo inafuku
 
良い?悪い?コードコメントの書き方
良い?悪い?コードコメントの書き方良い?悪い?コードコメントの書き方
良い?悪い?コードコメントの書き方Shigenori Sagawa
 
イミュータブルデータモデルの極意
イミュータブルデータモデルの極意イミュータブルデータモデルの極意
イミュータブルデータモデルの極意Yoshitaka Kawashima
 
ドメイン駆動設計の正しい歩き方
ドメイン駆動設計の正しい歩き方ドメイン駆動設計の正しい歩き方
ドメイン駆動設計の正しい歩き方増田 亨
 
心理的安全性の構造 デブサミ2019夏 structure of psychological safety
心理的安全性の構造 デブサミ2019夏 structure of psychological safety心理的安全性の構造 デブサミ2019夏 structure of psychological safety
心理的安全性の構造 デブサミ2019夏 structure of psychological safetyTokoroten Nakayama
 
今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 Tips今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 TipsTakaaki Suzuki
 
一歩先行く Azure Computing シリーズ(全3回) 第2回 Azure VM どれを選ぶの? Azure VM 集中講座
一歩先行く Azure Computing シリーズ(全3回) 第2回 Azure VM どれを選ぶの? Azure VM 集中講座一歩先行く Azure Computing シリーズ(全3回) 第2回 Azure VM どれを選ぶの? Azure VM 集中講座
一歩先行く Azure Computing シリーズ(全3回) 第2回 Azure VM どれを選ぶの? Azure VM 集中講座Minoru Naito
 
Quarkus による超音速な Spring アプリケーション開発
Quarkus による超音速な Spring アプリケーション開発Quarkus による超音速な Spring アプリケーション開発
Quarkus による超音速な Spring アプリケーション開発Chihiro Ito
 
SQIP2015講演資料「チケット駆動開発の運用パターン集~問題はチケットに分割して統治せよ」
SQIP2015講演資料「チケット駆動開発の運用パターン集~問題はチケットに分割して統治せよ」SQIP2015講演資料「チケット駆動開発の運用パターン集~問題はチケットに分割して統治せよ」
SQIP2015講演資料「チケット駆動開発の運用パターン集~問題はチケットに分割して統治せよ」akipii Oga
 
まだ定型メールの処理 手動でしてるの? Power Platform で自動化してハッピーになろう!
まだ定型メールの処理 手動でしてるの? Power Platform で自動化してハッピーになろう!まだ定型メールの処理 手動でしてるの? Power Platform で自動化してハッピーになろう!
まだ定型メールの処理 手動でしてるの? Power Platform で自動化してハッピーになろう!Teruchika Yamada
 
MySQLチューニング
MySQLチューニングMySQLチューニング
MySQLチューニングyoku0825
 
Universal Links対応をした話
Universal Links対応をした話Universal Links対応をした話
Universal Links対応をした話Chiharu Nameki
 
0から始めるコンテナの学び方(Kubernetes Novice Tokyo #14 発表資料)
0から始めるコンテナの学び方(Kubernetes Novice Tokyo #14 発表資料)0から始めるコンテナの学び方(Kubernetes Novice Tokyo #14 発表資料)
0から始めるコンテナの学び方(Kubernetes Novice Tokyo #14 発表資料)NTT DATA Technology & Innovation
 
Network miner 使ってみた
Network miner 使ってみたNetwork miner 使ってみた
Network miner 使ってみた彰 村地
 
はりぼて OS で ELF なアプリを起動してみた
はりぼて OS で ELF なアプリを起動してみたはりぼて OS で ELF なアプリを起動してみた
はりぼて OS で ELF なアプリを起動してみたuchan_nos
 

What's hot (20)

iOSにおける自動テストの並列化
iOSにおける自動テストの並列化iOSにおける自動テストの並列化
iOSにおける自動テストの並列化
 
Microsoftの認証システムの歴史と 過渡期におけるWAPの活用 +Next Generation Credentials
Microsoftの認証システムの歴史と過渡期におけるWAPの活用+Next Generation CredentialsMicrosoftの認証システムの歴史と過渡期におけるWAPの活用+Next Generation Credentials
Microsoftの認証システムの歴史と 過渡期におけるWAPの活用 +Next Generation Credentials
 
オブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメオブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメ
 
VSCodeで作るPostgreSQL開発環境(第25回 PostgreSQLアンカンファレンス@オンライン 発表資料)
VSCodeで作るPostgreSQL開発環境(第25回 PostgreSQLアンカンファレンス@オンライン 発表資料)VSCodeで作るPostgreSQL開発環境(第25回 PostgreSQLアンカンファレンス@オンライン 発表資料)
VSCodeで作るPostgreSQL開発環境(第25回 PostgreSQLアンカンファレンス@オンライン 発表資料)
 
診断ツールの使い方(Owasp zapの場合)
診断ツールの使い方(Owasp zapの場合)診断ツールの使い方(Owasp zapの場合)
診断ツールの使い方(Owasp zapの場合)
 
良い?悪い?コードコメントの書き方
良い?悪い?コードコメントの書き方良い?悪い?コードコメントの書き方
良い?悪い?コードコメントの書き方
 
イミュータブルデータモデルの極意
イミュータブルデータモデルの極意イミュータブルデータモデルの極意
イミュータブルデータモデルの極意
 
ドメイン駆動設計の正しい歩き方
ドメイン駆動設計の正しい歩き方ドメイン駆動設計の正しい歩き方
ドメイン駆動設計の正しい歩き方
 
心理的安全性の構造 デブサミ2019夏 structure of psychological safety
心理的安全性の構造 デブサミ2019夏 structure of psychological safety心理的安全性の構造 デブサミ2019夏 structure of psychological safety
心理的安全性の構造 デブサミ2019夏 structure of psychological safety
 
今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 Tips今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 Tips
 
一歩先行く Azure Computing シリーズ(全3回) 第2回 Azure VM どれを選ぶの? Azure VM 集中講座
一歩先行く Azure Computing シリーズ(全3回) 第2回 Azure VM どれを選ぶの? Azure VM 集中講座一歩先行く Azure Computing シリーズ(全3回) 第2回 Azure VM どれを選ぶの? Azure VM 集中講座
一歩先行く Azure Computing シリーズ(全3回) 第2回 Azure VM どれを選ぶの? Azure VM 集中講座
 
Quarkus による超音速な Spring アプリケーション開発
Quarkus による超音速な Spring アプリケーション開発Quarkus による超音速な Spring アプリケーション開発
Quarkus による超音速な Spring アプリケーション開発
 
SQIP2015講演資料「チケット駆動開発の運用パターン集~問題はチケットに分割して統治せよ」
SQIP2015講演資料「チケット駆動開発の運用パターン集~問題はチケットに分割して統治せよ」SQIP2015講演資料「チケット駆動開発の運用パターン集~問題はチケットに分割して統治せよ」
SQIP2015講演資料「チケット駆動開発の運用パターン集~問題はチケットに分割して統治せよ」
 
まだ定型メールの処理 手動でしてるの? Power Platform で自動化してハッピーになろう!
まだ定型メールの処理 手動でしてるの? Power Platform で自動化してハッピーになろう!まだ定型メールの処理 手動でしてるの? Power Platform で自動化してハッピーになろう!
まだ定型メールの処理 手動でしてるの? Power Platform で自動化してハッピーになろう!
 
MySQLチューニング
MySQLチューニングMySQLチューニング
MySQLチューニング
 
Universal Links対応をした話
Universal Links対応をした話Universal Links対応をした話
Universal Links対応をした話
 
0から始めるコンテナの学び方(Kubernetes Novice Tokyo #14 発表資料)
0から始めるコンテナの学び方(Kubernetes Novice Tokyo #14 発表資料)0から始めるコンテナの学び方(Kubernetes Novice Tokyo #14 発表資料)
0から始めるコンテナの学び方(Kubernetes Novice Tokyo #14 発表資料)
 
Network miner 使ってみた
Network miner 使ってみたNetwork miner 使ってみた
Network miner 使ってみた
 
Docker超入門
Docker超入門Docker超入門
Docker超入門
 
はりぼて OS で ELF なアプリを起動してみた
はりぼて OS で ELF なアプリを起動してみたはりぼて OS で ELF なアプリを起動してみた
はりぼて OS で ELF なアプリを起動してみた
 

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:SeoulJunseong 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_김종원.pdfJongwon Kim
 
모바일 게임 테스트 자동화 Igc 2016
모바일 게임 테스트 자동화 Igc 2016모바일 게임 테스트 자동화 Igc 2016
모바일 게임 테스트 자동화 Igc 2016Jongwon 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_asia2010Jongwon Kim
 
Next-generation MMORPG service architecture
Next-generation MMORPG service architectureNext-generation MMORPG service architecture
Next-generation MMORPG service architectureJongwon 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