0

Nexus SのNFCでFelicaのIDを読む(2)

Nexus SのNFCでFelicaのIDを読む – 橋本詳解の時に、Android 2.3 GingerBread NFCをやってみる – TOPGATE Google関連技術サイトのTagWrapper.javaを使わせてもらってたんだけど先日のNexus Sのandroid2.3.4へのアップデートで動かなくなったので少しやり方変えた。
TagWrapper.javaの中でやってる事を参考にさせてもらった。


ただFelicaのユニークなIDだけが必要だったらこれでいい
(先に橋本詳解の方に書いたManifestとかguavaとかを設定しておく必要はある)

import java.lang.reflect.*;
import java.util.*;

import com.google.common.primitives.UnsignedBytes;

import android.app.Activity;
import android.content.Intent;
import android.nfc.NfcAdapter;
import android.os.Bundle;
import android.os.Parcelable;
import android.util.*;
たくさんのimportが必要。


    public void onCreate(Bundle savedInstanceState) {        
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
resolveIntent(this.getIntent());
}

void resolveIntent(Intent intent) {
if (NfcAdapter.ACTION_TAG_DISCOVERED.equals(intent.getAction())) {
try{
Parcelable tag = intent.getParcelableExtra("android.nfc.extra.TAG");
Field f = tag.getClass().getDeclaredField("mId");
f.setAccessible(true);
byte[] mId = (byte[]) f.get(tag);
StringBuilder sb = new StringBuilder();
for (byte id : mId) {
String hexString = Integer.toHexString(UnsignedBytes.toInt(id));
if (hexString.length() == 1) sb.append("0");
sb.append(hexString);
}
String id = sb.toString();
Log.v("TAG", id);
}
catch(Exception e){
e.printStackTrace();
}
}
}

4

C# – FeliCaリーダでIDを読む

felicalibとC#用ラッパーを使ってFelicaのIDを読んだ。
参考:felicalib C#での利用方法

Reading felica ID
MNPして使わなくなった(財布機能1回も使ってない)auのお財布ケータイW51Sを乗せたところ。

普段使ってるSuicaを読むと違うIDが出てきた。


■作ったもの
080811_Felica.zip (VisualStudio2008 / C#3.0)
.NET Framework3.5が必要


■準備
RC-S320を使った。付属のCDからドライバだけインストールしておく。

SONY RC-S320 非接触ICカードリーダ/ライタ PaSoRi 「パソリ」
ソニー
売り上げランキング: 99
おすすめ度の平均: 4.5
4 あれば便利かもしれないが、無くても困らない製品
5 便利アイテムです
5 便利です。
5 飛行機に乗れなくてもマイルが貯まる
4 edyを常用してる人ならお勧め


felicalibをダウンロードしてくる。中にC#用ラッパー(FelicaLib.cs)も入っているので自分のプロジェクトに追加。
felicalib.dllは「参照の追加」から使うのではなく、bin/Debug, bin/Releaseなどにファイルを直接コピペして置く。実行時にFelicaLib.csからP/Invokeで読み込まれる。

■コード
ラッパーを読み込んで

using FelicaLib;


IDmを読むとbyte配列が来るので、Stringに直す。

try
{
  using (Felica felica = new Felica())
  {
    felica.Polling(0xFFFF);
    byte[] data = felica.IDm();
    String id = "";
    for (int i = 0; i < data.Length; i++)
    {
      id += data[i].ToString("X2");
    }
    Console.WriteLine(id); // ID出力
  }
}
catch (Exception ex)
{
  Console.Error.WriteLine(ex.Message);
}