カテゴリー別アーカイブ: プログラム小技

luaで共有ライブラリを作成する方法

Luaバイナリをソースファイルからコンパイルして作成するとき、

標準では静的ライブラリが生成されます。

通常Luaを組み込み用途で使用するときは静的ライブラリで十分なのですが、

時には共有ライブラリが欲しくなるので、作成してみます。

(lua5.1を想定しています)

src/Makefileに以下を追加する。

LUA_O=lua.oと書かれた行の下に、以下の行を挿入する。

LUA_SO=liblua5.1.so

次の行の最後に、$(LUA_SO)を追記する。

ALL_T=$(LUA_A) $(LUA_T) $(LUAC_T)

ALL_T=$(LUA_A) $(LUA_T) $(LUAC_T) $(LUA_SO)

clean:と書かれた行の前に、以下の2行を挿入する。

(2行の前後には1行の空行があるようにする)

$(LUA_SO): $(CORE_O) $(LIB_O)
$(CC) -o $@ -shared $?

保存する。

次にMakefileを下記のように編集する。

TO_LIB= liblua.aとなっている行の最後に liblua5.1.soを追記する。

TO_LIB=liblua.a liblua5.1.so

これで、makeするとliblua5.1.soが生成されます。

ubuntuでICタグ(RFID)読み込み

WindowsではPC/SCがありますが、LinuxにもPC/SC Liteというライブラリがあり、非接触ICカード(RFID)にアクセスできます。

準備として、必要なライブラリをインストールします。

ubuntuではpcscデーモンは最初からインストールされているようです。

ICカードリーダには、OMNIKEYのCardman5321(USBタイプ)を使ってみます。

OMNIKEYはubuntuのSynapticパッケージに登録されているため、インストールが簡単なのです。

sudo apt-get install pcsc-tools pcsc-omnikey

(この時、libpcsc-perlなど関連ライブラリもインストールされます)

インストールが終わったら、OMNIKEY Cardman5321をPCのUSB端子に差し込み、以下のコマンドを実行します。

sudo /etc/init.d/pcscd stop

sudo /usr/sbin/pcscd -f -a -d

pcscデーモンがターミナル上でフォアグラウンド起動し、下記のようなメッセージが表示されます。

00000000 debuglog.c:224:DebugLogSetLevel() debug level=debug
00001188 pcscdaemon.c:505:main() pcsc-lite 1.5.3 daemon ready.
00250251 hotplug_libusb.c:477:HPAddHotPluggable() Adding USB device: 006:003
00000075 readerfactory.c:1024:RFInitializeReader() Attempting startup of OMNIKEY CardMan 5×21 00 00 using /usr/lib/pcsc/drivers/ifdokrfid_lnx-2.6.0.bundle/Contents/Linux/ifdokrfid.so
00000513 readerfactory.c:877:RFBindFunctions() Loading IFD Handler 3.0
OK OMNIKEY CardMan RFID  IA32 v2.6.0 support@omnikey.com
00289502 readerfactory.c:249:RFAddReader() Using the pcscd polling thread
00002051 readerfactory.c:1024:RFInitializeReader() Attempting startup of OMNIKEY CardMan 5×21 00 01 using /usr/lib/pcsc/drivers/ifdokrfid_lnx-2.6.0.bundle/Contents/Linux/ifdokrfid.so
00000028 readerfactory.c:741:RFLoadReader() Reusing already loaded driver for /usr/lib/pcsc/drivers/ifdokrfid_lnx-2.6.0.bundle/Contents/Linux/ifdokrfid.so
00000071 readerfactory.c:877:RFBindFunctions() Loading IFD Handler 3.0
OK OMNIKEY CardMan RFID  IA32 v2.6.0 support@omnikey.com
00393999 readerfactory.c:385:RFAddReader() Using the pcscd polling thread
00385840 Card ATR: 3B 8F 80 01 80 4F 0C A0 00 00 03 06 0A 00 16 00 00 00 00 74

