windows 10 mobileでnfc~suica・edy対応編~(公開用)

42
Windows 10 Mobile で NFC Suica Edy ででで13 でででででででででで 2015/10/10 でで でで (@kumar0001)

Upload: nobuaki-aoki

Post on 16-Apr-2017

4.744 views

Category:

Software


1 download

TRANSCRIPT

Page 1: Windows 10 mobileでnfc~suica・edy対応編~(公開用)

Windows 10 Mobile で NFC~ Suica ・ Edy 対応編~

@第 13 回まどべんよっかいち2015/10/10青木 宣明 (@kumar0001)

Page 2: Windows 10 mobileでnfc~suica・edy対応編~(公開用)

今日の内容Windows 10 Mobile での NFC タグ、特に Felica の読み取りについて• Windows.Devices.SmartCards.SmartCar

dReader クラス• NFC Smart Card Reader PC/SC Library• Felica の読み取り方法

Edy での注意点と対応策

Windows Phone 8.1 の場合の補足

Page 3: Windows 10 mobileでnfc~suica・edy対応編~(公開用)

Windows 10 Mobile と非接触 IC カード

Page 4: Windows 10 mobileでnfc~suica・edy対応編~(公開用)

NFC とは?NFCIP-2

ISO/IEC 21481

NFCIP-1ISO/IEC 18092

Type F (Felica)

Type A (MIFARE)

ISO/IEC 14443Type B

ISO/IEC 15693

Suica,Edy taspo

住基カード免許証 RFID タグ

いずれも 13.56MHz

Page 5: Windows 10 mobileでnfc~suica・edy対応編~(公開用)

Windows Phone と非接触 IC カードWindows Phone 8 まで• Proximity API で NFC タグの読み書きが

可能NDEF と呼ばれるフォーマットだけサポート

している• Publish/Subscribe でタグデータにアク

セスするAP 起動URI (Web, GeoTag, Telphone, Mail, …)

デモ

Page 6: Windows 10 mobileでnfc~suica・edy対応編~(公開用)

Windows Phone と非接触 IC カードWindows Phone 8.1 以降• 条件付きながら NDEF 形式でない IC カー

ドの読み書きが可能になっているWhat's New in Windows Phone 8.1

を読んで (その5) http://app.strawhat.net/posts/2014/04/12/Whats

-New-in-Windows-Phone-81-part5/• 条件

PN547 を搭載した端末現状では同チップのドライバーしか対応していない

Page 7: Windows 10 mobileでnfc~suica・edy対応編~(公開用)

対応する端末

Lumia 730 Lumia 830 Lumia 640 Lumia 640XL

Page 8: Windows 10 mobileでnfc~suica・edy対応編~(公開用)

SmartCardReader クラスWindows.Devices.SmartCards 名前空間• IC カードリーダ、 IC カードを扱うクラス

が属している• この名前空間を使って IC カードと通信す

SmartCardReader IC カードリーダのクラス。カード追加・離脱の検知イベント

SmartCard IC カードのクラス。IC カードとの接続、ステータス取得

SmartCardConnection IC カードとの通信のクラス。データの転送、通信路のクローズ

Page 9: Windows 10 mobileでnfc~suica・edy対応編~(公開用)

SmartCardReader での通信手順SmartCardReader で IC カードリーダを取得して、カード検知のイベントハンドラを設定

カードを検知したら SmartCard.ConnectAsync で IC カードに接続して、 SmartCardConnection を取得

SmartCardConnection.TrasnmitAsync で IC カードに APDU でコマンドを送信する

SmartCardConnection.Dispose で通信を閉じる

Page 10: Windows 10 mobileでnfc~suica・edy対応編~(公開用)

APDU

Application Protocol Data Unit• IC カードに送信するコマンドのデータ

コマンドクラス , コマンド指示コード , P1, P2, データ長 , データ , 出力長

PC/SC Workgroup Specifications 2.01.14 “Part 3. Requirements for PC-Connected Interface Devices” から引用

Page 11: Windows 10 mobileでnfc~suica・edy対応編~(公開用)

NFC Smart Card Reader PC/SC Library

Windows Phone 8.1 で NFC タグとraw 通信するライブラリ• https

://nfcsmartcardreader.codeplex.com/• NFC タグごとに APDU を組み立てて送信

するクラス群を提供Windows 10 UWP アプリのサンプルにも収録されている

https://github.com/Microsoft/Windows-universal-samples/tree/master/Samples/Nfc

