
第2回
モトローラ製「XP480-JP」のプログラミングを学ぶ
西村 泰洋
富士通株式会社
ビジネスインキュベーション本部
開発部
担当課長
2007年9月4日
メインモジュールのソースコードを読む
メインモジュールのソースコードは以下のとおりです。
// (1)リーダ/ライタをオープン printf("Open Reader...\n"); //サンプル用クラスのインスタンスを生成 XR400APIReader reader; reader.hReader = OpenReader(TEXT("192.168.127.254"), 3000); if(reader.hReader){ // (2)読み取るタグのタイプをGen2に設定 printf("Set Read Tag Type Gens...\n"); //RFID_TAG_TYPE_EPC_CLASSG2にバイトを別途定義済み SetTagType(reader.hReader, RFID_TAG_TYPE_EPC_CLASSG2, true); } // (3)タグの読み取りイベントを設定 printf("Set Tagevent...\n"); reader.hReadTagEvent = SetReadEvent(reader.hReader); // (4)Autonomousモードでの読み取り開始 printf("Start Autonomous Read...\n"); for(int i=0; i < 10; i++){ printf("\nRead:%d",i); //タグリストを初期化 memset(&reader.tagList, 0, sizeof(reader.tagList)); TAG_LIST_EX1_INIT(reader.tagList, 0); //Autonomousモードでの読み取り AutonomousRead(reader.hReader, &reader.tagList); Sleep(5000); } // (5)リーダ/ライタをクローズ CloseReader(reader.hReader); return 0; |
メインモジュールのソースコード |
(1)の「リーダ/ライタをオープン」で、リーダ/ライタのIPアドレスを「192.168.127.254」、ポート番号を「3000」として通信を開始しています。
(4)で読み取り処理を指示しています。まず、「reader.tagList」を初期化して、AutonomousReadを10回実行させます。そして、5000ミリ秒待ってからリーダ/ライタのキャッシュに保存されているデータを「reader.tagList」に持ってくるという処理をしています。
OpenReaderのソースコードを読む
OpenReaderのソースコードは以下のとおりです。
// リーダ/ライタをオープン HANDLE OpenReader(TCHAR tszNewIPAddress[32], WORD wPort){ HANDLE hReader = 0; // リーダ/ライタ用APIをオープン // RFID_SUCCESSは別途定義済み if(RFID_Open(&hReader) == RFID_SUCCESS){ // リーダ/ライタのIPアドレス、ポート番号を指定 DWORD dwItems = 1; dwItems = (DWORD)wcslen(tszNewIPAddress) + 1; if(ConfigureReader(hReader, tszNewIPAddress, wPort)){ // リーダ/ライタオープン if(RFID_OpenReader(hReader, 0) == RFID_SUCCESS){ printf("Connection Open\n"); } else printf("RFID_OpenReader Error\n"); } else printf("ConfigureTCPIP Error\n"); } else printf("RFID_Open Error\n"); return hReader; } |
OpenReaderのソースコード |
APIをオープンしてからホストコンピュータとリーダ/ライタの通信をオープンしています。
通信にエラーが生じる場合、APIのオープンエラーなのか、設定によるエラーなのか、物理的なエラーなのかを表示させます。
AutonomousReadのソースコードを読む
AutonomousReadのソースコードは以下のとおりです。
//Autonomousモードでのタグ読み取り void AutonomousRead(HANDLE hReader, TAG_LIST_EX *pTagList) { //構造体TAG_LIST_EXは別途定義済み printf("\nAutonomous read from Reader\n"); DWORD dwStatus = RFID_SUCCESS; //読み取りモードをAutonomousに設定 WORD dwParamValue = RFID_READCAP_READMODE_AUTONOMOUS; //RFID_READCAP_READMODE_AUTONOMOUSにバイト列を別途定義済み DWORD dwNumItems = 1; RFID_SetCapCurrValue(hReader, RFID_READCAP_READMODE, &dwNumItems, sizeof(dwParamValue), &dwParamValue); //タグの読み取り dwStatus = RFID_ReadTagInventoryEX(hReader, pTagList, true); if(dwStatus == RFID_SUCCESS){ //タグリストの表示 PrintTagList(hReader, pTagList); } else{ printf("%S\n", RFID_GetCommandStatusText(hReader, dwStatus)); } } |
AutonomousReadのソースコード |
読み取りモードがAutonomousに設定されます。
ここで「RFID_ReadTagInventoryEX」を指定することで、リーダ/ライタのキャッシュにたまったRFIDタグのデータを「pTagList」に取得することができます。しかしながら、それだけでは「pTagList」の内容が見えないので、「PrintTagList」関数ではき出す処理が必要になっています。
PrintTagListのソースコードを読む
参考までに、タグリスト表示の一例として「PrintTagList」のソースコードも見ていきましょう。
// タグリストの表示 void PrintTagList(HANDLE hReader, TAG_LIST_EX *pTagList){ DWORD dwI = 0; char *szProtocol; char szTagID[32]; printf("\n"); TYPE_TAG_EX tag; for(dwI = 0; dwI < pTagList->dwTotalTags; dwI++){ // タグリスト内のタグを抽出 tag = pTagList->Tags[dwI]; // convert tag id to ascii text string // タグのIDを16進数に変換 ConvertHexString(tag.tagID, tag.dataLength, szTagID); // 読み取ったタグのタイプを取得 if(tag.dwType == RFID_TAG_TYPE_EPC_CLASSG2){ szProtocol = "G2"; } else{ szProtocol = "??"; } // 表示 printf("Tag %3.3u Reads: %3.3u Type: %s Ant: %2.2u:%s\n", dwI+1, pTagList->Tags[dwI].readCount, szProtocol, pTagList->Tags[dwI].antennaNum, szTagID); } } |
AutonomousReadのソースコード |
「pTagList」に取得される値の形式はバイト列です。そのため、RFIDタグのIDをバイト列から16進数へと変換するサブルーチンが必要になります。
プログラムの前に基礎知識の習得が必須
以上のソースコードからも分かるように、RFIDシステムのプログラミングに取り掛かるためには、RFIDシステムの基本を押さえておくことがいかに重要であるかがご理解いただけたのではないでしょうか。
それは、各メーカーの機器とAPIの特徴を理解して、プログラミングに臨むということにほかなりません。「基本?」と思われた方はRFIDシステム導入バイブルの第3回をお読みください。
今回の重要な部分を復習しますと、
- ホストコンピュータとリーダ/ライタの接続開始
⇒APIのオープンが不可欠 - 読み取りをどのように設定するか(読み取りの方法をどのように考えるか)
⇒読み取り処理の設定方法と読み取りしたデータの格納場所を把握する
ということになります。現実のRFIDシステム構築における詳細設計では、オープンのタイミングや読み取りの方法を業務運用に照らして最適な形にする必要があります。
次回以降、さまざまなメーカーのプログラミングを取り上げていきますが、共通点もあれば特有のコマンドもあり、実に興味深いものです。連載が進めば、メーカーごとにプログラミング方法が異なっていてもソースコードが意味するものに大きな違いはないということがご理解いただけるのではないでしょうか。
![]() |
2/2 |
Index | |
モトローラ製「XP480-JP」のプログラミングを学ぶ | |
Page1 XP480-JPのプログラミングのクセをおさらい サンプルプログラムのフローチャート サンプルプログラムの実行結果 |
|
![]() |
Page2 メインモジュールのソースコードを読む OpenReaderのソースコードを読む AutonomousReadのソースコードを読む PrintTagListのソースコードを読む プログラムの前に基礎知識の習得が必須 |
Profile |
西村 泰洋(にしむら やすひろ) 富士通株式会社 ビジネスインキュベーション本部 開発部 担当課長 物流システムコンサルタント、新ビジネス企画、マーケティングを経て2004年度よりRFIDビジネスに従事。 RFIDシステム導入のコンサルティングサービスを立ち上げ、自動車製造業、流通業、電力会社など数々のプロジェクトを担当する。 著書に「RFID+ICタグシステム導入構築標準講座(翔泳社)」がある。 |
![]() |
RFIDシステムプログラミングバイブル 連載インデックス |
- 人と地域を結ぶリレーションデザイン (2008/9/2)
無人駅に息づく独特の温かさ。IT技術を駆使して、ユーザーが中心となる無人駅の新たな形を模索する - パラメータを組み合わせるアクセス制御術 (2008/8/26)
富士通製RFIDシステムの特徴である「EdgeBase」。VBのサンプルコードでアクセス制御の一端に触れてみよう - テーブルを介したコミュニケーションデザイン (2008/7/23)
人々が集まる「場」の中心にある「テーブル」。それにRFID技術を組み込むとコミュニケーションに変化が現れる - “新電波法”でRFIDビジネスは新たなステージへ (2008/7/16)
電波法改正によりミラーサブキャリア方式の展開が柔軟になった。950MHz帯パッシブタグはRFID普及を促進できるのか
![]() |
|
|
|
![]() |
- - PR -