Download - nfcpy 0.10.0 でハマった話
続・ NFC おじさん
nfcpy 0.10.0 でハマった話
IoTLT Vol.6
山本 允葵
2015/08/19
自己紹介
• 山本 允葵 (Masaki Yamamoto)
• つまみ食いエンジニア
• デバイス好きのおっさん
• 気が付けばソニーまみれ• VAIO を Windows10 にしたいけど
失敗した! ( 瀕死 )
• Jsboard Shibuya やろうTwitter @m2wasabiGitHub https://github.com/m2wasabi
前回のあらすじ簡易認証ツールを作ったよ!デバイス: Felica リーダー S380 RaspberryPi ( カメラ付 )ソース: python +nfcpy Node.js +Milkcocoa
INTERMISSION前回 (IoTLT5) の懇親会にて
い○らしさん曰く、オム○ンの体温計とか NFC でデータやりとりしてるらしい
WellnessLink
よーし hack してやるぜー!
INTERMISSION
失敗しました…・ ServiceCode や通信内容が非公開・情報があまりにも少ない・ Android アプリのリバースエンジニアリング ⇒できるけど法的にアウト
足りないもの:情報公開 or Hack のお許し or 時間
助けて中の人ー
今回の内容
nfcpy のマイナーバージョンが変わりました https://launchpad.net/nfcpy
Suica の履歴を取得する辺りがゴッソリ変更されたので今までのコードが動かない場合があります。
そこで、 0.10.0 での変更点と対応方法についてご紹介します。
Nfcpy 0.10.0 での変更点・よく知られている NFC タグの判別、メソッドの刷新 ⇒ Suica を読んだ場合、 tag オブジェクトが nfc.tag.tt3.Type3Tag から nfc.tag.tt3_sony.FelicaStandard に変わっている 移行のためのドキュメントなどがない
・ NFC タグのパスワード認証に対応 ・ Type4B のタグに対応 ⇒運転免許証など 参考: Launchpad
https://launchpad.net/nfcpy/+announcement/13551
参考: hiro99ma sitehttps://sites.google.com/site/hiro99ma/nfc
Nfcpy 0.10.0 での変更点 ( 詳細 )旧メソッド
例: nfc.tag.tt3.Type3Tag
__init____str__pollreadwrite
新メソッド__init____str___format_is_presentauthenticatedumpdump_serviceformatpollingprotectread_from_ndef_serviceread_without_encryptionsend_cmd_recv_rspwrite_to_ndef_servicewrite_without_encryption
nfc.tag.tt3_sony.FelicaStandard 追加request_responserequest_servicerequest_system_codesearch_service_code
参考:http://nfcpy.readthedocs.org/en/latest/modules/tag.html
Nfcpy 0.10.0 での変更点 ( 詳細 )str nfc.tag.tt3.Type3Tag.read(int[] blockList, int serviceCode)以前のデータ取得メソッド
bytearray nfc.tag.tt3.Type3Tag.read_without_encryption( nfc.tag.tt3.ServiceCode[] blockList , nfc.tag.tt3.BlockCode[] serviceCode )
新しいデータ取得メソッドnfc.tag.tt3.ServiceCode( number, attribute ) number : 16bit の serviceCode の上位 10bit で、 service type attribute : 16bit の serviceCode の下位 6bit で、アクセス権限
nfc.tag.tt3.BlockCode( number, access=0, service=0 ) number : データブロックの番号 (suica なら 0 ~ 19) access : 3bit の access mode service : 4bit ServiceCode リストの index
nfcpy/nfc/tag/tt3.py70 行~ に定義
対応方法 ( アップしたくない人用 )
bzr branch lp:nfcpy/0.9
・インストール時に旧バージョンを指定する
以上!
対応方法 (0.10.0 に移行する場合 )Before
After
data = tag.read ([i],service_code) # data は str 型 print "" . join(['%02x ' % ord(s) for s in data])
sc = nfc.tag.tt3.ServiceCode(service_code >> 6 ,service_code & 0x3f) bc = nfc.tag.tt3.BlockCode(i,service=0) data = tag.read_without_encryption([sc],[bc]) # data は bytearray 型 print "" . join(['%02x ' % s for s in data])
ポイント:・従来のサービスコードから、上位 10bit, 下位 6bit で分離して ServiceCode を生成する・読出し用のメソッドは read_without_encryption・結果は bytearray 型で返る
対応方法 (0.10.0 に移行する場合 )
Before Afterimport nfc service code = 0x090fnum_blocks = 20 def connected(tag): if isinstance(tag, nfc.tag.tt3.Type3Tag): try: for i in range(num_blocks): sc = nfc.tag.tt3.ServiceCode(service_code >> 6 ,service_code & 0x1f) bc = nfc.tag.tt3.BlockCode(i,service=0) data = tag.read_without_encryption([sc],[bc]) # data は bytearray 型 print "" . join(['%02x ' % s for s in data]) except Exception as e: print "error: %s" % e else: print "error: tag isn't Type3Tag" # 接続開始clf = nfc.ContactlessFrontend('usb')clf.connect(rdwr={'on-connect': connected})
import nfc service code = 0x090fnum_blocks = 20 def connected(tag): if isinstance(tag, nfc.tag.tt3.Type3Tag): try: for i in range(num_blocks): data = tag.read ([i],service_code) # data は str 型 print "" . join(['%02x ' % ord(s) for s in data]) except Exception as e: print "error: %s" % e else: print "error: tag isn't Type3Tag" # 接続開始clf = nfc.ContactlessFrontend('usb')clf.connect(rdwr={'on-connect': connected})
Suica のデータを垂れ流すだけのコード
まとめ
nfcpy が 0.10.1 にアップしました
⇒ バージョンアップで嵌った・・・⇒ 得られた対策を共有しました!
以上、ご清聴ありがとうございました
0.10.0 用のサンプルコードは GitHub にあります。https://github.com/m2wasabi/nfcpy-suica-sample