NFCタグ で鍵を開けよう(1) NFCタグにURIを書き込む

この記事は「NFCタグ で鍵を開けよう」シリーズの第1弾です。 以下、5つの記事に分けて投稿していく予定です。

  1. NFCタグにURIを書き込む(この記事)
  2. iPhoneを鍵とし、ドアにNFCタグを設置するパターン
  3. iOSアプリを経由してセキュリティレベルをあげる(まだ書いてません)
  4. NFCタグを鍵とし、ドアにNFCリーダーを設置するパターン(まだ書いてません)
  5. より実用的にしていくために(まだ書いてません)

導入

我が家にスマートロックのSesameを採用しました。

私一人ならSesameだけでものすごく便利になったわけですが、我が家には小さい子供が3人います。子供たちにスマホを持たせるにはまだ早く、このままではスマートロックの恩恵を十分に受けることができません。

なお、Sesameは個人が触れる便利なAPIを公開してくれています。NFC+Sesame APIでこの状況を改善できるものではないか、と思い立ったのがこの記事を書くきっかけです。まだ現在進行形で実験中ですが、実験した結果を随時記事にしていければと考えています。

この記事でやること

私がNFCタグを取り扱ったことがないところからスタートしましたので、まずこの記事では「NFCタグに情報を書き込む」ところまでだけが範囲になります。

実際にSesameをアンロックするところなどは次の記事で書かせていただきます。

準備した機器

スマートロック

導入に書いたとおりですが、Sesameを購入しました。

APIでのロックやアンロックが可能で自由度が高そうだったのがSesameを選んだ理由です。

利用するNFCタグ

サンワサプライ NFCタグ(10枚入り)をAmazonで購入しました。

NFCリーダー/ライター

NFCリーダー/ライターとしてはPaSoRiを購入しました。

これも使えればどれでも良いと思いますが、ネット上で利用実績が多く安全そうなものを選んだだけです。

nfcpyでNFCタグの情報を扱う

まずはMacにNFCリーダーを接続してNFCタグから情報を読み取るところからはじめます。

調べたところnfcpyというツールがよく使われているようです。 実際に使ってみたところ確かに簡単に利用でき、読み取りから書き込みまでこれで全て完結できそうです。

このツールのexamplesフォルダにそのまま使える便利なサンプルがたくさん入っていました。

情報の読み取り

NFCタグに書き込まれた情報を読み取るにはexsamplesの中のtagtool.pyを使って

python tagtool.py show 

とするだけです。

フォーマット

NFCタグをフォーマットしたいときもtagtool.pyを使って

python tagtool.py format 

とするだけです。

URI書き込み

NFCタグにURIを書き込みたい場合のみ少し工夫が必要でした。 とはいえ、exsamplesの中にあるものだけで改造なしで可能です。

例えばhttps://tag.exsample.com/lockというURIを書き込むこととします。

まず、うまくいくパターンからですが、

echo -n \\0x04tag.exsample.com/lock | python ndeftool.py pack -t urn:nfc:wkt:U - | python tagtool.py load -

でURIを書き込み可能です。 まず、NFCタグに書き込む情報はNDEF(NFC Data Exchange Format)でないといけないようです。NDEFではTextURISmartPosterなどのRecord Typeを扱えます。

上記コマンドでは、

  • python ndeftool.py pack -t urn:nfc:wkt:U - で、標準入力の内容をRecord Type == URI(urn:nfc:wkt:U)のNDEFに変換しています
  • 次にpython tagtool.py load -でそのNDEFをNFCタグに書き込む

ことをしています。

流れはこれでわかると思いますが、一点だけ、echoの部分が

echo -n https://tag.exsample.com/lock

ではなく

echo -n \\0x04tag.exsample.com/lock

と意味不明な\0x04という文字列が含まれているのが気にかかるかと思います。

URIの書き方

これは、NDEFにおけるURIは「1バイトのIdentifier code」とそれ以降のURI fieldの組み合わせで記述するというルールがあるためです。

具体的なIdentifier codeは以下です。

Identifier code プロトコル
0x00 N/A
0x01 http://www.
0x02 https://www.
0x03 http://
0x04 https://
0x05 tel:
0x06 mailto:

今回の場合はこのルールに従って、 https://\0x04 に置き換えています。

実際に書き込んだNFCタグをiPhoneで読み取る

それでは、このURIを書き込んだ情報をiPhoneで読み込んでみましょう。

iPhone XR/XSであればBackground Tag Readingをサポートしますのでアプリなど入れずにNFCタグにタッチするだけでこの情報を読み取れます(Background Tag Reading未対応機では別途アプリが必要です)。

うまく読み取れるとiPhoneの上部に通知ポップアップとしてそのURIが表示されます。そのポップアップをタップするとそのURIが実行されますので、これから、そのURIをトリガーとして動くプログラムを実装すれば、あらゆることがNFCタグをトリガーとして実現できるということになります。

今回の記事はここまでです。

記事一覧

  1. NFCタグにURIを書き込む(この記事)
  2. iPhoneを鍵とし、ドアにNFCタグを設置するパターン
  3. iOSアプリを経由してセキュリティレベルをあげる(まだ書いてません)
  4. NFCタグを鍵とし、ドアにNFCリーダーを設置するパターン(まだ書いてません)
  5. より実用的にしていくために(まだ書いてません)

参考にさせていただいた記事

所の執筆・監修した書籍

iOS 11 Programming

iOS 11 Programming

  • 著者:堤 修一,吉田 悠一,池田 翔,坂田 晃一,加藤 尋樹,川邉 雄介,岸川 克己,所 友太,永野 哲久,加藤 寛人,
  • 製本版,電子版
  • PEAKSで購入する
iOS 12 Programming

iOS 12 Programming

  • 著者: 加藤 尋樹,佐藤 紘一,石川 洋資,堤 修一,吉田 悠一,池田 翔,佐藤剛士,大榎一司,所 友太,
  • 製本版,電子版
  • PEAKSで購入する