NFCリーダーアプリで読み取れる限界をさぐってみた

# はじめに
[CYBIRD Advent Calendar 2023](https://qiita.com/advent-calendar/2023/cybird)の9日目担当の@chikako_ikedaです。
スマホアプリを専門に担当するチームにてAndroid側の担当をしています。
8日目は@cy_ssssさんの「インターンでPhaser3に触れた話」でした。
JavaScriptがわかるだけでゲームが作れる、というのはこれからプログラミングに親しんでいくにはとってもいい題材だと思います！

# 概要
一昨年、昨年に続き、今年もAndroid側の担当を続けているのですが、今年はNFCについて調査する機会がありました。
そこで何かクリスマスっぽいことを…:thinking: と思ったのですが、いかんせん技術目線になるとNFCは途端に片足突っ込んだつもりが引き抜くのに苦労する沼なので…
今回はある意味、「技術目線なんだけど、使う時に気をつけたいこと」に着目することにしました。
なので、今回はほぼコードの話はしません。

# 本題
「技術目線なんだけど、使う時に気をつけたいこと」とした場合、NFCで気にすることって何があるだろうと考えました。
そもそもなぜNFCについて調べていたか、といえば4割趣味ですが6割は「NFCを使った企画ってどんなことができるかな？」という相談があったからです。

企画をする人がNFCを使ったアプリで気にすべきことって何でしょう？

アプリエンジニアによく来る問い合わせは「アプリ、動かないんですけど！？」というものなんですが、つまりそれって「どんな状況なら使いやすいのか、あるいは使いにくいのか」ということがユーザにはわからないってことですよね。
特にIoT分野となるNFCではそれが顕著です。
そいうわけで、「NFCってどういう条件なら読み取れるのか？」を調べてみました。

## そもそもNFCとは?
NFCを連呼してきましたが、そもそもNFCとはなんぞや？　という方もいるかもしれません。
```
NFC = Near Field Communication = 近距離無線通信
```
非接触型ICチップを使用した通信規格、つまり、ICチップにデータを登録したり、読み込んだりする無線通信する技術です。
この技術は運転免許証やマイナンバーカードなどの各種証明証やキャッシュカードやクレジットカード、そしておサイフケータイにも使われています。

### NFCでできること？
ICチップにデータを登録することと、登録されたデータを読み込むことができます。

と言ってもコレだけではわからないかと思うので、ちょっと具体的な例にしてみます。

たとえば、ICチップの中に氏名や生年月日、住所を登録し、それを読み取ることができれば身分証明証になります。
あるいは、サービス名とユーザID、所持金額を登録し、読み取った後に支払いシステムを経由して支払い後の所持金額をICチップに書き込めば電子マネーとして使えます。
最近は「Air Tag」もあります。

結構色々なことができますね。
しかも、「非接触型」なので、USBなどで繋がなくてもいい。なんならちょっと離していても通信ができます。

### 向いてないこともある
#### 通信距離が短い
「近距離無線通信」という規格名からもわかる通り、NFCは「近距離」での通信ができます。
NFCの中にも対応距離の違いはあるのですが、 **最短3mm、最長70cm** とのこと。
一番普及しているだろうスマホに搭載されているものは **10cm以下** です。
至近距離じゃないと使えません。

#### 通信速度はゆっくり
通信距離が短い他にも通信速度が遅い、というものがあります。
Wi-FiやBluetooth通信が、Mbps単位だったりGbps単位だったりするのに比べて最大でも849kbpsとのこと。
スマホで撮影した短い動画でも読み込みや書き込みには分単位の時間がかかりそうです。

#### 大容量通信は勘弁
通信速度がゆっくりなので、大容量なデータをやりとりすることは向いていません。
30秒程度の動画でも分単位ですから…

## 本体が小さい
ところで、ICチップやICタグの実物をみたことはありますか？
私が持っているのは直径2.5cmの丸いプラスチック板みたいなものなんですが、これは「ICタグ」の方。
<img width="150" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294629/97edd48e-2efc-e830-d463-3f00ebb8fe7c.jpeg" />
多分、本体の「ICチップ」になると、直径2~3mmくらいになります。
Amazonなどでも売っていますが、こういう丸いタグやカードで売っていることが多いです。

私は思いました。
カードばっかでつまんなくない？　と。

このNFCタグにクリスマスメッセージ(文字だけ）を登録して、グッズの中に入れたらクリスマスのご挨拶っぽいのでは？！

## 読み取れる限界は？
物の中に入れてしまえ！　と思いついたのはいいですが、「近距離でしか通信ができない」というのは、なかなかに大きな制限です。
そして、日常で使うスマホを思い出しましょう。
Suica/Pasmoをスマホに入れている人はたくさんいます。
しかし、改札を通るときに読み取り機から10cm以内にスマホがあっても、ほぼタッチレベルでかざさないと読み込まないですよね。

ということは、10cmよりも、もっと短いですね…？

### 限界はどこ？
そういうわけで試してみることにしました。
以下、試した結果です。読み込めたら⚪、読み込めなかったら×です。
実験端末はPixel 6a。なお、読み取り位置は端末の真ん中から画面下側になります。
※端末によって読み取り位置は変わります。

<table>
    <caption>障害物なし</caption>
    <thead>
        <tr>
            <th>距離</th><th>10cm</th><th>5cm</th><th>3cm</th><th>1cm</th>
        </tr>
    </thead>
    <tr>
        <th></th><td>×</td><td>×</td><td>△</td><td>⚪︎</td>
    </tr>
</table>

3cmの時点で結構危うい…
では次は障害物ありで、3cmの距離固定で試してみます。グッズでよく使いそうな素材ということで障害物は紙と布とアクリルです。

<table>
    <caption>障害物あり(距離は3cm固定)</caption>
    <thead>
        <tr>
            <th>障害物:紙</th><th>1枚</th><th>10枚</th><th>厚さ1cm</th>
        </tr>
    </thead>
    <tr>
        <th></th><td>⚪</td><td>⚪︎</td><td>⚪︎</td>
    </tr>
    <tr>
        <th>障害物:布</th><th>1枚</th><th>5枚</th><th>厚さ1cm</th>
    </tr>
    </tr>
        <th></th><td>⚪</td><td>△</td><td>×</td>
    </tr>
    <tr>
        <th>障害物:アクリル</th><th>3mm</th><th>6mm</th><th>1cm</th>
    </tr>
    </tr>
        <th></th><td>⚪</td><td>△</td><td>△</td>
    </tr>
</table>

障害物なしに比べれば感度は落ちましたが、紙は想定通りに1cmの厚さがあっても平気そうです。
布は綿製のものを使ったんですが、5枚あたりで怪しくなっています。 布系グッズに忍ばせる場合は表面側が安全そうです。
アクリル1cmは流石に無理だろうと思っていたんですが、時々読み取れました。意外。
ただ、今回は1端末でしか試していないので、機種ごとにもしかしたら違いがあるかもしれないです。
そちらは、機会があれば試してみます。

# さいごに
こういった検証などは、直接アプリやシステムに関係しないですが、企画や運用をしていく際には必要な情報でもあります。
事前調査が必要になった時はぜひ試してみてください。

明日のCYBIRD Advent Calendar 2023 10日目は、@moffunnyaさんの「GCPを使ったウェブサーバー（nginx）の構築入門」です。
お楽しみに！