今回ご紹介するICタグを使った書籍管理システムは、元々はSun SpotにICタグ・リーダ/ライターを接続するためのテストプログラムです。
そのため、ICタグ・リーダ/ライターの選定では、Sun Spotとの接続を考慮して以下の制限を付けました。
ICタグ・リーダ/ライターは、以下の条件でGoogle検索しました。
この結果、大信機器のHF-04SR( http://www.daishin-kiki.com/products.html ) *1 にしました(サンプルのICタグが付いてきました)、価格も1万円程度です。電圧は5Vと3.3Vがありますので、接続するシステムに合わせてください。
次に、使用するICタグですが、本やシートに貼ることを考慮して
なものを探すことにしました。
販売量の多いメーカの方が、安く購入できると見込んで「ICタグ」でGoogleに広告を出している 「リンテック」に問い合わせてみました(サンプルのICタグを送っていただきました)。
その結果、TS-Lシリーズ( http://www.lintec.co.jp/e-dept/britem/ictag/products/tsdc_ts.html ) *2 は100枚から注文を受け付けるとの回答を頂き、サンプルのICタグをHF-04SRで動作確認後、TS-L102JCを100枚購入しました。
いきなり、プログラムに接続するのは大変なので、ターミナルからシリアル接続し、 ICタグ・リーダー/ライターの動作確認をすることにします。
TTLレベルのRS-232C通信をテストする場合、レベルコンバータとUSB-シリアル変換モジュールが 必要ですが、秋月のAE-UM232R( http://akizukidenshi.com/catalog/items2.php?q=AE-UM232 )は、USBから電源(5V, 3.3V)を供給し、買ってすぐにブレッドボード上で 接続できるすぐれものです(これで950円は安い)。
写真1は、ブレッドボードにAE-UM232RとHF-04SRを接続したところです。
AE-UM232RとHF-04SRの結線は、 図1*3 のようにしてください。HF-04SRからでている4本のケーブルにコネクタを付けて接続しています。
AE-UM232Rに組み込まれているUSB・シリアル変換チップはFT232BMですので、 Future Technology Devices International Ltd.(http://www.ftdichip.com/Drivers/VCP.htm) のサイトからドライバーをダウンロードします。
をダウンロードしてインストールしてください。
次にドライバーが正常に動作しているか確認します。 AE-UM232RのUSBケーブルをパソコンに接続します。
$ ls /dev/cu.usb* /dev/cu.usbserial-A5002yHm
のように/dev/cu.cusbserial-xxxxxx と表示されることを確認し、この名前をメモしておきましょう。
図2のように、ポート(COMとLPT)にUSB Serial Port(COMx)が追加されたことを確認し、COMxの名前をメモします。
MacOSXでは、デフォルトの通信ソフトで手頃なものがないので、 「Macにシリアル(RS-232C)ポート」のサイトから( http://www.zone0.ne.jp/2006/osxserial01.html ) から、Jerminal8095.dmgをダウンロードしました。
ターミナルからJerminal(jermコマンド)を以下のオプションで起動します。最後の/dev/cu.cusbserial-xxxxxxは、先ほどメモした名前に変更してください。
$ jerm -b 38400 -p none -d 8 -s 1 /dev/cu.usbserial-A5002yHm
接続が完了すると以下のような表示でます。
Jerminal v0.8095 Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005 candy Type "Ctrl-M ~ ." to exit. ispeed 38400 ospeed 38400 +IGNBRK -BRKINT -IGNPAR -PARMRK -INPCK -ISTRIP -INLCR -IGNCR -ICRNL -IXON -IXOFF -IXANY -IMAXBEL -OPOST -ONLCR -OXTABS -ONOEOT cs8 -CSTOPB +CREAD -PARENB -PARODD +HUPCL +CLOCAL -CCTS_OFLOW -CRTSCTS -CRTS_IFLOW -MDMBUF -ECHOKE -ECHOE -ECHO -ECHONL -ECHOPRT -ECHOCTL -ISIG -ICANON -ALTWERASE -IEXTEN -EXTPROC -TOSTOP -FLUSHO -NOKERNINFO -PENDIN -NOFLSH
ICタグ・リーダ/ライターとの接続を確認するために、バージョン表示コマンド(V Ctrl-R) を入力します(端末のようにエコーバックはしないので、VとCtrl-Rは表示されません)。
15693 V03.07
これで、ICタグ・リーダ/ライターが15693に対応した V03.07であることが表示されました
プログラム→アクセサリ→通信からハイパーターミナルを起動します。 接続ポートは、先ほどメモしたCOMxを選択してください。 ポートの設定は、図3のようにします。
ハイパーターミナルの画面からV Ctrl-Rを入力すると図4のようにバージョンが表示されます。
すべての準備が整ったところで、JavaからICタグ・リーダー/ライターを制御することにします。
Javaからシリアルポート、パラレルポートを使用するためのAIPがSunの提供する Java Communications API です。 残念ながらSunの提供するAPIは、SPARC Solaris/x86 Solaris/x86 Linux版のみなのでMacOSXや Windowsでは使えません。
そこで、Java Communications APIに準拠したオープンソースのライブラリRXTXを使用します。
RXTXのサイトからrxtx-2.1-7-bins-r2.zipをダウンロードし、解凍します。
RXTXシリアル接続については、
を参考にさせていただきました。
javaで使用するICTagコマンドは
としました。詳しくは、HF-04SRに付属の「コマンド編MF4_V03_07.pdf」を参照してください。
各コマンドの書式では
コマンド | 書式 | 戻り値成功時 | 戻り値失敗時 | 制約 |
バージョン情報 | V[CR] | 使用できるタグの種類 バージョン | なし | |
スキャン | 2XX[CR] | nn,UID{,UID,UID....}[CR] | 00[CR] | 複数タグ検知は最大8枚 |
連続スキャン | 2XS[CR] | 01,UID[CR] | 中断時None[CR] | 1文字を送信すると中断する |
読出 | 2R,tt,bb,nn[CR] | tt,yy,DATA{,tt,yy,DATA...}[CR] | 00[CR] | 最大15ブロック |
複数ブロック書込 | 2WM,tt,bb,nn,DATA[CR] | tt,OK[CR] | tt,NG[CR] | 最大15ブロック |
ICタグ制御クラスHF04SLに各コマンドの処理を実装します。
最初にICタグのオープンですが、バージョン情報を使って接続先がICTagかどうかをチェックします。今回はISO-15693のICTagを対象としているので、バージョン情報の15693の文字列をキーワードとしました。
public boolean openICTag(String pname){ if(openSerialPort(pname)){ String returnCode=""; while(returnCode.indexOf("15693") < 0){ try{ write("V\r"); returnCode = readWithTimer(3000); }catch(Exception e){ e.printStackTrace(); break; } } return true; } return false; }
ICTagの読み込みを逐次チェックするよりも連続スキャンを使ってICTagの検出を 待つようにした方が、処理が簡単になります。
連続スキャンの処理は以下のようになります。
public String contScanICTag() throws IOException { write("2XS\r"); String res = read(3); if (res.equals("01,")) { String id = read(16); read(1); // skip [CR] return (id); } else { read(2); // skip remain None[CR] return (null); } }
書込もコマンドの仕様通りです。
public boolean writeICTag(int tagNo, int blokNo, byte[] data) throws IOException { int numBlock = (data.length + 3) / 4; StringBuffer buf = new StringBuffer(); buf.append("2WM,"); buf.append(String.format("%02x,", tagNo)); buf.append(String.format("%02x,", blokNo)); buf.append(String.format("%02x,", numBlock)); for (int i = 0; i < data.length; i++) buf.append(String.format("%02x", data[i])); buf.append("\r"); write(buf.toString()); read(3); // skip tt, String result = read(2); read(1); // skip [CR] return (result.equals("OK")); }
読出は、ちょっと長くなりましたが、ほとんど仕様どおりです。ICタグの読み出しに失敗した場合には、空のリストを返します。
public String[] readICTag(int tagNo) throws IOException { StringBuffer buf = new StringBuffer(); buf.append("2R,"); buf.append(String.format("%02d,00,0F\r", tagNo)); write(buf.toString()); String numStr = read(2); if (numStr == "00") { return (new String[0]); } else { List<String> list = new ArrayList<String>(); int numTag = Integer.parseInt(numStr); String str; int count = 1; for (int i = 0; i < numTag; i++) { if (count++ != 1) { numStr = read(2); } str = read(1); // skip ',' String lenStr = read(2); str = read(1); // skip ',' or [CR] int len = Integer.parseInt(lenStr, 16); if (len > 0) { String data = read(len*2); str = read(1); // skip ',' or [CR] list.add(data); } } return (list.toArray(new String[0])); } }
必要な部品がそろったので、テストをします。
public static void main(String[] args) { HF04SL ictag = new HF04SL(); try { ictag.openICTag("/dev/cu.usbserial-A5002yHm"); System.out.println(ictag.contScanICTag()); System.out.println(ictag.writeICTag(1, 1, "0123456789ABCDEF".getBytes())); String[] tagData = ictag.readICTag(1); System.out.println(tagData[0]); System.out.println(ictag.hexToString(tagData[0], 4, 16)); } catch (Exception e) { e.printStackTrace(); } finally { ictag.closeICTag(); } }
実行結果は、
Stable Library ========================================= Native lib Version = RXTX-2.1-7 Java lib Version = RXTX-2.1-7 1A8FA410000104E0 true 000000003031323334353637383941424344454630303030000000000000 000000000000740069006F006E0020002000000000000000000000000000 0123456789ABCDEF Experimental: JNI_OnLoad called.
のように出力されます。
ICタグのサンプルプログラムとして「書籍管理システム」を作りました。
書籍管理システムでは、
の処理をします。
ICタグは、本の表紙裏左上(背表紙の上部に近く)にセットします(写真2)。 *4
ICタグをリーダー/ライターにかざし、バーコードリーダでISBNをスキャンします(写真3)。
BookダイアログでISBN Searchボタンを押すと、Amazon Web Serviceから書籍情報を取得し、 ダイアログに表示します。4桁の棚番号を入力し、OKボタンを押すと棚番号がICタグに書き込まれ ます。
ISBNから書籍の情報を取得するのに、AWSのAPIを使っていますので、AWSのAccess Key IDが必要となります。
http://www.amazon.com/gp/aws/registration/registration-form.html
にアクセスして、必要な項目を入力し、登録ボタンを押すと完了です。
メールに記載されている、以下のサイトにアクセスします。
http://aws-portal.amazon.com/gp/aws/developer/account/index.html?action=access-key
Sign In画面で登録したメールアドレスとパスワードを入力すると、割り当てられたAccess Key IDが表示 されます。
書籍管理システムの特徴は、
です。
当初、まだ高価なICタグを使って書籍を管理することが本当に価値があるのだろうかと疑問に思ったのですが、 封筒に入れた資料などを整理する場合には、ICタグが役立つのではないかと考えています。