2014年9月18日木曜日

自作エンコード機、始動!

前々回のエントリーで製作した自作エンコード機ですが、早速エンコードの機会が訪れました。

今回は、これ!


9月28日に日比谷で行われる琉球フェスティバルです。

このフェスティバルでは記念用のポストカードが来場者に配布されますが、そのポストカードに NFC タグが付いています。来場者はそのカードに NFC対応スマートフォンでタッチすると、さまざまな情報がゲットできるわけです。
そのカード用の NFCタグ 2,500枚をエンコードしちゃいます。

で、セッティングを開始したんですが早々にトラブル発生!


自動ラベル送り機が機能しなさそう。
しまった、どうしよう。地味に問題だなこれは。ないのか、何か替わりになるようなものは…


あった!(お掃除コロコロ)
これをテーブルに設置すると!


完璧だ。
ということでエンコード開始。



よしよし、うまく動作していますね。
ところが800枚を超えたあたりからなぜか書込みエラーが頻発するようになりました。
巻き取り側はだんだん大きくなりますので、少しずつですが巻き取り速度は速くなっていきます。
今回のタグは小さいタグでしたのでピッチが狭く、書込みスピードが追いつかなくなってるのではというのは推測です。

でもまぁ、これを3回ほど繰り返して


完成~

書込み動作時の速度としては1分間に平均して250枚程度書けていたようです。十分ですね。

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 だしなぁ。まぁ、どうでもいいか。


2014年4月17日木曜日

ACRリーダでNTAG固有のコマンドを使う

このブログでは毎度おなじみの ACR122U リーダですが、UID取得やデータの書込み・読み込みはAPDUコマンドを使って簡単に行うことができます。
APDUコマンドってなんねー、っていう話はちょっと強敵すぎるので置いておいて、
例えば 0xFF 0xCA 0x00 0x00 0x00 っていうコマンドを投げると置いてあるタグのIDが返ってきます。

ANAのEdyカード

ACR122UToolで実行

で、ここまではいいんですが NTAG 固有の技を使いたいときはどうすればいいんでしょうか。というわけで Direct Transmit というコマンドが用意されています。これはリーダがコマンドをいろいろ解釈せんと、直接コマンドを送りつけるものです。

あー、これ使えばいいんやんとこれまでのほほんと暮らしてきたわけですが、実際使ってみて えー!そうやったん?というような内容があったのでここに書きます。

やりたいことは以前のブログにもありましたが NTAG21x のパスワード機能です。前回のブログでは Android でやってすんなりできたのでまぁ、ACRでも同じやろーと思っていたら全然違ったという話です。プログラムからやると面倒なので ACR122UTool を使って実行します。

認証コマンドは 0x1B です。これに続けて4バイトのパスワードを付けます。パスワードのデフォルトは 0xFF 0xFF 0xFF 0xFF なのでこれでやってみます。


まぁ、ダメですね。0x63 0x00 というのは ACRリーダ的にコマンドに失敗したという意味です。
で、Direct Transmit の出番です。構文は 0xFF 0x00 0x00 0x00 [以降の電文長] [コマンド] となっていますので、これに従って投げます。


やっぱりダメです。
よくよく見ると、Direct Transmit はリーダの中にあるチップ(PN532)に対してダイレクトに投げるコマンドのようです。つまり PN532 のコマンドを利用してその先の NTAG と通信しなければなりません。
というわけで PN532 の InCommunicateThru というコマンドを使います。0xD4 0x42 [投げるコマンド] の構文です。


あ、応答がありました。先頭の 0xD5 0x43 0x00 はコマンド種別とステータスです。後ろの 0x90 0x00 は正常終了のステータス。ということで間の 0x00 0x00 がコマンドの応答内容になります。先のブログの通り、ここは PACK 値というのが返ります。デフォルトは 0x00 0x00 なのでこれが返ってきてるようです。

よっしゃー!行けたか―!ということで読み書きパスワード設定済みのタグを使って読取をしてみます。パスワードが 0x01 0x02 0x03 0x04 に設定してあるのでこれを投げます。


PACK値に設定している 0x12 0x34 が返ってきてます。よしよし。
では読取コマンド 0x30 を使って 4ページ目を読みましょう。


あれ?

ということで結構悩んだんですが、ACRリーダの AutoPolling というのが影響しているそうです。
認証を行う場合、認証後にリードやライトをするわけですが、この間は当然接続が持続されていなければなりません。
しかし AutoPolling だと自動的に Polling をやっちゃって接続が切れてしまうのではないかというのは私の勝手な推測でありこれにより何らかの事故がありましても何の責任も負いませんということでご了承いただきたくよろしくお願い申し上げます。

というわけで AutoPolling をオフにします。


次に現在リーダに乗っているタグをアクティブにします。


で、先ほどと同じように認証コマンドを投げた後で読み取りコマンドを投げると


読めました!あー、結構大変やったなー。

2014年4月10日木曜日

9Solutions で遊ぶ

クレスコIDの大坂さんが遊びに来てくれました~。
簡単にロケーション管理が可能な 9Solutions のデモをマルチメディア館でやります。


セッティング中。9Solutions はBLEを使ってタグがどこにあるのかを検知します。

関係ないですがお昼休みにお弁当食べに行った海ではすでに泳いでる人たちが!


で、こちらが親分の機械。親分はネットに繋ぎます。


こちらが受信機とタグ。


受信機は電源だけあればよく、あとは受信機同士で通信して親分に報告し、親分がクラウドへ送信するとまぁ、そういう感じです。タグにはボタンが付いてたりして、ボタンが押されたら通知することなどもできます。

管理画面がこちら。タグがどの部屋に居るのかがリアルタイムにわかります。


3つの部屋に受信機を設置しました。親分は左上の部屋に置いてあります。受信機同士が話し合って、一番タグに近い受信機のある部屋にそのタグがあるということで親分に報告し、クラウド上のデータが更新されます。
うーん、本当に簡単にできちゃいましたねー。

私「なんで 9Solutions って名前なんですか?」
大坂さん「さぁ~?」

2014年3月28日金曜日

NTAG21xのシグネチャ機能を試す

NTAG21xシリーズのタグにはシグネチャという機能が搭載されています。
これはタグに対して「あんたのシグネチャ教えんね」とコマンドを投げると、「ほげほげ」と32byteのシグネチャを返してくるので、これをゴニョゴニョといじると正しいシグネチャがどうかが確認できるという機能です。
要するに、「あんた本当にNXPのタグね?」というチェックができるわけです。この機能を使えば本当にタグにタッチしたのかどうかが判別できます。

で、上のゴニョゴニョって何ね?何すっとね?ということなんですが、これはNXP社のHPから仕様書がダウンロードできます。(ダウンロードには、NDA的な書類にサインしてNXP社に送ってパスワードをゲットする必要があります)
そんなもんでここにはその詳細を書けないのですが、とりあえずやってみました。

まずはシグネチャをゲットする READ_SIG コマンド(0x3C 0x00)を投げます。
そうすると32byteのデータが返ってきます。



もちろん READ_SIG コマンドに対応していない(NTAG21xシリーズでない)タグはこのコマンドで失敗します。
で、これにゴニョゴニョをかけると...


ほら、確認できました(っていうかメッセージ出してるだけだけど)。