プロデルでFelicaカードを使った入退室記録ツールを作る


Felicaは、Suica,ICOCAなどの交通系ICカード、WAONやedyなどの電子マネーで使われている非接触型のデータ通信技術です。

NFC対応のUSBリーダーや、PCに内蔵されたFelicaポートを使ってPCからFelica対応のICカードの情報を取得できます。

プロデルでは、Felicaプラグインを使うことで、Felicaポートに置いたFelicaカードの情報を取得できます。

プロデルのFelicaプラグインは、次のアドレスからダウンロードできます。
http://rdr.utopiat.net/files/plugins.html#felica

使えるFelicaカード

Felicaカードは、SuicaやICOCAなどの交通系ICカードや、EdyやWAON, nanacoなどの電子マネーです。おサイフケータイもFelicaカードとして扱えます。出欠席管理ツールでは、カードの固有番号(IDm)を読み取るのみですので、使用中のICカードや使い古したICカードで遊べます。なお、運転免許証やマイナンバーカードは、Felicaではありませんので今回は使えません。

IDmを取得する

SuicaやWAONなどFelicaカードには、カードを識別するIDm(製造ID)とカードの状態を表すPMm(製造パラメータ)が保存されています。IDmは、Felicaカード一枚一枚に割り当たられた固有の番号で、番号が重複しないように割り当てられています。このIDmを使うことで、カードを区別することができます。プロデルでは、IDmを取得できます。

「Produire.Felica.dll」を利用する
フェリカポートで受け付けしてカードとする
カードからIDmをテキストで取得して結果とする
結果を報告する

カードからPMmをテキストで取得して結果とする
結果を報告する

FelicaポートにFelicaカードを置いた状態で実行すると、IDmとPMmが取得できます。「フェリカポート」種類の「受け付ける」手順を実行すると、Felicaポートにカードがある場合に「フェリカカード」種類のオブジェクトを返します。一方カードがポートに置かれていない時は「フェリカポートで受け付け」た結果が「無」になります。

カードが置かれたことを判定する

「フェリカポート」種類の「受け付ける」手順を使うことで、カードの有無が判定できます。これを利用して一定時間ごとにFelicaポートのカードの有無を調べて、もしカードが置かれた場合にはIDmを表示して、カードが無くなった時には「カードが取られました」と表示するプログラムを作ります。

ポイントは、置かれたカードのIDmを「カードIDm」変数に記憶しておいて、同じカードが置かれ続けている場合には、IDmを表示しないようにしてIDmが何度も表示されないように工夫している点です。

「Produire.Felica.dll」を利用する
カードIDmは、「」
繰り返す
  フェリカポートで受け付けしてカードとする
  もしカードが無でなければ
    カードからIDmをテキストで取得して読み取り結果とする
    もしカードIDmが読み取り結果でなければ
      カードIDmは、読み取り結果
      読み取り結果を報告する
    もし終わり
  そうでなければ
    もしカードIDmが「」でなければ
      「カードが取られました」を報告する
    もし終わり
    カードIDmは、「」
  もし終わり
繰り返し終わり

カードごとに名前を表示する

今度は、カードごとに名前を付けておき、そのカードが置かれたときに画面に対応する名前を表示させてみます。IDmはカード固有の番号ですので、この番号と名前など情報とを紐付けることで、カードを置いたときに名前を表示させるようにします。

まず予めFelicaカードのIDmを調べておきます。「名簿」変数に、IDmをキーに、名前を値にして、カードと名前の対応表を「辞書」として作っておきます。カードが置かれたときには、名簿から該当するIDmの名前を表示させます。

「Produire.Felica.dll」を利用する
名簿は、{
 「01xxxxxxxxxxxx18」=「山田花子」,
 「01xxxxxxxxxxxx1E」=「平沢真一」,
 「01xxxxxxxxxxxx19」=「秋山洋子」
}
カードIDmは、「」
繰り返す
 フェリカポートで受け付けしてカードとする
 もしカードが無でなければ
  カードからIDmをテキストで取得して読み取り結果とする
  もしカードIDmが読み取り結果でなければ
   カードIDmは、読み取り結果
   名前は、名簿(カードIDm)
   「こんにちは。[名前]さん」を報告する
  もし終わり
 そうでなければ
  カードIDmは、「」
 もし終わり
