2016年8月22日月曜日

EPCの謎に迫る その3

UHFのタグにはEPCというIDが振られていて、EPCエリアにそのID(通常96bit)が書き込まれています。ただEPCエリアにはEPCのIDだけ書かれているわけではなくて、CRCとPCというのが書かれています。CRCはエラーを検出するためのもので、タグが生成しますので読み取り専用です。

で、今回はPCのお話です。通常はEPCが書ければ問題ないので気にすることはないのですが、どうも不思議な動きをしているのを見つけたので調べてみました。仕様については GS1 のサイトに資料がありますのでこちらを参照。

http://www.gs1.org/epc-rfid

PCは16bitで構成されていて、順番に以下の構造になっています。

EPC Length (5bit)  -  EPCの長さです。ワード(2byte)単位に指定します。5bitなので、00000~11111となり、0バイト~62バイトの指定ができます。通常はEPCの長さは 96bit(=12byte)なので、00110が設定されています。

UMI(User Memory Indicator) (1bit)  - ユーザメモリを使用している場合は1、使用していない場合は0を設定するようです。これがちょっと曲者です。後述します。

XPC Indicator (1bit) -  タグが、XPCという拡張機能を実装している場合は1、していない場合は0のようです。

Toggle (1bit) - ここが0だと EPC Globalの仕様のタグで、1だと ISO15961の仕様のタグと見なされます。

Attribute/AFI (8bit) - EPC Globalの場合は EPC Globalで定義されたフォーマットを指定し、ISOの場合はAFIで定義されているフォーマットを指定します。

EPC Lengthは割と使う(EPCの長さを変える)んですが後のはあまり意識したことないですよねー。ほとんどデータフォーマットの情報(Toggle と Attribute/AFI)なんですが、UMIとXPCというのがあります。

XPCはタグの仕様で決まりそうなのでいいとして、問題はUMIです。ユーザメモリを使用している場合は1なんですが、使用してるかどうかって何だろうと思って仕様を見ると、「ユーザメモリの3bitから7bitに1がある場合、自動的に1になる(要約)」だと!

自動的に1になるだぁ?そんな勝手なことでいいのかぁ?そもそも何で3bitから7bitって中途半端なんだぁ?と疑問は尽きません。調べてみるとユーザ領域もお作法があるようです。

ユーザ領域の先頭部分に、DSFIDとPrecursorというそれぞれ 8bit の書式があり、DSFIDの4ビット目~8ビット目にData Formatを格納するところがあって、ここにユーザエリアのフォーマットを入れられるようになっています。この4ビット目から8ビット目というのが、上記の3bitから7bitに相当します(0からはじまるので)。

要するに、ユーザ領域にきちんとした書式が設定(0以外)されていると、UMIが自動的に1になるということのようです。

自動的とかホントか?ということで試してみました。
まず普通のタグ読みます。


画面にはPC+EPCが表示されていて、PCが3000なのでEPCのレングスが6になっています。
で、ユーザ領域のDSFIDをいじります。


そしてもう一回読み取りすると...


あー、ホントだ―、変わってるー。
ってこれ結構厄介だなー、何で今まで気付かなかったんだろう。



2016年8月10日水曜日

同じEPCを持つタグをTIDを使って識別したい

RFIDのタグは貼って使うと、物を識別することができます。それでは、タグ自体を識別することはできるのでしょうか。もちろん異なるIDのタグ同士であれば、簡単に識別することが可能ですね。それでは、タグのIDが同じだった場合はどうなるのでしょうか。
普通はRFIDシステムを使う上で、タグのIDが同じかなんて気にする必要はありません。誰かが重複しないように作成してくれています。この記事はその誰かが確認する場合の方法を検討しながら、RFIDへの理解を深めるのが目的になります。但し、他システムや他社との間でタグIDが重複しないようにする枠組み( ISO国際規格やGS1標準)については扱いません。
RFIDタグは一般的にIDと呼ばれるEPC領域に書き込まれた値の他に、TIDと呼ばれるものを持ちます。TIDにはチップベンダー出荷時点で一意の値が書き込まれており、書換できません。このTIDを使ってタグ自体を識別することができないかを実験しながら確かめてみたいと思います。

それでは、実際にタグのIDとTIDを読んでみましょう。以下のものを用意しました。

  • Alienリーダとアンテナ
  • Alien RFID Gateway(リーダ付属のソフトです)
  • タグ何枚か

Alienリーダが起動したら、Alien RFID Gatewayを立ち上げます。接続されたリーダを選択したら、右下の「Tag Programmer」というボタンをクリックします。下のような画面が表示されます。


Tag Programmerはタグの詳細情報を見たり、タグにIDを書き込んだりすることができます。画面のEPCの部分がタグのIDを、Higgs UTIDの部分がTIDをそれぞれ表しています。

Tag Programmerの機能を使って、今回は3枚のタグに同じIDを書込みました。アンテナにタグを載せ、EPC Dataのボックスに好きなIDを入力し、「ProgramEPC」ボタンを押すと書き込めます。ちなみに書込むときは電波出力は抑えた方がよいです。画面では、RF Attenuationを最大の15 dBに設定しています。

同じIDのタグが準備できたところで、タグを読んでみましょう。アンテナにはIDが同じタグを載せておきます。

複数枚一度に読むので、一旦画面を閉じ、今度は「Tag Grid」という機能を使ってみます。おそらく下の画面のように表示されます。


Tag Grid画面では、1つのIDが1つのアイコンとして表示されるので、3枚のタグのIDが同一のため、一つのアイコンとして表示されてしまっているようです。

それでは、IDに加えTIDも合わせて読んでみるとどうなるでしょうか。リーダの設定を変えて試してみます。

設定の変更にはTag Grid画面の「Alin> Command Line」の「Send>」のところに一行ずつ各行を入力し、エンターを押します。
  1. AcqG2TagData = 2 2 4
  2. TagStreamFormat = Custom
  3. TagStreamCustomFormat = EPC:%i ${G2DATA1}, Disc:%d %t, Last:%D %T, Count:%r, Ant:%a, Proto:%p
一行目はIDを読むときに、TIDも一緒に読むための設定です。二行目はリーダからの送信データに独自書式を使うための設定です。三行目は独自書式の詳細となります。詳細はAlienリーダのマニュアルに載っています。

全行入力し終わると、以下のような表示に変わります。



各アイコンの上に表示される十六進数が従来はIDのみだったのに対し、IDにTIDを付加した形になっており、それぞれ別のタグとして識別することができました。大量のタグのIDが重複しているか確認するには、「Persist Forever」を選択した上で、対象のタグを読ませ、「Save Data」すると、タグのIDがCSV形式で保存されます。あとはExcelなどで加工・集計すれば、確認できると思います。

もう少し使い勝手をよくするために、ExcelToolでIDとTIDを合わせて読みたいと考えているのですが、実現できていません。もちろんアンテナの読取領域に同一IDのタグが一枚だけならば、実現できるのですが、肝心の複数枚存在するパタンでうまくいきません。SessionやSelect、TargetなどRFIDに関するより深い理解が必要なようです。何か分かったら、また投稿したいと思います。