Macで Edy の履歴を読む


 MacにPaSoRiを接続してEdyの履歴情報を読み出すプログラムができましたので、Macユーザー向けに公開します。
(MacOS 10.4 でインテル版、PPC版で動作します。)
(注:チャージ(入金)など、書込の機能はありません。PaSoRiはRC-S320のみに対応しています。)

 殆どの機能はネット上に公開されているlibpasorilに依存しています。
更にlibpasoriはlibusbを利用しています。(詳細はこれらのサイトをご覧下さい)
 この二つのライブラリのおかげでEdyとSuicaの履歴情報を読み出すプログラムが実現できました。
それぞれの作者に感謝します。

 プログラムは、インストールの楽なコンパイル済みのバイナリで公開します。
 (自由に変更できるようソースも公開します。)

 EdyValue.c とAppleScriptの著作権は作者の私にありますが、改変は自由です。
 また、このソフトの利用は自己責任でお願いします。

【インストール方法】

1 まず、libusbをhttp://libusb.sourceforge.net/からダウンロードしてインストールします。
 (既にインストール済みなら必要ありません)
 <ダウンロードしたものを解凍してターミナルを起動し、解凍したディレクトリに移動して
    ./configure して、 sudo make install します>
(Developer toolsがインストールされている必要があります)

2 次に、EdyValueをここからダウンロードしてホームディレクトリ(フォルダ)に置きます。
  EdyValue (インテルMac用) (PPC Mac用) ← 必要な方を右クリックして「リンク先を保存」してください。

3 EdyValue に実行権を与えます。(ターミナルで、 chmod +x EdyValue します)

4 PaSoRiを接続して動作を確認します。(ターミナルで ./EdyValue すると、履歴が表示されます)
  旨く動作しない場合は、ソースからコンパイルしてみてください。

5 GUIっぽく簡単に操作できるよう、AppleScriptも作成しました。
  下のソースをコピーしてお使いください。(Scriptメニューに入れておくと便利でしょう)


【コンパイルする場合】

1 libpasoriをhttp://libpasori.sourceforge.jp/からダウンロードして解凍します。

2 解凍してできたフォルダ内にある「src」フォルダに「EdyValue.c」のソースプログラムを保存します。
 EdyValue.c
 C言語で書いています。(慣れていないので、奇麗なコードではありません。)

3 ターミナルで、srcフォルダに移動し、次のコマンドでコンパイルします。
「gcc -o EdyValue `libusb-config --cflags` -D__LIBPASORI_WITH_LIBUSB EdyValue.c libpasori_command.c libpasori_com_libusb.c libpasori_polling.c `libusb-config --libs`」
「strip EdyValue」
 (libpasori付属の「buildline-libusb.sh」をコピーして上記のように修正すると良いでしょう)

【フォーマットの解説】(推測です)

 Edyのデータは全てバイトの並びが順列です。(ビッグエンディアン)
 先頭のバイトが 0x02 がチャージ(入金)、0x20が出金を示すようです。
 5バイト目の先頭からの15ビットが、2000年からの通算日数、
 7バイト目からの2バイトが午前零時からの通算秒数のようです。
 11バイト目から2バイトが出し入れした金額を、15バイト目から2バイトが残金を表わしているようです。


【EdyValueを利用したアプリ(AppleScript)】
--
-- 「EdyValue.scpt」
-- PaSoRiでEdyの履歴を抽出して表示するスクリプトです。
-- Edyを読むアプリケーション「EdyValue」はホームディレクトリ直下に置いて実行権を与えておいて下さい。
set cmdPath to "$HOME/EdyValue"
do shell script cmdPath
set EdyValue to result as text

set dataCount to the number of paragraphs of EdyValue
set sortedData to ""
repeat with i from 0 to dataCount - 2
	set eachData to paragraph (dataCount - i) of EdyValue
	set lineData to word 3 of eachData & "/" & word 4 of eachData & "/" & word 5 of eachData & " "
	set lineData to lineData & word 7 of eachData & "円"
	if word 9 of eachData = "chg" then
		set lineData to lineData & " 入金で"
	else
		set lineData to lineData & " 使用で"
	end if
	set lineData to lineData & "残金は" & word 11 of eachData & "円"
	
	set sortedData to sortedData & lineData & (ASCII character 13)
end repeat
display dialog sortedData
set the clipboard to sortedData as string
--