繰り返し終わり

なお、Felicaカードの種類によっては、カードに情報そのものを書き込むことも可能です。ただ自由に情報を書き込める領域があるカードは限られ、また書き込める場合でも多くの情報を記憶することが出来ないため、今回のようにIDmをキーにパソコン側に情報を格納しておく方法が簡単です。

入退室を記録する

さらに応用して、入室時間と退室時間をカードごとに記録するようにしてみます。最初にFelicaポートにカードを置いた時には入室時刻が記録され、一度カードを離した上で、再度置くと、退出時刻を記録します。これらの情報をCSVファイルに記録することで日々の入退室を管理します。またついでに、名前とIDmの名簿もCSVファイルから読み込むように修正してみます。

入室と退室を区別するには [追記6/2]

今回のツールでは、最初にカードを触れたときには、「入室」として、再度カードに触れた時は「退室」として記録するようにしたいと思います。

「入室リスト」という辞書を用意しておき、最初にカードを触れた時に「入室リスト」へキーをIDmにした値を記録しておきます。その後は触れた際にIDmをキーとする値が「入室リスト」に存在するかどうかをチェックして、キーが存在しなければ「入室」、キーが存在すれば「退室」として扱うようにします。ここで退室となった場合には「入室リスト」から触れたカードのIDmを削除します。

このように辞書を使ってIDmをキーにして管理することで、入退室を区別できます。

名簿をCSVファイルから読み込む

次には、すでに辞書で指定してある名前とIDmの名簿をCSVファイルから読み込むように改良します。データ表へCSVファイルの内容を読み込むには、「読み込む」手順を使います。このとき、CSVファイルが存在しない場合はエラーメッセージが表示されるようにしておきます。

データ表は、「一覧」設定項目を使うことで内容を配列として主付くできます。「それぞれ繰り返す」文で、1レコードずつ名簿にIDmと名前の関係を登録していきます。

名簿データというデータ表を作る
名簿データcsvは、「名簿.csv」
もし名簿データcsvというファイルが存在しないなら、「名簿が見つかりません。」を表示する。終了する。
名簿データへ名簿データcsvから読み込む

名簿は、空の辞書
名簿データの一覧のすべてのレコードについてそれぞれ繰り返す
 名簿(レコード(1))=レコード(2)
繰り返し終わり

名簿.csvの内容は次のような内容でメモ帳などを使って保存しておきます。

"01xxxxxxxxxxxx18","山田花子"
 "01xxxxxxxxxxxx1E","平沢真一"
 "01xxxxxxxxxxxx19","秋山洋子"

CSVファイルへ記録する

CSVファイルの読み書きには、「データ表」種類を使います。データ表を使うことで、CSV形式のファイルを簡単に取り扱えます。

ここでは、付け加える部分だけを取り上げます。「入退室記録」には入退室の時間と名前、入室か退室かを順番に記録していきます。データ表に記録を追加するには、「加える」手順を使います。

また、記録をCSVファイルへ書き込むには、「保存」手順を使います。次回起動した際の記録を引き継ぐために、「入退室記録.csv」が存在する場合には、そのファイルの内容を上書きしてしまわないように記録を読み込んでおきます。

入退室記録というデータ表を作る
入退室記録csvは、「入退室記録.csv」
もし入退室記録csvというファイルが存在するなら、入退室記録へ入退室記録csvから読み込む
//・・・
もし入室リストに読み取り結果が存在するなら
//・・・
 入退室記録に{「[日付] [時刻]」、「[名前]」、「退室」}を加える
そうでなければ
//・・・
 入退室記録に{「[日付] [時刻]」、「[名前]」、「入室」}を加える
もし終わり
入退室記録を入退室記録csvへ保存する

画面の作成

