PaSoRiでSuicaのID読み込み

とりあえず、クライアントアプリ側でPaSoRi経由でSuicaを読み込み、
それをトリガーにサーバー側へリクエスト(固定値の緯度と軽度)を送信 ⇒ GoogleMaps表示まで作ってみました。
#カードの読み込みにはfelicalibC#ラッパーを使っています。
細かいところは割愛して、要点部分だけ以下にメモしておきます。


クライアントアプリ側はC#Windowsアプリです。


1. カードの読み込み(ポーリング)


using (Felica f = new Felica())
{
// FeliCaポーリング開始
f.Polling((int)SystemCode.Any);
byte[] idm = BytesToHexString(f.IDm());
byte[] pmm = BytesToHexString(f.PMm());
}


2. 読み取ったデータの変換
読み取ったデータ(idm="一意なID"とpmm="製造番号")はbyte配列のため、これを16進数大文字表記に変換します。

private string ToHexString(byte[] bytes)
{
StringBuilder sb = new StringBuilder();
foreach (byte readByte in bytes)
{
sb.Append(readByte.ToString("X2"));
}
return sb.ToString();
}
ここまでの処理をタイマーでぐるぐる回します。
ポーリング部分はアプリが動いている間ずっと回り続けてる感じなんですが…
ここの部分をもうちょっとうまいこと作りたかったです。


3. 次に読み取った値(※ここではIDmと固定値の緯度と軽度)をサーバーに投げます。
下記コード中のwebBrowserはWebBrowserコントロールです。
idoとkeidoはそれぞれGoogleMapsで表示したい位置です。(※適当な座標に置き換えてます)

Hashtable hash = new Hashtable();
hash["idm"] = idmStr;
hash["ido"] = 12.005750;
hash["keido"] = 159.754936;

string param = "";
foreach (string k in hash.Keys)
{
param += String.Format("{0}={1}&", k, hash[k]);
}
byte[] data = Encoding.UTF8.GetBytes(param);

webBrowser.Navigate("http://localhost:8080/felica/", "", data, "Content-Type: application/x-www-form-urlencoded\r\n");

だいぶ端折っていますが、クライアント側はこんな感じですね。


次にサーバー側です。
こっちはムダにJava。しかも久しぶりに素のServlet+JSPとかで書いてみました。
#最近フレームワークを使うのに慣れすぎてて、RequestDispatcherとか存在を忘れかけてました。。残念賞。
本当はサーバー側で色々処理してますけど、その辺は割愛。


4. クライアント側からの送信を受信し、JSPにディスパッチ。

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

req.setCharacterEncoding("UTF-8");
String idm = req.getParameter("idm");
String ido = req.getParameter("ido");
String keido = req.getParameter("keido");

// 色々省略

req.setAttribute("ido", ido);
req.setAttribute("keido", keido);

RequestDispatcher dispatcher = req.getRequestDispatcher("/WEB-INF/jsp/map.jsp");
dispatcher.forward(req, resp);
}

まー特筆する点はありませんね。リクエスト受けとってJSPフォワードしてるだけです。


5. 最後にGoogleMaps用のスクリプトが書かれたHTML(JSP)をクライアントに返却。
その際、表示位置の緯度と軽度を渡します。

<%@ page contentType="text/html;charset=UTF-8" %>



Test Maps

<script type="text/javascript">
function load() {
if (GBrowserIsCompatible()) {
var map = new GMap2(document.getElementById("map"));
var point = new GLatLng(<%=request.getAttribute("ido")%>, <%=request.getAttribute("keido")%>);
map.setCenter(point, 17);
map.addControl(new GLargeMapControl());
map.addControl(new GMapTypeControl());

var marker = new GMarker(point);
var offset = new GSize(0, 0);
map.addOverlay(marker);
}
}


<div id="map" style="width:500px; height:400px; border-style:solid"></div>

こんな感じで、クライアントアプリのWebBrowserコントロールに最初のアプリから固定値で渡した緯度、軽度の地図を表示。


意外と簡単にできたのが驚きでした。
それにしても、felicalibを作られた方は本当凄いですね。。尊敬します。