FeliCa の Id を python で読む(その2)
FeliCa の Id を python で読む(その1) でいったん挫折した私ですが、意外なところがきっかけで再度やってみることにしました。
そのきっかけは先日開催された Python Unconference Tokyo 1 です。
私は参加できなかったんですが、発表資料が公開されたのでざっと読んでみました。
その中のライトニングトーク PyTCで学ぶPython C拡張の書き方 (末永 匡さん) という発表資料を読んでみると、python で外部のライブラリを使用するための主な手段についての説明がありました。
その中には ctypes, SWIG, Pyrex, SIP, Boost.Python, Cによる拡張モジュールという手段が説明されており、その中で ctypes はこんな感じで紹介されていました。
- The ctypes package
- Windowsではおなじみ
- Python 2.5以降は標準モジュール
- お手軽・コンパイルいらず
- お試しで使う場合、パフォーマンスを気にしない場合にはオススメ!
- 実用的にするにはラッパをPythonで書く必要あり
- Windowsではおなじみ
「お手軽・コンパイルいらず」。これしかない!!
というわけで、ctypes で felica を読む dll のラッパーを書いてみることにしました。
まずは準備です。
python 2.4.4 と ctypes 1.0.2 をインストールします。インストーラ(.msi, .exe)があるから楽ちん。
次に、FeliCa を読むライブラリ(dll)を用意します。 以前調べた libpasori よりも felicalib というのがあって、こっちの方がよさげなのでこれを使うことにします。
ちなみに felicalib を使うためには FeliCaポートソフトウェア もインストールする必要があります。
というわけで作ってみました。コード(felicalib.py)はこんな感じです。
from ctypes import *flib = cdll.felicalib # ライブラリを読む
flib.pasori_open.restype = c_void_p pasori = flib.pasori_open() # PaSoRi と接続
flib.pasori_init(pasori)
flib.felica_polling.restype = c_void_p felica = flib.felica_polling(pasori, 0xFFFF, 0, 0) # FelCa を読む
idm = c_uint64() flib.felica_getidm(felica, byref(idm)) # IDm 取得
print "%016X" % idm.value flib.pasori_close(pasori) # PaSoRi と切断
試しに読み込んでみると、きちんと IDm が取得できました。わーい。
ちなみに、本当は pasori_open の戻り値は構造体へのポインタなのですが、構造体を作って...というやり方がよくわかんなかったので、とりあえずポインタだけ取っておいて、次の関数に渡すようにしました。(手抜き)
「まとめ」
- ctypes はとりあえず Windows 用の dll 使ってなにか作る分には楽
- コンパイラ不要なので手軽
- dll 使うもの、他にもなんか試してみたいなぁ
参考資料
- カテゴリ
-
python
-
- ¦
- 固定リンク
- ¦
- コメント (0)
- ¦
- トラックバック (0)
- トラックバック用URL:
- http://takanory.net/takalog/824/tbping
鈴木たかのりです。とりあえず日記っぽく雑多なことを書き込んでいこうと思っています。
zope/plone関係の技術的な内容については