プロデルデザイナの「情報ウィンドウ」で表示されるだけでは格好悪いので、ウィンドウを表示するようにします。ウィンドウの設計画面でメイン画面を作ります。

メイン画面とは
  ウィンドウを継承する
  はじめの手順
    初期化する
    ーー貼り付けた部品に対する操作をここに書きます
  終わり
  初期化する手順
  ーー自動生成された手順です。ここにプログラムを書き加えても消える場合があります
  この内部領域大きさを{459,101}に変える
  この種類を「ダイアログ」に変える
  この最大化ボタンを×に変える
  この最小化ボタンを×に変える
  この初期位置を「中央」に変える
  この内容を「入退室管理」に変える
  ラベル1というラベルを作る
    その位置と大きさを{12,28,279,34}に変える
    その内容を「カードを置いてください」に変える
    そのフォントを「Yu Gothic,18,太字」に変える
    そのドラッグドロップを×に変える
  終わり
終わり

完成したプログラム

上記のようなCSVファイルの読み書きのプログラムを追加することで、入退室記録をファイルへ保存できるようになります。

「Produire.Felica.dll」を利用する
名簿データというデータ表を作る
名簿データcsvは、「名簿.csv」
もし名簿データcsvというファイルが存在するなら、名簿データへ名簿データcsvから読み込む

名簿は、空の辞書
名簿データの一覧のすべてのレコードについてそれぞれ繰り返す
  名簿(レコード(1))=レコード(2)
繰り返し終わり

入退室記録というデータ表を作る
入退室記録csvは、「入退室記録.csv」
もし入退室記録csvというファイルが存在するなら、入退室記録へ入退室記録csvから読み込む

メイン画面を表示する

入室リストは、空の辞書
カードIDmは、「」
繰り返す
  フェリカポートで受け付けしてカードとする
  もしカードが無でなければ
    カードからIDmをテキストで取得して読み取り結果とする
    もしカードIDmが読み取り結果でなければ
      カードIDmは、読み取り結果
      名前は、名簿(カードIDm)
      もし入室リストに読み取り結果が存在するなら
        入室リストから読み取り結果を消す
        メイン画面のラベル1の内容は、「[時刻]さようなら。[名前]さん」
        入退室記録に{「[日付] [時刻]」、「[名前]」、「退室」}を加える
      そうでなければ
        入室リストへ読み取り結果として○を設定
        メイン画面のラベル1の内容は、「[時刻]こんにちは。[名前]さん」
        入退室記録に{「[日付] [時刻]」、「[名前]」、「入室」}を加える
      もし終わり
      入退室記録を入退室記録csvへ保存する
    もし終わり
  そうでなければ
    カードIDmは、「」
  もし終わり
繰り返し終わり

メイン画面とは
  ウィンドウを継承する
  はじめの手順
    初期化する
    ーー貼り付けた部品に対する操作をここに書きます
  終わり
  初期化する手順
  ーー自動生成された手順です。ここにプログラムを書き加えても消える場合があります
  この内部領域大きさを{459,101}に変える
  この種類を「ダイアログ」に変える
  この最大化ボタンを×に変える
  この最小化ボタンを×に変える
  この初期位置を「中央」に変える
  この内容を「入退室管理」に変える
  ラベル1というラベルを作る
    その位置と大きさを{12,28,279,34}に変える
    その内容を「カードを置いてください」に変える
    そのフォントを「Yu Gothic,18,太字」に変える
    そのドラッグドロップを×に変える
  終わり
終わり

入退室記録.csvには、次のように時刻と名前、入室か退室かが記録されていきます。

まとめ

いかがでしたでしょうか?
プロデルのFelicaプラグインを使うことで、ICカードによる入退室管理ツールを作ってみました。Felicaポートでできることはとてもシンプルですが、複数のカードを組み合わせて、何かの状態を表すことができるので、ゲームや作業管理など工夫次第で、日々の生活に便利で楽しいツールを作ることができるかと思います。

  • いいね (0)
  • 続きを読みたい (1)

コメントを残す