Ruby にはダイナミックリンカへのインターフェースが用意されているのでこれを利用してみます。
DL::Importable を利用しヘッダファイルを参考にしながらライブラリ関数に対してラッパーメソッドを定義していきます。
pasori.rb
require 'dl/import' module Pasori extend DL::Importable dlload '/usr/local/lib/libpasori.dylib' typealias 'uint8', 'unsigned char' typealias 'uint16', 'unsigned int' #typealias 'uint16', 'unsigned short int' # libpasori.h extern 'pasori* pasori_open(char*)' extern 'void pasori_close(pasori*)' extern 'int pasori_send(pasori*,uint8*,uint8,int)' extern 'int pasori_recv(pasori*,uint8*,uint8,int)' POLLING_ANY = 0xffff POLLING_SUICA = 0x0003 POLLING_EDY = 0xfe00 SERVICE_SUICA = 0x090f SERVICE_EDY = 0x170f # libpasori_command.h extern 'int pasori_init(pasori*)' extern 'int pasori_write(pasori*,uint8,uint8)' extern 'int pasori_read(pasori*,uint8,uint8)' extern 'felica* felica_polling(pasori*,uint16,uint8,uint8)' extern 'int felica_read_without_encryption02(felica*,int,int,uint8,uint8*)' end
これで、libpasori で提供されている関数郡を Ruby から透過的に利用できるようになりました。
次に、lptest.c を参考に各値をパースして出力している部分を省略し、生データ(16バイト ビックエンディアン)で返す関数を書いてみます。
pasori.rb
続き
module Pasori class << self def felica_raw_values systemcode, servicecode, little_endian = false values = [] b = Array.new(4).to_ptr psr = pasori_open "" pasori_init psr flc = felica_polling psr, systemcode, 0, 0 i = 0 while felica_read_without_encryption02(flc, servicecode, 0, i, b) == 0 row = b.to_a('I') data = "" row.size.times do |j| if little_endian 4.times { |k| data += sprintf "%02x", (row[j].to_i >> (8 * k)) & 0xff } else data += sprintf "%08x", row[j].to_i & 0xffffffff end end yield data if block_given? values << data i += 1 end pasori_close psr values end end end
これを利用し、データを表示するだけのプログラムを書いてみます。
dump_suica.rb
require 'pasori' Pasori.felica_raw_values Pasori::POLLING_SUICA, Pasori::SERVICE_SUICA, true do |data| puts data end
それでは、実際に PaSoRi に Suica / PASMO を置いてこのコードを実行してみましょう。
% ruby dump_suica.rb 160100020e98e376e37d2e2200008000 1d0100020e98f102f104a62200007e00 160100020e98c502f102502300007c00 160100020e98f102c5025e2400007a00 160100020e98e37de5326c2500007800 160100020e97e355e37d2a2600007600 160100020e97e43ee3552a2600007400 160100020e97e355e43ee82600007200 160100020e97e37de37a062700007000 160100020e9625020102a62700006e00 160100020e9501022502462800006c00 160100020e95e37de37ae62800006a00 1b023f000e9500000000862900006800 160100020e95e532e37d760200006700 160100020e94e37de532340300006500 160100020e93e376e37df20300006300 1d0100020e93f102f1046a0400006100 160100020e93d204e532140500005f00 160100020e92e001e0074a0600005d00 160100020e92e532e534e00600005b00
最新20履歴のデータが表示されました。
次回は、これを人間が見ても分かる表示にしていきましょう。
2 comments:
replica bags ebay replica bags aaa quality replica bags
voir cette page https://www .dolabuy.co répertoire dolabuy.co redirigé ici meilleures répliques de sacs de créateurs
Post a Comment