RFIDのリーダーは、タグに向けて電波を出し、タグからの反射(バックスキャッタ)を受け取ることでEPC(タグの識別番号)を読み取ります。では、自分では一切電波を出さず、既存のリーダーとタグのおしゃべりを横から傍受してEPCを読めるでしょうか?
答えは「読める」です。しかも学術的には passive Gen2 monitor として知られた確立した手法だそうです。今回は、SDR(Software Defined Radio)で920MHz帯のRFID通信を録音し、電波の波形を1段ずつ追いながらEPCを復号するまでを、実際の測定波形とともに紹介します。使った受信機は12bitの Airspy Mini、RFIDリーダはタカヤさんのリーダーで試しました。
タカヤさんリーダとAirSpyと別の目的で作った自作の八木アンテナ
UHF帯のRFID(EPC Gen2 / ISO 18000-63)の通信は、非対称な2方向でできています。
下り(リーダー→タグ): リーダーが搬送波の振幅を変調してコマンドを送る。信号は強い。
上り(タグ→リーダー): タグは自分では電波を出せないので、リーダーの搬送波を反射する量を変化させて情報を返す(バックスキャッタ)。信号はとても弱い。
傍受する側から見ると、下りは「大きな声で喋るリーダー」、上りは「その声に乗るタグの小さなささやき」みたいなもんです。両方を復号できれば、会話の全容がわかります。
インベントリ(タグ読み取り)の基本的な流れは次のとおりです:
リーダーが Query(読み取り条件を指定)を送る
タグが RN16(16bitの乱数)をバックスキャッタで返す
リーダーが ACK(さっきのRN16を含む)を返す
タグが PC + EPC + CRC16 を返す ← これがEPC本体
つまりEPCは「ACKに対するタグの応答」に入っています。ここを狙って復号すればいいわけです(理屈では)。
まず簡単な下りから見ていきます。リーダーは搬送波(連続波)の振幅を落とすことでコマンドを送ります。SDRで受けたIQ信号の振幅(包絡線)をプロットすると、そのパルス列がそのまま見えます。
下りの振幅(リーダーの声)と、上りのバックスキャッタ帯域のパワー(タグのささやき)を、同じ時間軸で並べてみます。
上段がリーダーのコマンド列、下段がタグの応答です。リーダーが喋る(上段にパルス列)→ 少し間を置いてタグが答える(下段にバースト)、というターン制の対話がはっきり見えます。下段の長いバーストが、狙っているEPC応答です。BLFが決まれば、あとは+BLFのサイドバンドを複素ベースバンドに落とし、隣り合う半ビットの位相差を見てMillerの位相反転(=データ)を読み取ります。この差動方式は、タグの発振器が多少ドリフトしても壊れないのが利点です(安価なタグの発振器は結構ふらつくそうです)。
こうして128ビットを取り出したら、最後に CRC16 で検証します。Gen2のCRC16は生成多項式 0x1021、初期値 0xFFFF。PC + EPC に対して計算した値が、受信したCRCフィールドと一致すれば復号成功が確定します。CRCが通れば、それは間違いなく正しいEPCです。
…と言いたいところで、罠その2にハマりました。
復号では「BLFを少しずつ変え、ビット開始位置を総当りして、CRCが通る組み合わせを探す」ということをします。ところが16bitのCRCは1/65536の確率で偶然通ってしまいます。数百万通りの位置を試して「最初に通った1つ」を採用すると、偶然CRCを通過した誤読(偽陽性)を本物だと思ってしまうのです。実際、最初は「6応答すべて成功!」に見えたのに、探索範囲を変えると別のEPCが出てきて、嘘だと発覚しました。
対策はこうです。本物の復号は、BLFや開始位置を少しずらしても同じEPCを出します。つまり正解の周りには「同じEPCが通る位置のクラスタ」ができます。逆に偶然のCRC通過は孤立した1点です。そこで、少しずつ条件をずらして復号を何百回も試し、同じEPCが多数の位置で通ったもの(=クラスタ)だけを本物とみなすという投票方式にしました。これで6つのインベントリラウンドすべてが同一のEPCを約490箇所で一致し、偽陽性は1~2票で自動的に弾かれ、結果が確定しました。
オフラインで復号できたら、あとはこれをストリーム処理にするだけです。差動復調のベクトル化、BLFのロック、投票の早期終了などで高速化し、150msのチャンクを約280msで処理できるようにしました。結果、AirspyからリアルタイムでEPCを読み取るパッシブモニターが完成しました。
面白いのは、応答のサイドバンド強度(SNR)を測っておくと、それがそのままタグの方向探知に使えることです(これが八木アンテナを作った理由です)。読めたEPCの中から追いたい1個を選び、そのSNRを音のピッチに変換すれば、八木アンテナを振って「ピッチが最高になる向き」を耳で探せます。複数のタグが混在する環境でも、特定のEPCのタグだけを狙って方向を特定できるわけです。
まとめ
送信機能なしのSDR受信機だけで、
下りのPIE(Tari基準のパルス間隔符号)を包絡線から復号し、
上りのMillerバックスキャッタをスペクトログラムで捉え、
BLFの「谷」とCRCの偽陽性という2つの罠を越えて、
CRC検証済みのEPCを、リアルタイムで読み取る
ところまで到達しました。なんとまぁ、何に使うの的なものはありますが Mojix もこんなことしてんのかな?みたいな感じですね。




