UHF帯タグのチップのメーカーと型番をリーダライタで取得してみようと思います。
リーダライタは手元にあったTAKAYAさんのUTR-SHR201を使います。
メーカー・型番を取得するためにはチップのメモリのデータ構造を把握していなければなりません。
メモリは大きく4つに分かれており、
Bank 00 RESERVED
Bank 01 EPC
Bank 10 TID
Bank 11 USER
で構成されています。
今回取得したいメーカーの情報はTIDに格納されています。
UTR-SHR201のUHF連続インベントリリードモードでTIDを読むことができます。
読み取るメモリバンクのアドレスの指定とは別にTIDを付加するかどうかのオプションがあるので、それを使ってTIDを取得しようと思います。
それではシリアル通信でリーダライタにコマンドを送ります。
TeraTermでバイナリの受信を表示する設定がうまくできなかったので、簡易なコンソールアプリでバイナリを送受信しました。
using System.IO.Ports;
string portName = "COM6";
int baudRate = 115200;
using (SerialPort serialPort = new SerialPort(portName, baudRate))
{
serialPort.Parity = Parity.None;
serialPort.DataBits = 8;
serialPort.StopBits = StopBits.One;
serialPort.Handshake = Handshake.None;
serialPort.DtrEnable = true;
serialPort.DataReceived += SerialPort_DataReceived;
try
{
serialPort.Open();
byte[] message = [0x02, 0x00, 0x55, 0x07, 0x14, 0x07, 0x00, 0x00, 0x00, 0x00, 0x02, 0x03, 0x7E, 0x0D]; // 連続インベントリリードでTID付加
serialPort.Write(message, 0, message.Length);
Console.ReadLine();
}
catch (Exception ex)
{
Console.WriteLine($"エラー: {ex.Message}");
}
finally
{
if (serialPort.IsOpen) serialPort.Close();
}
}
void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
SerialPort sp = (SerialPort)sender;
int byteToRead = sp.BytesToRead;
byte[] buffer = new byte[byteToRead];
sp.Read(buffer, 0, byteToRead);
Console.WriteLine("received");
Console.WriteLine($"{BitConverter.ToString(buffer)}");
}
E2-00-34-12-01-2F-FB-00-06-A4-95-88
この部分がTIDのバンクに該当しそうです。
メモリアドレス0Bh-13hがRFタグなので
"003"の
0 0000 00011
になります。
GS1のサイトから確認するとAlien Technologyが該当しました。
アドレスの開始は00hなので数える際に注意が必要かもしれません(ここで少し引っかかりました)。
次にRFタグ型式番号をみます。
設計者識別番号に続く14h-1Fhに格納されているようなので、"412"が型式番号になります
RFタグ型式番号はRFIDアライアンスさんの資料から確認します。
Higgs3のTID: E2003412
Higgs4のTID: E2003414
HiggsECのTID: E2003811
これで読み取ったタグがHiggs 3であることがわかりました。