2014年7月22日火曜日

エイ坊のNFC情報配信端末を試作しました。

NFCは今やほとんどのスマートフォン(iPhone除く 泣)に搭載されている機能ですのでこれを利用して情報配信したいよ~という方もきっとたくさんいらっしゃいますね?

ということで沖縄市のイメージキャラクター「エイ坊」のNFC情報配信端末を試作してみました~。
どーん。

右側からタブレットがはみ出していたりするのは気にしてはいけません。
これ実は立体プリントというものを使用しています。意外とゴージャスです。
斜めから見るとほら。


太鼓の部分とエイ坊が3Dになっています。エナメル線みたいのが飛び出ていたりするのは気にしてはいけません。

端末には「イベント」、「グルメ」、「観光」の3つのメニューがあって、タッチした後にスマートフォンで太鼓にタッチするとそれぞれの情報がゲットできます。


グルメボタンにタッチして...(ドドン 効果音)


スマートフォンを太鼓にタッチするとコザ周辺のグルメ情報がゲットできます。
仕組みはまぁ、すごい単純です。端末はネットに繋ぐ必要がありませんので、電源だけあれば動きます。

将来沖縄市にお越しいただいた際にはこの端末がどこかで見れるかも?しれません。

2014年7月11日金曜日

NFCエンコード機を自作してみました。

みなさんこんにちは。今日も元気にエンコードされていますでしょうか。エンコード楽しいですよね。でも10枚くらいなら全然平気ですが、1000枚とかになると うぅぅ ってなりますね。

というわけでエンコード機を作っちゃいましたー。
どーん。


名付けて「Hayato Encoder Machine」
一番左にあるのがラベル巻き取り機です。


このマシンの中で一番高価な機械で7万くらいします。
ただやってるのは巻き取るだけです。ラベルに弛みが出ると自動で巻き取ってくれるというとても便利な機能が付いているんですが一切使わずに巻き取りだけしています。かなり贅沢な使い方です。


で、段ボールエンコードテーブルの上に搭載されているのが ACR122U リーダ2個です。右側が書込み用、左側がベリファイ用です。


巻き取り機と段ボールエンコードテーブルの間にあるのがこのUSB扇風機と朱肉のセットです。何に使うのかは後で説明します。


こちらはラベル送り出し装置ですね。無電源で動作します。

エンコードするのは15枚のサーカスNTAG203です。もっといっぱいやってみたいですがタグがもったいないのでとりあえず15枚で我慢してください。

動作させるとこんな感じです。

PC上では左側が書込み状態を表示して右側が検証結果が出ています。段ボールエンコードテーブルと逆ですね。すいません。そこそこの速さで書き込みできています。これぞ前回エントリーの DirectTransmit の賜物ですね。

で、15枚の後ろに1枚ロック済みのタグを貼って、計16枚で再度流してみます。ロック済みなのでこのタグは検証で失敗します。ここで扇風機の登場です。

検証に失敗したタグが通過する際に扇風機が回っています。この扇風機、前の写真を見ていただくとわかりますが、羽に糸がセロテープでつけてあります。これが回ることにより、朱肉のついた糸がタグに印をつけてくれるんですねー。
先ほどのタグを見てみると、


ほら、(うっすらと)赤いのがついてますね!まぁ、こういうのはだいたいの位置がわかればいいと思うんですが何か?

というわけで自作エンコード機をご紹介いたしました。ちなみにこのマシンは社内用で販売はいたしませんのでご了承ください。

2014年7月4日金曜日

PC/SCに潜む謎 その2

前回の(1年以上前ですが)「PC/SCに潜む謎」の続編です。実は何気にこのエントリーが一番アクセスが多いです。前回は PC/SC のコマンドがカードに対して投げるものであって、リーダに投げるものではないというお話でした。

しかしそう、あったんです。リーダに投げる方法がぁ!(騒いでるのは私だけです)

SCardConnect の際に ShareMode というのを指定するんですが、ここに SCARD_SHARE_DIRECT というのがありました。で、これで SCardConnect するとカードが無いのに待望のカードハンドルがもらえるのです!うはー!(激喜

そして、ここからは ACR122 だけの話かもしれませんが、SCardTransmit ではなくて SCardConrtol というコマンド(これもカードハンドルが必要)で投げることで DirectTransmit が可能になります。

というわけで前回の最後の方の「カードが置いてないときにAPDUコマンドは送信できない」という部分は間違いでございましたので訂正してお詫びいたします。

では早速やってみましょう。いつもの ACR122 ちゃんです。


SCardEstablishContext から SCardListReaders してリーダを取得するところまでは前回と同じです。

で、この状態で SCardConnect を SCARD_SHARE_DIRECT モードで実行すると、カードハンドルが取得できます。もちろんカードは置いていません。

そのカードハンドルを使って SCardConrtol コマンドを IOCTL_CCID_ESCAPE_SCARD_CTL_CODE というコントロールコードで実行します(追記:2014/09/19 Raspberry Pi ではこのコントロールコードは 0x42000DAC (0x42000000 | 3500) で動作します)。とりあえず Get Firmware Version というコマンド(FF 00 48 00 00)を投げてみます。

すると 41 43 52 31 32 32 55 32 31 30 (ASCIIで ACR122U210) が返ってきました。動作していますねー。

では DirectTransmit に挑戦です。
ACR122U には PN532 というチップが入っていますので、このチップに直接コマンドを送ることができます。
Direct Transmit についての詳細は「ACRリーダでNTAG固有のコマンドを使う」を参照ください。

今回は InAutoPoll というコマンドを実行してみます。これはポーリングを行うコマンドです。どのタイプのタグをポーリングするとか選んだりできますし、何よりタグが通信圏内に入るとすぐに通知してくれます。

最初にリーダの自動ポーリングをオフにします。これは ACRリーダの Set PICC コマンドを利用します。

で、InAutoPoll コマンドを投げます。ポーリング間隔を一番短い 150ms で実行します。するとプログラムは応答待ちになります。そこでカードを近づけると...おー!おぉー!ぐひひー!  って何やってるかわかんないですね。ACR122UToolで同じことやってみます。

まずはリーダの自動ポーリングをオフに。


そして InAutoPoll コマンドを投げます。すると応答待ちになります。


タグを近づけると...


きたー。NTAGを近づけてみたんですがちゃんとUIDが採れています。
って何か InAutoPoll の話になってきちゃってますが、今回はこれが PC/SC からできたよっていうお話なのでした。
うーん、謎は解決したということでいいんだろうか。関数名は SCardControl だしなぁ。まぁ、どうでもいいか。