Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
OS間でBluetooth処理を(一部)共通化している話
Search
n-seki
May 16, 2023
Technology
0
100
OS間でBluetooth処理を(一部)共通化している話
Ebisu.mobile #2 / 2023.05.16
n-seki
May 16, 2023
Tweet
Share
More Decks by n-seki
See All by n-seki
10年もののバグを退治した話
n_seki
0
200
永続化、なに使おう?
n_seki
0
290
やってみようMaven!
n_seki
0
340
Try Android Health Connect
n_seki
0
90
Other Decks in Technology
See All in Technology
米国国防総省のDevSecOpsライフサイクルをAWSのセキュリティサービスとOSSで実現
syoshie
2
1.2k
Witchcraft for Memory
pocke
1
640
AIの最新技術&テーマをつまんで紹介&フリートークするシリーズ #1 量子機械学習の入門
tkhresk
0
140
ひとり情シスなCTOがLLMと始めるオペレーション最適化 / CTO's LLM-Powered Ops
yamitzky
0
460
「良さそう」と「とても良い」の間には 「良さそうだがホンマか」がたくさんある / 2025.07.01 LLM品質Night
smiyawaki0820
1
420
Oracle Audit Vault and Database Firewall 20 概要
oracle4engineer
PRO
3
1.7k
LangChain Interrupt & LangChain Ambassadors meetingレポート
os1ma
2
190
KubeCon + CloudNativeCon Japan 2025 Recap
ren510dev
1
290
登壇ネタの見つけ方 / How to find talk topics
pinkumohikan
5
570
低レイヤを知りたいPHPerのためのCコンパイラ作成入門 完全版 / Building a C Compiler for PHPers Who Want to Dive into Low-Level Programming - Expanded
tomzoh
4
3.4k
Lambda Web Adapterについて自分なりに理解してみた
smt7174
5
130
MySQL5.6から8.4へ 戦いの記録
kyoshidaxx
1
290
Featured
See All Featured
Making the Leap to Tech Lead
cromwellryan
134
9.4k
A designer walks into a library…
pauljervisheath
207
24k
How to train your dragon (web standard)
notwaldorf
94
6.1k
Build The Right Thing And Hit Your Dates
maggiecrowley
36
2.8k
The Illustrated Children's Guide to Kubernetes
chrisshort
48
50k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
667
120k
Done Done
chrislema
184
16k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
48
2.9k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
130
19k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
30
2.1k
The Cult of Friendly URLs
andyhume
79
6.5k
Navigating Team Friction
lara
187
15k
Transcript
OS間でBluetooth処理を(一部)共 通化している話 n-seki / Ebisu.mobile #2 / 2023.05.16
自己紹介 • 上関直人(Uwaseki Naoto) ◦ GitHub @n-seki ◦ Twitter @_n_seki_
• STORES 決済 / Android エンジニア
STORES 決済
OS間でBluetooth処理を(一部) 共通化している話 STORES 決済 アプリで
STORES 決済 と Bluetooth端末 プリンター 10種類以上 MP-B20, SM-L200, mC-Print3, TM-P20…etc
決済端末(カードリーダ)
STORES 決済 と Bluetooth端末 プリンター 14台 MP-B20, SM-L200, mC-Print3, TM-P20…etc
決済端末(カードリーダ)
OS間でBluetooth処理を(一部) 共通化している話 STORES 決済 アプリで 決済端末(カードリーダー)の
決済端末(カードリーダー) • クレジットカードや電子マネーカードの読み取りができる • キーパッドや液晶モニター、LEDランプがついている • アプリとはBluetoothで接続している (決済に関わるいろいろなことが行われますがここでは省略)
アプリと決済端末 • アプリから決済端末にコマンドを送る ◦ たとえば、ディスプレイの表示内容を変更したり ◦ たとえば、カードタッチ待ち受け状態にしたり • 仕様に沿ったコマンドを作成する必要がある
アプリと決済端末 • 決済端末からレスポンスが返ってくる ◦ たとえば、ファームウェアのバージョンをコマンドで問い合わ せたときの結果 ◦ たとえば、カードタッチされたときの決済情報 • レスポンスも決まった形式のデータ構造をしている
アプリと決済端末 • (あたりまえだけど)コマンドもレスポンスも仕様に沿ったデータ、 データ形式になる • コマンドなら先頭 2バイトが命令で、次の2バイトがオプション で......のようなイメージ • レスポンスはTLVというデータ形式
TLV(ちょっと脱線) • Tag - Length - Value の略称 ◦ タグ、長さ、データ部
• 例)5A029000 (バイト配列) ◦ タグ -> 5A ◦ 長さ -> 02 = 2バイト ◦ データ -> 9000
TLV(ちょっと脱線) • クレジットカード決済(EMV)においてはTLVフォーマットのデータ がやりとりされる • この仕様はPublicなものなので、調べると TLVをパースするツー ルがいろいろ出てくる
アプリと決済端末 • コマンドもレスポンスもバイト配列を操作する必要があって複雑 • AndroidとiOSとでそれぞれ実装しても良いが......
アプリと決済端末 • データの操作なのでOSとは完全に独立した処理 • ロジックについてもOS間で差分はない ◦ というよりも、差分があってはいけない • 共通化できそう! →
社内ライブラリの誕生
社内ライブラリでやっていること • 決済端末に送るコマンドの作成 • 決済端末のレスポンス(バイト配列)をパースし、アプリ側で扱 いやすくしたデータ構造にする → アプリ側ではコマンドの具体的な中身だったり、バイト配列を直 接意識しなくてもOK
社内ライブラリの実装 • 言語はC++ ◦ AndroidアプリからはNDK, JNIでメソッド呼び出し • UnitTestが充実 • initial
commitは2015年
NDK, JNI • NDK ◦ AndroidでCやC++のコードを使用できるようにするツールセッ ト • JNI ◦
C/C++とJavaを相互運用するための仕組み ◦ Javaの世界とC/C++の世界を橋渡しする実装
メリット • (AndroidとiOSとの)コード重複がない • ミッションクリティカルな部分でOS間差分が存在しない • 共通化されていることから、チーム内で共通の言葉でコミュニ ケーションができる
デメリット • メンテナンスコストが追加で発生する ◦ メンバー全員がC++に慣れているわけではない ◦ Android向けにはJNIレイヤーを実装する必要がある ◦ 別リポジトリ管理
今後の展望 • KMM移行 ◦ 共通化のメリットはそのままで、より親しみのあるKotlinで実 装できる • Rust移行? • なににせよ移行コストは発生する
◦ メンテコスト/移行コストの相談
OS間でBluetooth処理を(一部) 共通化している話 JNI 社内ライブラリ 決済端末 EMV C/C++ Tag-Length-Value NDK
クレジットカード KMM