今回は行先ボードアプリの入力のために
PaSoRi(RC-S380)を使用してNFCの読み取り機能を作成してみました。
この非接触のタグというのは何気に色々と思い入れのある技術です。
といっても僕が携わったのはRFIDの方ですが。
- RFID(radio frequency identifier:無線周波数識別子(Google翻訳より))
- NFC(Near field communication:近距離無線通信)
RFIDは読み取り距離が7mくらいありますがNFCは10cmくらいです。
RFIDはユニクロのセルフレジやスシローの回転ずしの皿などが有名です。
NFCは交通系ICが有名ですね。
で、今回はNFCの方です。FelicaはNFCの中の1つでSonyが開発したものになります。
Suicaなどの交通系ICもFelicaです。
今回ドハマりしたポイントを中心にお話します。
今回はPaSoRiを使用して読み取りを実現しています。
使用する機器
- PaSori(RC-S380)
- Suica,PASMO,Manaca,免許証,おサイフケータイ(AQUOS SH-RM12)
動作イメージ
使用するソフトウェア技術
- Nugetパッケージ(PCSC.iso7816)
参考ページ
世の中に素晴らしいサンプルがあったので僕の?コードは割愛します。
かわりに上記参考ページの中で一番参考になったソースコードのリンクを貼っておきます。
イベント処理
UIDの読み取り処理
さて、本題です。
知らなかったのは僕だけかもしれませんが、
免許証やおサイフケータイからかえってくるIDが毎回ころころ変わりやがります。
以前、PaSoRiを使ったソフトのデモを見て、
「運転免許証も使えるやん」と考えていたのですが
今回やってみたらリーダーで読ませるたびにIDが違います。
で、僕のスマホのおサイフケータイも同じ。
何それ。使えんがや。
ぶっちゃけ意味不明です。調べてもズバリの記事が出てこないんですね。
NFCのIDはIDmやUIDと呼ばれるようで色々調べてみました。
むしろ固定値であることを擁護する記事が中心です。
IDmは、FeliCaカード製造時にICチップに記録され書き換えができない固有のID番号である。
IDmは8byte(16桁)の数字で、トレーサビリティと個体識別を目的として
ソニーが製造するICチップに書き込まれ同じ番号が流通しないようにソニーが管理をおこなっている。
https://www.orangetags.co.jp/what_felica_idm.html
UIDとは、Unique Identification の略称で、RFID(*)全般で使用されるICカード固有のユニーク番号です。
製造時にICチップに書き込まれており、書き換えは不可能です。
比較的簡単に利用できることから、多くのアプリケーションやシステムなどで、
個人紐付け対象番号として広く利用されています。 このUIDを、FeliCaの場合は「IDm」と呼びます。
また、桁数もICチップによって異なります。
https://www.kenbisha-iccard.com/information/idm.html
どうやらNFCには3種類(Type-Vというのもあって4種類という人もいるみたい)のタイプがあるようです。
- Type-A(タスポ)
- Type-B(免許証など)
- Type-F(交通系ICなど)
Type-BのIDはPUPI(Pseudo-Unique PICC Identifier)と呼ばれているようで、
リーダーで読み取る度にランダムな値を返すようです。んぁ?
Type-Bがすべてそうなのかは未確認です。
どうやら古い免許証は固定のようです。
誰かとかぶってるかもしれませんけどね。情報求む。
免許証も特定の年度を境にころころ変わるタイプに変更したみたいです。
免許証のチップで入門する仕組みなんて作ってたら大変。
まぁ、免許証のIDは4byteですので入門に高々タッチ42億回くらいです。
0歳の子ならば2秒に1回寝ずにタッチし続ければ古希(70歳)までには入門できます。
今回、PaSoRiを使用した認証の仕組みを
行先ボードに実装してみましたが勘違いの元ですね。
とりあえず、免許証やおサイフケータイでの認証は
読み取ることはできますが毎回IDが変わるので個人を特定することができません。
すごい中途半端。
とりあえずSuicaやPASMOなどType-F(Felica)は使えます。
もしかしたら社員証などもいけるかもしれません。
読み取るカードの種類は限定した方が良さそうです。
結論は運用でカバー。ダサい。
NFC(免許証やおサイフケータイ)のIDmやUIDがリーダーで読み取るたびに変わる問題 – PaSoRiでの読み取り実装
おわり
コメントを残す