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
110
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
240
永続化、なに使おう?
n_seki
0
310
やってみようMaven!
n_seki
0
370
Try Android Health Connect
n_seki
0
96
Other Decks in Technology
See All in Technology
CDKで始めるTypeScript開発のススメ
tsukuboshi
1
580
Bill One急成長の舞台裏 開発組織が直面した失敗と教訓
sansantech
PRO
2
410
22nd ACRi Webinar - ChipTip Technology Eric-san's slide
nao_sumikawa
0
100
Cloud Runでコロプラが挑む 生成AI×ゲーム『神魔狩りのツクヨミ』の裏側
colopl
0
150
pool.ntp.orgに ⾃宅サーバーで 参加してみたら...
tanyorg
0
1.4k
顧客の言葉を、そのまま信じない勇気
yamatai1212
1
370
Bedrock PolicyでAmazon Bedrock Guardrails利用を強制してみた
yuu551
0
260
Oracle Cloud Observability and Management Platform - OCI 運用監視サービス概要 -
oracle4engineer
PRO
2
14k
顧客との商談議事録をみんなで読んで顧客解像度を上げよう
shibayu36
0
340
SREのプラクティスを用いた3領域同時 マネジメントへの挑戦 〜SRE・情シス・セキュリティを統合した チーム運営術〜
coconala_engineer
2
780
広告の効果検証を題材にした因果推論の精度検証について
zozotech
PRO
0
210
10Xにおける品質保証活動の全体像と改善 #no_more_wait_for_test
nihonbuson
PRO
2
340
Featured
See All Featured
Navigating the Design Leadership Dip - Product Design Week Design Leaders+ Conference 2024
apolaine
0
190
Utilizing Notion as your number one productivity tool
mfonobong
3
220
Navigating Weather and Climate Data
rabernat
0
110
AI: The stuff that nobody shows you
jnunemaker
PRO
2
280
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
37
6.3k
Accessibility Awareness
sabderemane
0
58
KATA
mclloyd
PRO
34
15k
How to audit for AI Accessibility on your Front & Back End
davetheseo
0
180
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
38
2.7k
Designing Powerful Visuals for Engaging Learning
tmiket
0
240
Bioeconomy Workshop: Dr. Julius Ecuru, Opportunities for a Bioeconomy in West Africa
akademiya2063
PRO
1
57
Gemini Prompt Engineering: Practical Techniques for Tangible AI Outcomes
mfonobong
2
280
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