#はじめに
前回までで一応、NFC Type F のリードまではできるようになっていました。
今回はちょっとだけ補足とまとめをしますね。
#処理の流れ
##Session
まずは CoreNFC のセッションを作成します。
let session = NFCTagReaderSession(pollingOption: [.iso14443, .iso18092],
delegate: self)
session?.begin()
このとき、Type F 以外にも Type A/B も同時にスキャンしたい時はこんな感じになります。
もちろん、Type F だけで良い場合は .iso18092
を指定すれば OK です。
スキャンして NFC タグが見つかったら、デリゲートが呼び出されます。
Type A/B/F でスキャンしている場合は、TypeA/B と Type F でアクセスする実装が違ってくるので、ここで判別することになります。
大雑把にはこんな感じです。
func tagReaderSession(_ session: NFCTagReaderSession, didDetect tags: [NFCTag]) {
let t : NFCTag = tags.first!
switch t {
case .feliCa:
// Type F
case .iso7816:
// Type A/B
default:
return
}
}
##Service
タグに接続できたらアクアスしたいサービスを指定します。
サービスコードはリトルエンディアンになります。
let serivces = [Data([0x8b, 0x00])]
feliCaTag.requestService(nodeCodeList: serivces,
completionHandler: {
(nodes, error) -> Void in
})
##Read
サービスを指定したらリードできます。
アクセスしたいブロックを指定します。Type F ではブロック単位でのリード・ライトになるんですが、1ブロックは16バイトのバイト列になります。swift なら Data 型ですけどね。
ただ、この時もサービスをしている必要があるのと、ブロックの指定もリトルエンディアンです。
let serivces = [Data([0x8b, 0x00])]
let blockList = [Data([0x80, 0x00])]
feliCaTag.readWithoutEncryption(serviceCodeList: serivces,
blockList: blockList,
completionHandler: {
(status1, status2, dataList, error) in
})
ステータスフラグとデータとエラーが取得できます。
ちなみに本来の NFC の通信なら、ここでレスポンスコードとか PICC とかも取得できるみたいなんですが、端折られるみたいなんです。
ま、普通はそこまで不要だとは思うんですけど、取得する方法はあるんでしょうかね?
##Write
サービスを指定したらライトもできます。
ほぼリードと同じですね。ライトしたいデータを渡せるようになっているのが違いです。
feliCaTag.writeWithoutEncryption(serviceCodeList: services,
blockList: blockList,
blockData: blockData,
completionHandler: {
(status1, status2, error) in
})
#まとめ
処理の流れをまとめてみました。
Type A/B はちょっとだけ厄介ですが、Type F はずいぶんスッキリした API でアクセスできるのが良いですね。
今回は暗号なしでしたが、暗号ありはサービス提供者との契約が必要になるみたいです。