ICタグを使った例題
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
開始行:
[[FrontPage]]
2009/01/09からのアクセス回数 &counter;
* はじめに [#ffc7f220]
評価キットも高価で簡単に手の出せなかったICタグですが、基...
ここでは、以下の手順で説明します。
- ICタグ・リーダー/ライターの選定
- ターミナルソフトを使った、ICタグ・リーダー/ライターと...
- ICタグのスキャン、読み込み、書き込みプログラムの作成
- ICタグを使った書籍管理システムの構築
ICタグを使った例題のゴールは、
- ICタグ活用システムを構築するための、基礎的な技術を例題...
としました。
* 本当はICタグのテストプログラム [#jb1675db]
今回ご紹介するICタグを使った例題は、元々はSun SpotにICタ...
そのため、ICタグ・リーダー/ライターの選定では、Sun Spot...
- 基板タイプでアンテナ一体型
- 稼働電圧が3.3V
- UARTでの制御が可能
* ICタグ・リーダー/ライターを探す [#q2eb88f9]
ICタグ・リーダー/ライターは、以下の条件でGoogle検索しま...
- ICタグ・リーダー/ライター
- 基板
- 3.3V
- RS232C (TTL)
この結果、大信機器のHF-04SR( http://www.daishin-kiki.com/...
(( 問い合わせ:Tel. 06-6641-7633 大信機器株式会社 営業第...
にしました(サンプルのICタグが付いてきました)、価格も1万...
次に、使用するICタグですが、本やシートに貼ることを考慮して
- 小型
- シールタイプ
- ISO15693準拠(HF-04SRのサポートしているICタグ)
なものを探しました。
販売量の多いメーカの方が、安く購入できると見込んで「ICタ...
「リンテック」に問い合わせてみました(サンプルのICタグを...
その結果、TS-Lシリーズ( http://www.lintec.co.jp/e-dept/br...
(( 問い合わせ:Tel. 03-3868-7737 リンテック株式会社 アド...
は100枚から注文を受け付けるとの回答を頂き、サンプルのICタ...
* ICタグ・リーダー/ライターの動作確認 [#k46ddc39]
プログラムに接続する前に、ターミナルからシリアル接続し、 ...
** 秋月のUSB-シリアル変換モジュール [#n581ea3f]
TTLレベルのRS-232C通信をテストする場合、レベルコンバータ...
必要ですが、秋月のAE-UM232R( http://akizukidenshi.com/cat...
接続できるすぐれものです(これで950円は安い)。
写真1は、ブレッドボードにAE-UM232RとHF-04SRを接続したと...
| &ref(picture.jpg); |
|CENTER: 写真1 |
AE-UM232RとHF-04SRの結線は、
図1(( ブレッドボードの図は、Electronic Breadboard Templa...
のようにしてください。HF-04SRからでている4本のケーブルに...
| &ref(Breadboard.jpg); |
|CENTER: 図1 |
AE-UM232Rのジャンパーは、以下のように設定してください。
- J1: 1-2ピン間ジャンパ有り(ショート)で、VIOに3.3Vが供...
- J2: 有り(ショート)で、USBバスから電源を供給します
** デバイスドライバーのインストール [#a9e3f233]
AE-UM232Rに組み込まれているUSB・シリアル変換チップはFT232...
Future Technology Devices International Ltd.(http://www.f...
のサイトからドライバーをダウンロードします。
- MacOSXの場合には、FTDIUSBSerialDriver_v2_2_10.dmg
- WIndowsの場合には、CDM 2.04.14.zip
からインストールしてください。
** ドライバーの確認 [#xb17be32]
次にドライバーが正常に動作しているか確認します。
AE-UM232RのUSBケーブルをパソコンに接続します。
*** MacOSXの場合 [#o7138132]
アプリケーション/ユーティリティのターミナルを起動し、以...
#pre{{
$ ls /dev/cu.usb*
/dev/cu.usbserial-A5002yHm
}}
のように/dev/cu.usbserial-xxxxxx と表示されることを確認し...
*** Windowsの場合 [#m9f3ca7b]
+ マイコンピュータを右クリックし、「プロパティ」を選択し...
+ ハードウェアタグから、「デバイスマネージャ」ボタンを押...
図2のように、ポート(COMとLPT)にUSB Serial Port(COMx)が...
|&ref(DeviceManager.jpg);|
|CENTER: 図2 |
** 接続確認 [#l5047be8]
*** MacOSXの場合 [#e23da818]
MacOSXでは、デフォルトの通信ソフトで手頃なものがないので、
「Macにシリアル(RS-232C)ポート」のサイト( http://www.zone...
から、Jerminal8095.dmgをダウンロードしました。
ターミナルからJerminal(jermコマンド)を以下のオプション...
#pre{{
$ jerm -b 38400 -p none -d 8 -s 1 /dev/cu.usbserial-A5002...
}}
- ボーレート 38400
- パリティなし
- データ長 8bit
- ストップビット 1
接続が完了すると以下のように表示されます。
#pre{{
Jerminal v0.8095 Copyright (C) 2000, 2001, 2002, 2003, 2...
Type "Ctrl-M ~ ." to exit.
ispeed 38400 ospeed 38400
+IGNBRK -BRKINT -IGNPAR -PARMRK -INPCK -ISTRIP -INLCR -I...
-IXOFF -IXANY -IMAXBEL
-OPOST -ONLCR -OXTABS -ONOEOT
cs8 -CSTOPB +CREAD -PARENB -PARODD +HUPCL +CLOCAL -CCTS_...
-CRTS_IFLOW -MDMBUF -ECHOKE -ECHOE -ECHO -ECHONL -ECHOPR...
-ISIG -ICANON -ALTWERASE -IEXTEN
-EXTPROC -TOSTOP -FLUSHO -NOKERNINFO -PENDIN -NOFLSH
}}
ICタグ・リーダー/ライターとの接続を確認するために、バー...
を入力します(端末のようにエコーバックはしないので、VとCt...
#pre{{
15693 V03.07
}}
これで、ICタグ・リーダー/ライターとの接続が確認できまし...
*** Windowsの場合 [#v84ffe80]
プログラム→アクセサリ→通信からハイパーターミナルを起動し...
接続ポートは、先ほどメモしたCOMxを選択してください。
ポートの設定は、図3のようにします。
|&ref(ComSetting.jpg);|
|CENTER: 図3 |
ハイパーターミナルの画面からV Ctrl-Mを入力すると図4のよ...
|&ref(HyperTerminal.jpg);|
|CENTER: 図4 |
* JavaからICタグ・リーダー/ライターを制御する [#t53fb0a4]
すべての準備が整ったところで、JavaからICタグ・リーダー/...
** Javaでシリアル通信をする [#ybf9c0bd]
Javaからシリアルポート、パラレルポートを使用するためのAPI...
[[Java Communications API>http://java.sun.com/products/ja...
です。
残念ながらSunの提供するAPIは、SPARC Solaris/x86 Solaris/x...
Windowsでは使えません。
そこで、Java Communications APIに準拠したオープンソースの...
- RXTX : serial and parallel I/O libraries supporting Sun...
RXTXのサイトからrxtx-2.1-7-bins-r2.zipをダウンロードし、...
- MACOSX_IDE/librxtxSerial.jnlib
- Windows/i368-migw32/rxtxSerial.dll
- Linux/i686-unknown-linux-gnu/librxtxSerial.so
- RXTXcomm.jar
を取り出し使用しました。
** 使用するICタグ制御コマンド [#d88a9711]
javaで使用するICタグコマンドは
- バージョン情報 : V
- スキャンコマンド: 2XX
- 連続スキャン開始コマンド: 2XS
- 読出コマンド: 2R
- 複数ブロック書込コマンド: 2WM
としました。詳しくは、HF-04SRに付属の「コマンド編MF4_V03_07....
各コマンドの書式では
- UID: タグのUID
- tt: タグ番号
- bb: ブロック番号
- nn: 数値
- DATA: データ
|コマンド|書式|戻り値成功時|戻り値失敗時|制約|
|バージョン情報|V[CR]|使用できるタグの種類 バージョン|な...
|スキャン|2XX[CR]|nn,UID{,UID,UID....}[CR]|00[CR]|複数タ...
|連続スキャン|2XS[CR]|01,UID[CR]|中断時None[CR]|1文字を送...
|読出|2R,tt,bb,nn[CR]|tt,yy,DATA{,tt,yy,DATA...}[CR]|00[C...
|複数ブロック書込|2WM,tt,bb,nn,DATA[CR]|tt,OK[CR]|tt,NG[C...
** ICタグ制御クラスHF04SL [#va7b2ded]
ICタグ制御クラスHF04SLに各コマンドの処理を実装します。
*** ICタグオープンメソッド [#g9f7368e]
最初にICタグのオープンですが、バージョン情報を使って接続...
#pre{{
public boolean openICTag(String pname){
if(openSerialPort(pname)){
String returnCode="";
for (int i = 0; i < RETRY_COUNT
&& (returnCode.indexOf("15693") < 0); i++){
try{
write("V\r");
returnCode = readWithTimer(3000);
}
catch (TimeoutException e1) {}
catch (Exception e2){
e2.printStackTrace();
break;
}
}
return true;
}
return false;
}
}}
*** 連続スキャンメソッド [#v5867bca]
ICタグの読み込みを逐次チェックするよりも連続スキャンを使...
処理が簡単になります。
連続スキャンの処理は以下のようになります。
#pre{{
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);
}
}
}}
*** 複数ブロック書込メソッド [#n63997e6]
書込もコマンドの仕様通りです。
#pre{{
public boolean writeICTag(int tagNo, int blokNo, byte[] ...
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"));
}
}}
*** 読出メソッド [#ld215b7b]
読出は、ちょっと長くなりましたが、ほとんど仕様どおりです...
#pre{{
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.equals("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]));
}
}
}}
*** テストプログラム [#nd89ca2c]
必要な部品がそろったので、テストプログラムで動作を確認し...
#pre{{
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, "0123456789A...
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();
}
}
}}
実行結果は、
#pre{{
Stable Library
=========================================
Native lib Version = RXTX-2.1-7
Java lib Version = RXTX-2.1-7
1A8FA410000104E0
true
000000003031323334353637383941424344454630303030000000000...
000000000000740069006F006E0020002000000000000000000000000...
0123456789ABCDEF
Experimental: JNI_OnLoad called.
}}
のように出力されます。
- 検出されたICタグIDは、1A8FA410000104E0
- ICタグへの書き込み結果は、true(成功)
- 読み込んだICタグのデータを16進表示(3031323334353637383...
- 16進表示のデータから先頭の5文字目から16文字を切り出し01...
と期待通りの結果を表示しています。
* サンプルプログラム [#u7eee3fc]
ICタグのサンプルプログラムとして「書籍管理システム」を作...
書籍管理システムでは、
- 本の表紙裏にICタグを貼ります
- 本の登録:ICタグを検出し、書籍情報と棚番号を入力する画...
- 本の検索:文字列を入力し、一致するタイトル、著者の一覧...
- ICタグに書き込まれた棚番号を表示します。
の処理をします。
** 書籍登録の処理の流れ [#w90edfd2]
ICタグは、本の表紙裏左上(背表紙の上部に近く)にセットし...
((HF-04SRではスキャン距離が3cmと短いので本の背表紙からの...
|&ref(ictagSetting.jpg);|
|CENTER: 写真2|
ICタグをリーダー/ライターにかざし、バーコードリーダでISB...
|&ref(barcordscan.jpg);|
|CENTER: 写真3|
BookダイアログでISBN 検索ボタンを押すと、Amazon Web Servi...
ダイアログに表示します。4文字の棚番号を入力し、OKボタンを...
|&ref(BookDialog.jpg);|
|CENTER: 図5|
** サンプルプログラムの構成 [#p08ae16c]
サンプルプログラムは、図6のような構成となっています。
- パソコンは、Windows, MacOSX, Linuxに対応しています
- データベースは、MySQL, PostgreSQL, HSQLDB, CSVファイル...
- ICタグリーダー/ライター(写真1のブレッドボード)
- バーコードリーダISBN番号を読み込むために使用しています ...
|&ref(Structure.jpg);|
|CENTER: 図6|
** 画面説明 [#a6ad5664]
簡単に各画面の使い方を説明します。
*** 書籍画面 [#u2476737]
プログラム起動時に、書籍画面が表示されます(図7)。書籍...
|&ref(Frame.jpg);|
|CENTER: 図7|
メニューバーには、「ファイル」メニュー1つで、以下の項目...
| 検索| 検索文字列入力ダイアログを表示し、文字列にマッチ...
| 書籍登録 | ICタグを検出し、Bookダイアログを表示し、書籍...
| 棚番号表示 |ICタグから4文字の棚番号を読み取り、表示しま...
| 終了 |プログラムを終了します |
*** Bookダイアログ [#nfe79050]
Bookダイアログには、ICタグID, ISBN番号、書籍情報、棚番号...
書籍登録の場合、
+ ICタグを検出し、ICタグIDを含むBookダイアログを表示します
+ キーボード(バーコードリーダの方が便利)からISBN番号を...
+ OKボタンを押すとデータベースに書籍が登録され、棚番号がI...
+ Cancelボタンで登録を終了します
*** 棚番号表示ダイアログ [#l4ae2018]
メニューから「棚番号表示」を選択し、ICタグ・リーダー/ラ...
|&ref(shelfID.jpg);|
|CENTER: 図8|
** 開発環境 [#n620c7c7]
サンプルプログラムは、Eclipseのプロジェクトになっており、...
- java JDK1.5以降
http://java.sun.com/javase/downloads/index.jsp
からJava SE Development Kit (JDK)6 Update 11 の
Downloadボタンを押して、プラットフォームにあった
JDKをダウンロードして、インストールしてください。
- Eclipse 3.1以降
http://www.eclipse.org/
から、Download Eclipseをクリックして、
Eclipse IDE for Java DevelopersのWindowsを選択してダウン...
** GUIの構築 [#k82cb910]
GUIは、Eclipseのプラグインの一つであるVisula Editorを使っ...
画面でボタンやフィールドをマウスで配置しますので、初心者...
|&ref(VisualEditor.jpg);|
|CENTER: 図9|
** ISBN検索ボタンの処理 [#q85850e1]
ISBN番号から書籍の情報を取得するのは、アマゾンのAWS APIを...
AWSへのアクセス((日本語のAmaxon WEbサービスチュートリアル...
+ DocumentContainerにAWS APIのURLをセットします
+ JXPathContext#newContextメソッドで AWS APIを使って書籍X...
+ registerNamespaceメソッドで、ネームスペースawsを登録し...
+ context.getValue("//aws:Title")で書籍情報XMLからXPathで...
こんなに簡単にAWS APIを使って書籍情報を取得できることに驚...
#pre{{
private void searchISBN() {
String requestUrl = "http://webservices.amazon.co.jp/on...
+ DataBaseHelper.getAwsAccessKeyID() +
"&Operation=ItemSearch&ResponseGroup=Medium&SearchIndex...
+ getIcbnField().getText();
try {
DocumentContainer container = new DocumentContainer(ne...
requestUrl));
container.setNamespaceAware(true);
JXPathContext context = JXPathContext.newContext(conta...
context.registerNamespace("aws",
"http://webservices.amazon.com/AWSECommerceService...
String title = context.getValue("//aws:Title").toStrin...
String author = context.getValue("//aws:Author").toStr...
int numOfAuthor = (int)Double.parseDouble(context.getV...
for (int i = 1; i < numOfAuthor; i++) {
String nextAuthor = "//aws:Author[" + (i+1) + "]";
author = author + "; " + context.getValue(nextAuthor)...
}
String publisher = context.getValue("//aws:Manufacture...
String publicationDate = context.getValue("//aws:Publi...
String noPages = context.getValue("//aws:NumberOfPages...
String listPrice = context.getValue("//aws:Amount").to...
titleArea.setText(title);
authorArea.setText(author);
publisherField.setText(publisher);
publicationDateField.setText(publicationDate);
noPagesField.setText(noPages);
listPriceField.setText(listPrice);
} catch (Exception e) {
e.printStackTrace();
}
}
}}
* プログラムの実行 [#p7787631]
** AWS(Amazon Web Service)アカウントの作成 [#h64ac35c]
ISBNから書籍の情報を取得するのに、AWSのAPIを使っています...
- 最初にAWSのアカウントの作成
http://www.amazon.com/gp/aws/registration/registration-fo...
にアクセスして、必要な項目を入力し、登録ボタンを押すと完...
- Access Key IDの取得
AWSのアカウントの登録が完了すると、Welcome to Amazon Web ...
というタイトルのメールが届きます。
メールに記載されている、以下のサイトにアクセスします。
http://aws-portal.amazon.com/gp/aws/developer/account/ind...
Sign In画面で登録したメールアドレスとパスワードを入力する...
されます。
** プログラムのダウンロード [#i4845ae0]
ソースおよびプログラム一式は、ZIPファイルとしてictag.zip...
&ref(ictag.zip);
ictag.zipを解凍すると、ictagディレクトリに
#pre{{
ictag/
+src/
+lib/
+data/
+ictag-1.0.jar
+db.properties
+librxtxSerial.jnilib
+librxtxSerial.so
+rxtxSerial.dll
}}
があります。
- src/以下にプログラムソースがあります
- lib/以下に使用するライブラリがあります
- data/以下にHSQLDBが使用するファイルとBook.csvファイルが...
- ictag-1.0jar: ICタグサンプルプログラムのjarファイルです
- db.properties: データベース関連の設定ファイル
- librxtxSeria.jlib, librxtxSeria.so, rxtxSerial.dll: RXT...
** db.propertiesの設定 [#h3259502]
db.propertiesの設定情報について説明します。
*** JDBCドライバー情報 [#p046259b]
初期設定では、JDBCドライバー情報としてHSQLDBを使用する設...
ictag-1.0.jarのライブラリのパスに登録してあるデータベース...
- HSQLDB Ver. 1.8.0.7
- MySQL Ver. 5.1.6
- PostgreSQL Ver. 8.1.407
です。上記以外のドライバーを使用する場合には、ドライバー...
#pre{{
db.url=jdbc:hsqldb:data/book
db.driver=org.hsqldb.jdbcDriver
db.username=sa
db.password=
}}
- db.url: 接続するデータベースのURLを指定します
- db.driver: JDBCドライバーのクラスパスを指定します
- db.username:データベースのユーザ名を指定します
- db.password: データベースのパスワードを指定します
*** SQL文の設定 [#la77205e]
データベースによってSQL文に若干違いがあるため、使用するSQ...
初期設定はHSQLDBを使ってCSVファイルをテーブルと扱うように...
#pre{{
db.createTable=CREATE TEXT TABLE Book (ID IDENTITY, ICTAG...
TITLE VARCHAR, AUTHOR VARCHAR, PUBLISHER VARCHAR, PUBLI...
NOPAGES VARCHAR, LISTPRICE VARCHAR, SHELFID VARCHAR);
SET TABLE Book SOURCE "book.csv;encoding=Shift_JIS";
db.insertSQL=INSERT INTO Book (id, icTag, isbn, title, a...
noPages, listPrice, shelfId) VALUES (?, ?, ?, ?, ?, ?, ...
db.updateSQL=UPDATE Book SET id=?, icTag=?, isbn=?, title...
publicationDate=?, noPages=?, listPrice=?, shelfId=? WH...
db.selectAllSQL=SELECT * FROM Book;
db.selectWhereSQL=SELECT * FROM Book WHERE title like ? O...
}}
- db.createTable: テーブルの作成用SQL文を指定します
- db.insertSQL: レコードの挿入用SQL文を指定します
- db.updateSQL: レコードの更新用SQL文を指定します
- db.selectAllSQL: 全レコード検索SQL文を指定します
- db.selectWhereSQL: 条件付き検索SQL文を指定します
*** AWS Access Key ID [#y4fecca3]
先にAmazonから取得したAWS Access Key IDは、
#pre{{
aws.access.keyID=ここに取得したAccessKeyIDをセットしてく...
}}
に設定します。
*** ICタグ・リーダー/ライター使用の有無 [#x4ca993b]
ICタグ・リーダー/ライター使用の有無を指定します。
初期設定は、ICタグ・リーダー/ライターを使用する設定にな...
ICタグ・リーダー/ライターを使用しないで、書籍の管理をす...
#pre{{
use.ictag=false
}}
に変更してください。
** プログラムの起動 [#h8066999]
プログラムの起動は、ターミナルまたはコンソールから
#pre{{
$ java -jar ictag-1.0.jar シリアルデバイス名
}}
を入力します。
例)MacOSXでの起動例
#pre{{
$ java -jar ictag-1.0.jar /dev/cu.usbserial-A5002yHm
Experimental: JNI_OnLoad called.
Stable Library
=========================================
Native lib Version = RXTX-2.1-7
Java lib Version = RXTX-2.1-7
}}
** 書籍データベース [#yf72cc11]
登録した書籍情報は、データベースに登録されます。
初期設定では、HSQLDBを使ってdata/Book.csvファイルに書籍情...
文字コードをShift_JISに設定してありますので、そのままExce...
本格的なデータベースを使う例として、MySQLを使う場合の設定...
MySQLで日本語を扱う場合、データベース作成後に
#pre{{
ALTER DATABASE データベース名 CHARACTER SET SJIS;
}}
のように使用する文字コードをSJISに変更します。
次にdb.propertiesの設定では、db.urlで文字コード指定が必要...
#pre{{
db.url=jdbc:mysql://localhost/ictag?useUnicode=true&chara...
db.driver=com.mysql.jdbc.Driver
db.username=ictag
db.password=ictag
}}
テーブルの作成は、以下のように変更します。
#pre{{
db.createTable=CREATE TABLE Book (ID LONG, ICTAG VARCHAR(...
TITLE VARCHAR(255), AUTHOR VARCHAR(255), PUBLISHER VARC...
PUBLICATIONDATE VARCHAR(10), NOPAGES VARCHAR(5), LISTPR...
SHELFID VARCHAR(4));
}}
* あとがき [#l7468b27]
ICタグを使ったサンプルプログラムでは、
- ICタグ・リーダー/ライターとの接続方法
- ICタグを読み書きをする方法
- ICタグを使って書籍を管理する場合の、書籍登録作業の軽減...
- java言語によってOSに依存することなくICタグ・リーダー/...
- 特定のデータベースに依存しないで、書籍データベースを管...
を紹介しました。
大信機器株式会社の野村秀夫さん、リンテック株式会社の佐藤...
終了行:
[[FrontPage]]
2009/01/09からのアクセス回数 &counter;
* はじめに [#ffc7f220]
評価キットも高価で簡単に手の出せなかったICタグですが、基...
ここでは、以下の手順で説明します。
- ICタグ・リーダー/ライターの選定
- ターミナルソフトを使った、ICタグ・リーダー/ライターと...
- ICタグのスキャン、読み込み、書き込みプログラムの作成
- ICタグを使った書籍管理システムの構築
ICタグを使った例題のゴールは、
- ICタグ活用システムを構築するための、基礎的な技術を例題...
としました。
* 本当はICタグのテストプログラム [#jb1675db]
今回ご紹介するICタグを使った例題は、元々はSun SpotにICタ...
そのため、ICタグ・リーダー/ライターの選定では、Sun Spot...
- 基板タイプでアンテナ一体型
- 稼働電圧が3.3V
- UARTでの制御が可能
* ICタグ・リーダー/ライターを探す [#q2eb88f9]
ICタグ・リーダー/ライターは、以下の条件でGoogle検索しま...
- ICタグ・リーダー/ライター
- 基板
- 3.3V
- RS232C (TTL)
この結果、大信機器のHF-04SR( http://www.daishin-kiki.com/...
(( 問い合わせ:Tel. 06-6641-7633 大信機器株式会社 営業第...
にしました(サンプルのICタグが付いてきました)、価格も1万...
次に、使用するICタグですが、本やシートに貼ることを考慮して
- 小型
- シールタイプ
- ISO15693準拠(HF-04SRのサポートしているICタグ)
なものを探しました。
販売量の多いメーカの方が、安く購入できると見込んで「ICタ...
「リンテック」に問い合わせてみました(サンプルのICタグを...
その結果、TS-Lシリーズ( http://www.lintec.co.jp/e-dept/br...
(( 問い合わせ:Tel. 03-3868-7737 リンテック株式会社 アド...
は100枚から注文を受け付けるとの回答を頂き、サンプルのICタ...
* ICタグ・リーダー/ライターの動作確認 [#k46ddc39]
プログラムに接続する前に、ターミナルからシリアル接続し、 ...
** 秋月のUSB-シリアル変換モジュール [#n581ea3f]
TTLレベルのRS-232C通信をテストする場合、レベルコンバータ...
必要ですが、秋月のAE-UM232R( http://akizukidenshi.com/cat...
接続できるすぐれものです(これで950円は安い)。
写真1は、ブレッドボードにAE-UM232RとHF-04SRを接続したと...
| &ref(picture.jpg); |
|CENTER: 写真1 |
AE-UM232RとHF-04SRの結線は、
図1(( ブレッドボードの図は、Electronic Breadboard Templa...
のようにしてください。HF-04SRからでている4本のケーブルに...
| &ref(Breadboard.jpg); |
|CENTER: 図1 |
AE-UM232Rのジャンパーは、以下のように設定してください。
- J1: 1-2ピン間ジャンパ有り(ショート)で、VIOに3.3Vが供...
- J2: 有り(ショート)で、USBバスから電源を供給します
** デバイスドライバーのインストール [#a9e3f233]
AE-UM232Rに組み込まれているUSB・シリアル変換チップはFT232...
Future Technology Devices International Ltd.(http://www.f...
のサイトからドライバーをダウンロードします。
- MacOSXの場合には、FTDIUSBSerialDriver_v2_2_10.dmg
- WIndowsの場合には、CDM 2.04.14.zip
からインストールしてください。
** ドライバーの確認 [#xb17be32]
次にドライバーが正常に動作しているか確認します。
AE-UM232RのUSBケーブルをパソコンに接続します。
*** MacOSXの場合 [#o7138132]
アプリケーション/ユーティリティのターミナルを起動し、以...
#pre{{
$ ls /dev/cu.usb*
/dev/cu.usbserial-A5002yHm
}}
のように/dev/cu.usbserial-xxxxxx と表示されることを確認し...
*** Windowsの場合 [#m9f3ca7b]
+ マイコンピュータを右クリックし、「プロパティ」を選択し...
+ ハードウェアタグから、「デバイスマネージャ」ボタンを押...
図2のように、ポート(COMとLPT)にUSB Serial Port(COMx)が...
|&ref(DeviceManager.jpg);|
|CENTER: 図2 |
** 接続確認 [#l5047be8]
*** MacOSXの場合 [#e23da818]
MacOSXでは、デフォルトの通信ソフトで手頃なものがないので、
「Macにシリアル(RS-232C)ポート」のサイト( http://www.zone...
から、Jerminal8095.dmgをダウンロードしました。
ターミナルからJerminal(jermコマンド)を以下のオプション...
#pre{{
$ jerm -b 38400 -p none -d 8 -s 1 /dev/cu.usbserial-A5002...
}}
- ボーレート 38400
- パリティなし
- データ長 8bit
- ストップビット 1
接続が完了すると以下のように表示されます。
#pre{{
Jerminal v0.8095 Copyright (C) 2000, 2001, 2002, 2003, 2...
Type "Ctrl-M ~ ." to exit.
ispeed 38400 ospeed 38400
+IGNBRK -BRKINT -IGNPAR -PARMRK -INPCK -ISTRIP -INLCR -I...
-IXOFF -IXANY -IMAXBEL
-OPOST -ONLCR -OXTABS -ONOEOT
cs8 -CSTOPB +CREAD -PARENB -PARODD +HUPCL +CLOCAL -CCTS_...
-CRTS_IFLOW -MDMBUF -ECHOKE -ECHOE -ECHO -ECHONL -ECHOPR...
-ISIG -ICANON -ALTWERASE -IEXTEN
-EXTPROC -TOSTOP -FLUSHO -NOKERNINFO -PENDIN -NOFLSH
}}
ICタグ・リーダー/ライターとの接続を確認するために、バー...
を入力します(端末のようにエコーバックはしないので、VとCt...
#pre{{
15693 V03.07
}}
これで、ICタグ・リーダー/ライターとの接続が確認できまし...
*** Windowsの場合 [#v84ffe80]
プログラム→アクセサリ→通信からハイパーターミナルを起動し...
接続ポートは、先ほどメモしたCOMxを選択してください。
ポートの設定は、図3のようにします。
|&ref(ComSetting.jpg);|
|CENTER: 図3 |
ハイパーターミナルの画面からV Ctrl-Mを入力すると図4のよ...
|&ref(HyperTerminal.jpg);|
|CENTER: 図4 |
* JavaからICタグ・リーダー/ライターを制御する [#t53fb0a4]
すべての準備が整ったところで、JavaからICタグ・リーダー/...
** Javaでシリアル通信をする [#ybf9c0bd]
Javaからシリアルポート、パラレルポートを使用するためのAPI...
[[Java Communications API>http://java.sun.com/products/ja...
です。
残念ながらSunの提供するAPIは、SPARC Solaris/x86 Solaris/x...
Windowsでは使えません。
そこで、Java Communications APIに準拠したオープンソースの...
- RXTX : serial and parallel I/O libraries supporting Sun...
RXTXのサイトからrxtx-2.1-7-bins-r2.zipをダウンロードし、...
- MACOSX_IDE/librxtxSerial.jnlib
- Windows/i368-migw32/rxtxSerial.dll
- Linux/i686-unknown-linux-gnu/librxtxSerial.so
- RXTXcomm.jar
を取り出し使用しました。
** 使用するICタグ制御コマンド [#d88a9711]
javaで使用するICタグコマンドは
- バージョン情報 : V
- スキャンコマンド: 2XX
- 連続スキャン開始コマンド: 2XS
- 読出コマンド: 2R
- 複数ブロック書込コマンド: 2WM
としました。詳しくは、HF-04SRに付属の「コマンド編MF4_V03_07....
各コマンドの書式では
- UID: タグのUID
- tt: タグ番号
- bb: ブロック番号
- nn: 数値
- DATA: データ
|コマンド|書式|戻り値成功時|戻り値失敗時|制約|
|バージョン情報|V[CR]|使用できるタグの種類 バージョン|な...
|スキャン|2XX[CR]|nn,UID{,UID,UID....}[CR]|00[CR]|複数タ...
|連続スキャン|2XS[CR]|01,UID[CR]|中断時None[CR]|1文字を送...
|読出|2R,tt,bb,nn[CR]|tt,yy,DATA{,tt,yy,DATA...}[CR]|00[C...
|複数ブロック書込|2WM,tt,bb,nn,DATA[CR]|tt,OK[CR]|tt,NG[C...
** ICタグ制御クラスHF04SL [#va7b2ded]
ICタグ制御クラスHF04SLに各コマンドの処理を実装します。
*** ICタグオープンメソッド [#g9f7368e]
最初にICタグのオープンですが、バージョン情報を使って接続...
#pre{{
public boolean openICTag(String pname){
if(openSerialPort(pname)){
String returnCode="";
for (int i = 0; i < RETRY_COUNT
&& (returnCode.indexOf("15693") < 0); i++){
try{
write("V\r");
returnCode = readWithTimer(3000);
}
catch (TimeoutException e1) {}
catch (Exception e2){
e2.printStackTrace();
break;
}
}
return true;
}
return false;
}
}}
*** 連続スキャンメソッド [#v5867bca]
ICタグの読み込みを逐次チェックするよりも連続スキャンを使...
処理が簡単になります。
連続スキャンの処理は以下のようになります。
#pre{{
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);
}
}
}}
*** 複数ブロック書込メソッド [#n63997e6]
書込もコマンドの仕様通りです。
#pre{{
public boolean writeICTag(int tagNo, int blokNo, byte[] ...
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"));
}
}}
*** 読出メソッド [#ld215b7b]
読出は、ちょっと長くなりましたが、ほとんど仕様どおりです...
#pre{{
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.equals("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]));
}
}
}}
*** テストプログラム [#nd89ca2c]
必要な部品がそろったので、テストプログラムで動作を確認し...
#pre{{
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, "0123456789A...
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();
}
}
}}
実行結果は、
#pre{{
Stable Library
=========================================
Native lib Version = RXTX-2.1-7
Java lib Version = RXTX-2.1-7
1A8FA410000104E0
true
000000003031323334353637383941424344454630303030000000000...
000000000000740069006F006E0020002000000000000000000000000...
0123456789ABCDEF
Experimental: JNI_OnLoad called.
}}
のように出力されます。
- 検出されたICタグIDは、1A8FA410000104E0
- ICタグへの書き込み結果は、true(成功)
- 読み込んだICタグのデータを16進表示(3031323334353637383...
- 16進表示のデータから先頭の5文字目から16文字を切り出し01...
と期待通りの結果を表示しています。
* サンプルプログラム [#u7eee3fc]
ICタグのサンプルプログラムとして「書籍管理システム」を作...
書籍管理システムでは、
- 本の表紙裏にICタグを貼ります
- 本の登録:ICタグを検出し、書籍情報と棚番号を入力する画...
- 本の検索:文字列を入力し、一致するタイトル、著者の一覧...
- ICタグに書き込まれた棚番号を表示します。
の処理をします。
** 書籍登録の処理の流れ [#w90edfd2]
ICタグは、本の表紙裏左上(背表紙の上部に近く)にセットし...
((HF-04SRではスキャン距離が3cmと短いので本の背表紙からの...
|&ref(ictagSetting.jpg);|
|CENTER: 写真2|
ICタグをリーダー/ライターにかざし、バーコードリーダでISB...
|&ref(barcordscan.jpg);|
|CENTER: 写真3|
BookダイアログでISBN 検索ボタンを押すと、Amazon Web Servi...
ダイアログに表示します。4文字の棚番号を入力し、OKボタンを...
|&ref(BookDialog.jpg);|
|CENTER: 図5|
** サンプルプログラムの構成 [#p08ae16c]
サンプルプログラムは、図6のような構成となっています。
- パソコンは、Windows, MacOSX, Linuxに対応しています
- データベースは、MySQL, PostgreSQL, HSQLDB, CSVファイル...
- ICタグリーダー/ライター(写真1のブレッドボード)
- バーコードリーダISBN番号を読み込むために使用しています ...
|&ref(Structure.jpg);|
|CENTER: 図6|
** 画面説明 [#a6ad5664]
簡単に各画面の使い方を説明します。
*** 書籍画面 [#u2476737]
プログラム起動時に、書籍画面が表示されます(図7)。書籍...
|&ref(Frame.jpg);|
|CENTER: 図7|
メニューバーには、「ファイル」メニュー1つで、以下の項目...
| 検索| 検索文字列入力ダイアログを表示し、文字列にマッチ...
| 書籍登録 | ICタグを検出し、Bookダイアログを表示し、書籍...
| 棚番号表示 |ICタグから4文字の棚番号を読み取り、表示しま...
| 終了 |プログラムを終了します |
*** Bookダイアログ [#nfe79050]
Bookダイアログには、ICタグID, ISBN番号、書籍情報、棚番号...
書籍登録の場合、
+ ICタグを検出し、ICタグIDを含むBookダイアログを表示します
+ キーボード(バーコードリーダの方が便利)からISBN番号を...
+ OKボタンを押すとデータベースに書籍が登録され、棚番号がI...
+ Cancelボタンで登録を終了します
*** 棚番号表示ダイアログ [#l4ae2018]
メニューから「棚番号表示」を選択し、ICタグ・リーダー/ラ...
|&ref(shelfID.jpg);|
|CENTER: 図8|
** 開発環境 [#n620c7c7]
サンプルプログラムは、Eclipseのプロジェクトになっており、...
- java JDK1.5以降
http://java.sun.com/javase/downloads/index.jsp
からJava SE Development Kit (JDK)6 Update 11 の
Downloadボタンを押して、プラットフォームにあった
JDKをダウンロードして、インストールしてください。
- Eclipse 3.1以降
http://www.eclipse.org/
から、Download Eclipseをクリックして、
Eclipse IDE for Java DevelopersのWindowsを選択してダウン...
** GUIの構築 [#k82cb910]
GUIは、Eclipseのプラグインの一つであるVisula Editorを使っ...
画面でボタンやフィールドをマウスで配置しますので、初心者...
|&ref(VisualEditor.jpg);|
|CENTER: 図9|
** ISBN検索ボタンの処理 [#q85850e1]
ISBN番号から書籍の情報を取得するのは、アマゾンのAWS APIを...
AWSへのアクセス((日本語のAmaxon WEbサービスチュートリアル...
+ DocumentContainerにAWS APIのURLをセットします
+ JXPathContext#newContextメソッドで AWS APIを使って書籍X...
+ registerNamespaceメソッドで、ネームスペースawsを登録し...
+ context.getValue("//aws:Title")で書籍情報XMLからXPathで...
こんなに簡単にAWS APIを使って書籍情報を取得できることに驚...
#pre{{
private void searchISBN() {
String requestUrl = "http://webservices.amazon.co.jp/on...
+ DataBaseHelper.getAwsAccessKeyID() +
"&Operation=ItemSearch&ResponseGroup=Medium&SearchIndex...
+ getIcbnField().getText();
try {
DocumentContainer container = new DocumentContainer(ne...
requestUrl));
container.setNamespaceAware(true);
JXPathContext context = JXPathContext.newContext(conta...
context.registerNamespace("aws",
"http://webservices.amazon.com/AWSECommerceService...
String title = context.getValue("//aws:Title").toStrin...
String author = context.getValue("//aws:Author").toStr...
int numOfAuthor = (int)Double.parseDouble(context.getV...
for (int i = 1; i < numOfAuthor; i++) {
String nextAuthor = "//aws:Author[" + (i+1) + "]";
author = author + "; " + context.getValue(nextAuthor)...
}
String publisher = context.getValue("//aws:Manufacture...
String publicationDate = context.getValue("//aws:Publi...
String noPages = context.getValue("//aws:NumberOfPages...
String listPrice = context.getValue("//aws:Amount").to...
titleArea.setText(title);
authorArea.setText(author);
publisherField.setText(publisher);
publicationDateField.setText(publicationDate);
noPagesField.setText(noPages);
listPriceField.setText(listPrice);
} catch (Exception e) {
e.printStackTrace();
}
}
}}
* プログラムの実行 [#p7787631]
** AWS(Amazon Web Service)アカウントの作成 [#h64ac35c]
ISBNから書籍の情報を取得するのに、AWSのAPIを使っています...
- 最初にAWSのアカウントの作成
http://www.amazon.com/gp/aws/registration/registration-fo...
にアクセスして、必要な項目を入力し、登録ボタンを押すと完...
- Access Key IDの取得
AWSのアカウントの登録が完了すると、Welcome to Amazon Web ...
というタイトルのメールが届きます。
メールに記載されている、以下のサイトにアクセスします。
http://aws-portal.amazon.com/gp/aws/developer/account/ind...
Sign In画面で登録したメールアドレスとパスワードを入力する...
されます。
** プログラムのダウンロード [#i4845ae0]
ソースおよびプログラム一式は、ZIPファイルとしてictag.zip...
&ref(ictag.zip);
ictag.zipを解凍すると、ictagディレクトリに
#pre{{
ictag/
+src/
+lib/
+data/
+ictag-1.0.jar
+db.properties
+librxtxSerial.jnilib
+librxtxSerial.so
+rxtxSerial.dll
}}
があります。
- src/以下にプログラムソースがあります
- lib/以下に使用するライブラリがあります
- data/以下にHSQLDBが使用するファイルとBook.csvファイルが...
- ictag-1.0jar: ICタグサンプルプログラムのjarファイルです
- db.properties: データベース関連の設定ファイル
- librxtxSeria.jlib, librxtxSeria.so, rxtxSerial.dll: RXT...
** db.propertiesの設定 [#h3259502]
db.propertiesの設定情報について説明します。
*** JDBCドライバー情報 [#p046259b]
初期設定では、JDBCドライバー情報としてHSQLDBを使用する設...
ictag-1.0.jarのライブラリのパスに登録してあるデータベース...
- HSQLDB Ver. 1.8.0.7
- MySQL Ver. 5.1.6
- PostgreSQL Ver. 8.1.407
です。上記以外のドライバーを使用する場合には、ドライバー...
#pre{{
db.url=jdbc:hsqldb:data/book
db.driver=org.hsqldb.jdbcDriver
db.username=sa
db.password=
}}
- db.url: 接続するデータベースのURLを指定します
- db.driver: JDBCドライバーのクラスパスを指定します
- db.username:データベースのユーザ名を指定します
- db.password: データベースのパスワードを指定します
*** SQL文の設定 [#la77205e]
データベースによってSQL文に若干違いがあるため、使用するSQ...
初期設定はHSQLDBを使ってCSVファイルをテーブルと扱うように...
#pre{{
db.createTable=CREATE TEXT TABLE Book (ID IDENTITY, ICTAG...
TITLE VARCHAR, AUTHOR VARCHAR, PUBLISHER VARCHAR, PUBLI...
NOPAGES VARCHAR, LISTPRICE VARCHAR, SHELFID VARCHAR);
SET TABLE Book SOURCE "book.csv;encoding=Shift_JIS";
db.insertSQL=INSERT INTO Book (id, icTag, isbn, title, a...
noPages, listPrice, shelfId) VALUES (?, ?, ?, ?, ?, ?, ...
db.updateSQL=UPDATE Book SET id=?, icTag=?, isbn=?, title...
publicationDate=?, noPages=?, listPrice=?, shelfId=? WH...
db.selectAllSQL=SELECT * FROM Book;
db.selectWhereSQL=SELECT * FROM Book WHERE title like ? O...
}}
- db.createTable: テーブルの作成用SQL文を指定します
- db.insertSQL: レコードの挿入用SQL文を指定します
- db.updateSQL: レコードの更新用SQL文を指定します
- db.selectAllSQL: 全レコード検索SQL文を指定します
- db.selectWhereSQL: 条件付き検索SQL文を指定します
*** AWS Access Key ID [#y4fecca3]
先にAmazonから取得したAWS Access Key IDは、
#pre{{
aws.access.keyID=ここに取得したAccessKeyIDをセットしてく...
}}
に設定します。
*** ICタグ・リーダー/ライター使用の有無 [#x4ca993b]
ICタグ・リーダー/ライター使用の有無を指定します。
初期設定は、ICタグ・リーダー/ライターを使用する設定にな...
ICタグ・リーダー/ライターを使用しないで、書籍の管理をす...
#pre{{
use.ictag=false
}}
に変更してください。
** プログラムの起動 [#h8066999]
プログラムの起動は、ターミナルまたはコンソールから
#pre{{
$ java -jar ictag-1.0.jar シリアルデバイス名
}}
を入力します。
例)MacOSXでの起動例
#pre{{
$ java -jar ictag-1.0.jar /dev/cu.usbserial-A5002yHm
Experimental: JNI_OnLoad called.
Stable Library
=========================================
Native lib Version = RXTX-2.1-7
Java lib Version = RXTX-2.1-7
}}
** 書籍データベース [#yf72cc11]
登録した書籍情報は、データベースに登録されます。
初期設定では、HSQLDBを使ってdata/Book.csvファイルに書籍情...
文字コードをShift_JISに設定してありますので、そのままExce...
本格的なデータベースを使う例として、MySQLを使う場合の設定...
MySQLで日本語を扱う場合、データベース作成後に
#pre{{
ALTER DATABASE データベース名 CHARACTER SET SJIS;
}}
のように使用する文字コードをSJISに変更します。
次にdb.propertiesの設定では、db.urlで文字コード指定が必要...
#pre{{
db.url=jdbc:mysql://localhost/ictag?useUnicode=true&chara...
db.driver=com.mysql.jdbc.Driver
db.username=ictag
db.password=ictag
}}
テーブルの作成は、以下のように変更します。
#pre{{
db.createTable=CREATE TABLE Book (ID LONG, ICTAG VARCHAR(...
TITLE VARCHAR(255), AUTHOR VARCHAR(255), PUBLISHER VARC...
PUBLICATIONDATE VARCHAR(10), NOPAGES VARCHAR(5), LISTPR...
SHELFID VARCHAR(4));
}}
* あとがき [#l7468b27]
ICタグを使ったサンプルプログラムでは、
- ICタグ・リーダー/ライターとの接続方法
- ICタグを読み書きをする方法
- ICタグを使って書籍を管理する場合の、書籍登録作業の軽減...
- java言語によってOSに依存することなくICタグ・リーダー/...
- 特定のデータベースに依存しないで、書籍データベースを管...
を紹介しました。
大信機器株式会社の野村秀夫さん、リンテック株式会社の佐藤...
ページ名:
SmartDoc