Page 12: Windows 10 mobileでnfc~suica・edy対応編~(公開用)

PC/SC

PC/SC とは?• 各社の IC カードリーダ、 IC カードを相互利

用するための API• Microsoft を中心としたワークグループで定

義http://www.pcscworkgroup.com/

PC/SC Library では、 APDU を使わないIC カード (Felica など ) においても PC/SC に沿って APDU でコマンドを送信• ドライバが適切なネイティブのコマンドに

変換する

Page 13: Windows 10 mobileでnfc~suica・edy対応編~(公開用)

PC/SC での処理の流れ接続

• SCardEstablishContext – リソースマネージャに接続• SCardListReaders – カードリーダの取得• SCardConnect – カードとの接続

通信• SCardStatus - カードの状態を取得• SCardTransmit – カードとの通信

切断• SCardDisconnect – カードとの切断• SCardReleaseContext – リソースマネージャの解放

Page 14: Windows 10 mobileでnfc~suica・edy対応編~(公開用)

PC/SC Library での通信手順SmartCardReader で IC カードリーダを取得して、カード検知のイベントハンドラを設定

カードを検知したら SmartCard.ConnectAsync で IC カードに接続して、 SmartCardConnection を取得

ICカードの AccessHandlerを作成して、 ReadAsync / WriteAsync でデータを読み書き

SmartCardConnection.Dispose で通信路を閉じる

Page 15: Windows 10 mobileでnfc~suica・edy対応編~(公開用)

Felica のファイルシステム

Felica カードユーザーズマニュアルから引用 http://www.sony.co.jp/Products/felica/business/tech-support/

Felica には複数のシステムが共存できて、それぞれ独立している。ファイルシステムのアクセス単位はブロック (16 バイト ) で、サービスごとに 0 から始まるブロック番号で指定される。

Page 16: Windows 10 mobileでnfc~suica・edy対応編~(公開用)

Felica コマンド一覧Polling カードを検出する

・システムコードを指定Read Without Encryption 認証が不要なサービスからブロックデータを取得する

・カードの IDm 、サービスコード、ブロック番号を指定Request Service サービスの存在確認Request Response カードの存在確認Write Without Encryption 認証が不要なサービスへブロックデータを書き込むRequest System Code カードに登録されているシステムコードを取得する

情報の入手に別途契約が必要なコマンドもあるため、他は省略する。

Page 17: Windows 10 mobileでnfc~suica・edy対応編~(公開用)

サービスコード・ブロックコード情報

どこで入手可能?

多くが非公開有志が解析した情報が Web で入手可

Felica のアクセスに必要な情報・サービスコード・ブロック番号・バイトデータのデータ構造

Page 18: Windows 10 mobileでnfc~suica・edy対応編~(公開用)

PC/SC での Felica の読み取りFelica.AccessHandler の ReadAsync• Felica.AccessHandler

SmartCardConnection を指定して生成• 引数

サービスカウント数サービスコードリストブロックカウントブロックリスト

• 戻り値バイト配列

指定したサービスコードのブロックリストから読み込んだデータ

Page 21: Windows 10 mobileでnfc~suica・edy対応編~(公開用)

Suica の ReadAsync 結果デモ

Page 22: Windows 10 mobileでnfc~suica・edy対応編~(公開用)

Edy のフォーマット

引用元http://iccard.jennychan.at-ninja.jp/format/edy.html

Page 23: Windows 10 mobileでnfc~suica・edy対応編~(公開用)

Edy のフォーマット

引用元http://iccard.jennychan.at-ninja.jp/format/edy.html

Page 24: Windows 10 mobileでnfc~suica・edy対応編~(公開用)

EDY の ReadAsync 結果デモ

Page 25: Windows 10 mobileでnfc~suica・edy対応編~(公開用)

nanaco のフォーマット

引用元http://iccard.jennychan.at-ninja.jp/format/nanaco.html

Page 26: Windows 10 mobileでnfc~suica・edy対応編~(公開用)

nanaco の ReadAsync 結果共通領域

それ以外の領域

Page 27: Windows 10 mobileでnfc~suica・edy対応編~(公開用)

Edy の読み込み失敗共通領域 FE00 を使う Edy の読み込みが

失敗する• それ以外のシステムの読み込みは OK

原因の推測• PC/SC Library で Felica を読むとき、システ

ムコードを指定するタイミングがないため、ワイルドカードの FFFF でポーリングしていると考えられる。このため、常に 1 番目のシステムにアクセスして