00000000 debuglog.c:224:DebugLogSetLevel() debug level=debug00001188 pcscdaemon.c:505:main() pcsc-lite 1.5.3 daemon ready.00250251 hotplug_libusb.c:477:HPAddHotPluggable() Adding USB device: 006:00300000075 readerfactory.c:1024:RFInitializeReader() Attempting startup of OMNIKEY CardMan 5×21 00 00 using /usr/lib/pcsc/drivers/ifdokrfid_lnx-2.6.0.bundle/Contents/Linux/ifdokrfid.so00000513 readerfactory.c:877:RFBindFunctions() Loading IFD Handler 3.0OK OMNIKEY CardMan RFID  IA32 v2.6.0 support@omnikey.com00289502 readerfactory.c:249:RFAddReader() Using the pcscd polling thread00002051 readerfactory.c:1024:RFInitializeReader() Attempting startup of OMNIKEY CardMan 5×21 00 01 using /usr/lib/pcsc/drivers/ifdokrfid_lnx-2.6.0.bundle/Contents/Linux/ifdokrfid.so00000028 readerfactory.c:741:RFLoadReader() Reusing already loaded driver for /usr/lib/pcsc/drivers/ifdokrfid_lnx-2.6.0.bundle/Contents/Linux/ifdokrfid.so00000071 readerfactory.c:877:RFBindFunctions() Loading IFD Handler 3.0OK OMNIKEY CardMan RFID  IA32 v2.6.0 support@omnikey.com00393999 readerfactory.c:385:RFAddReader() Using the pcscd polling thread00385840 Card ATR: 3B 8F 80 01 80 4F 0C A0 00 00 03 06 0A 00 16 00 00 00 00 74

ちゃんとリーダライタと接続できているようです。

別のターミナルを起動して、以下のコマンドを実行します。

pcsc_scan

すると下記のようなメッセージが表示されます。

PC/SC device scanner

V 1.4.16 (c) 2001-2009, Ludovic Rousseau <ludovic.rousseau@free.fr>

Compiled with PC/SC lite version: 1.5.3

Scanning present readers…

0: OMNIKEY CardMan 5×21 00 00

1: OMNIKEY CardMan 5×21 00 01

Tue May 18 09:19:21 2010

Reader 0: OMNIKEY CardMan 5×21 00 00

Card state: Card removed,

Tue May 18 09:19:21 2010

Reader 1: OMNIKEY CardMan 5×21 00 01

Card state: Card removed,

これは、現在カードをリーダライタに載せていない状態です。
カードを載せるとさらにメッセージが表示されます。
Tue May 18 09:03:31 2010
Reader 1: OMNIKEY CardMan 5×21 00 01
Card state: Card inserted,
ATR: 3B 8F 80 01 80 4F 0C A0 00 00 03 06 0A 00 16 00 00 00 00 74
ATR: 3B 8F 80 01 80 4F 0C A0 00 00 03 06 0A 00 16 00 00 00 00 74
+ TS = 3B –> Direct Convention
+ T0 = 8F, Y(1): 1000, K: 15 (historical bytes)
TD(1) = 80 –> Y(i+1) = 1000, Protocol T = 0
—–
TD(2) = 01 –> Y(i+1) = 0000, Protocol T = 1
—–
+ Historical bytes: 80 4F 0C A0 00 00 03 06 0A 00 16 00 00 00 00
Category indicator byte: 80 (compact TLV data object)
Tag: 4, len: F (initial access data)
Initial access data: 0C A0 00 00 03 06 0A 00 16 00 00 00 00
+ TCK = 74 (correct checksum)
Possibly identified card (using /usr/share/pcsc/smartcard_list.txt):
NONE
Your card is not present in the database.
You can get the latest version of the database from
http://ludovic.rousseau.free.fr/softwares/pcsc-tools/smartcard_list.txt
or use: wget http://ludovic.rousseau.free.fr/softwares/pcsc-tools/smartcard_list.txt –output-document=/home/xxx/.smartcard_list.txt
If your ATR is still not in the latest version then please send a mail
to <ludovic.rousseau@free.fr> containing:
– your ATR
– a card description (in english)
Tue May 18 09:06:21 2010
Reader 1: OMNIKEY CardMan 5×21 00 01
Card state: Card removed,
Scanning present readers…
0: OMNIKEY CardMan 5×21 00 01
無事タグのIDが読み込めたようです。
ただし、1つ警告が出ています。
指示に従い下記のコマンドを実行します。
wget http://ludovic.rousseau.free.fr/softwares/pcsc-tools/smartcard_list.txt –output-document=/home/xxx/.smartcard_list.txt
※/home/xxxは、自分の環境に合わせてください
もし、ユーザに関係なく反映させるなら、/usr/share/pcsc/smartcard_list.txtを上書きして下さい
これでpcscデーモンを再起動し、pcsc_scanを実行すると警告もなくなりました。
テストが終わったので、pcscデーモンを起動していたターミナルで、CTRL+Cキーを押して終了し、下記コマンドを実行してデーモンとして起動させます。
sudo /etc/init.d/pcscd start
この状態で、pcsc_scanを実行し、無事ICカードの読み取りができればOKです。