いるのではないか?• 共通領域は 2 番目に配置されるとの情報があ

り、このため共通領域が読めないのでは?

Page 28: Windows 10 mobileでnfc~suica・edy対応編~(公開用)

Edy を読むには…?PC/SC Library の ReadAsync ではな

く、 Felica のコマンドを直接発行する1. システムコードを指定した Polling を行い、

カードを検出して IDm を取得2. 取得した IDm で Read Without Encryption を

実行して、ブロックデータを取得

Polling + システムコード⇒ IDm 取得

Read Without Encryption + IDm + サービスコード・ブロック番号 ⇒ ブロックデータ取得

Page 29: Windows 10 mobileでnfc~suica・edy対応編~(公開用)

Felica のコマンド送信

PC/SC の Transparent Exchange コマンドがあります

でも、どうやって Felica にコマンドを送信するの?

PC/SC ライブラリではFelica.AccessHandle クラスの TransparentExchangeAsync メソッド

Page 30: Windows 10 mobileでnfc~suica・edy対応編~(公開用)

Transparent Exchange で Polling

private async Task<byte[]> FelicaPolling(Felica.AccessHandler felicaAccess, UInt16 systemCode){  byte systemCodeUpper = (byte)(systemCode >> 8);  byte systemCodeLower = (byte)(systemCode & 0x00ff);

  byte[] commandData = new byte[] {   0x00, 0x00, systemCodeUpper, systemCodeLower, 0x01, 0x0f  };  commandData[0] = (byte)commandData.Length;

  var result = await felicaAccess.TransparentExchangeAsync(commandData);  return result;}

Page 31: Windows 10 mobileでnfc~suica・edy対応編~(公開用)

Transparent Exchange で Read Without Encryption

Read Without Encryption も同様にコマンドを作成して送信

Page 32: Windows 10 mobileでnfc~suica・edy対応編~(公開用)

EDY の Read Without Encryption 結果デモ

Page 33: Windows 10 mobileでnfc~suica・edy対応編~(公開用)

PC/SC Library を使わない方法Windows.Devices.SmartCards 名前空間だけを利用する方法も• SmartCardConnction の

TransmitAsync メソッド• PC/SC の仕様書通り Transparent

Exchange の APDU を作成して送信する

Page 34: Windows 10 mobileでnfc~suica・edy対応編~(公開用)

Transparent Exchange

Page 35: Windows 10 mobileでnfc~suica・edy対応編~(公開用)

Transparent Exchange

Page 36: Windows 10 mobileでnfc~suica・edy対応編~(公開用)

Windows Phone 8.1 と非接触 IC カード

Page 37: Windows 10 mobileでnfc~suica・edy対応編~(公開用)

Windows Phone 8.1 では?Transparent Exchange が利用不可ReadAsync は利用可能• Suica は読み取り可、 Edy は不可

Page 38: Windows 10 mobileでnfc~suica・edy対応編~(公開用)

まとめ

Page 39: Windows 10 mobileでnfc~suica・edy対応編~(公開用)

まとめ非接触 IC カードの読み書き• PN547 搭載端末では SmartCardReader クラスで実現可• Transparent Exchange で Felica コマンドを発行することで Suica ・ Edy にアクセスできる

PC/SC ライブラリ• PC/SC ライブラリの Read Binary は Suica は読み込み可、 Edy は読み込み不可

Page 40: Windows 10 mobileでnfc~suica・edy対応編~(公開用)

課題日本国内での NFC 対応端末• MADOSMA は NFC 非搭載• 今後の端末で Transparent Exchange に対応した端末が出てくるかどうか…

Felica アクセスのライブラリの整備• PC/SC ライブラリに依存しない方向で作成を検討中

Page 41: Windows 10 mobileでnfc~suica・edy対応編~(公開用)

参考資料Felica• http://www.sony.co.jp/Products/felica/

business/tech-support/

PC/SC• http://www.pcscworkgroup.com/

IC カードフォーマット• http://

iccard.jennychan.at-ninja.jp/format/index.htmlシステムコードのバイト順序が他サイトと異

なるので注意 (0xfe00 ⇔ 0x00fe)

Page 42: Windows 10 mobileでnfc~suica・edy対応編~(公開用)

今回扱わなかった発表テーマホストカードエミュレーション• カードとして振舞う

エミュレータでの NFC の扱い• エミュレータで開発可能