学生番号の読み取りって簡単なのか?
PaSoRiが届いた。さっそくテスト開始!
エクセルに学生番号が溜まる方法を探す。MANICAエクセルツールを試すがうまくいかない。・・・と思い込んでいた。インストール後にデスクトップにできるショートカットからExcelを起動する必要があった。マニュアルにも載っていない落とし穴。
FeliCaのデータを読み出す (FeliCa Raw Viewer for Windows)
動いたけど、学生証が手元にない。しまった。
さてさて、最終形はRailsで読み取れると嬉しいのでRubyを使ってPaSoRi経由でSuicaの乗車履歴を取得し、GoogleMapsやGoogleEarthで表示するを読んでみる。
どこもかしこもC#が必要ってことで、C/C++までの経験だけどVisual Studio 2010 Expressを導入してみる。ちょっと大げさになってきた。
ためす
はじめてのFeliCa(3)を参照する。
しかし素人なので特訓が必要です。
- Visual Studio 2010 Expressを導入する
- チュートリアルを幾つかためす
- felicalibをDLする
実践する
- VC2010を起動
- 新しいプロジェクト>Windowsフォームアプリケーション>testFelica01と命名
- フォーム(Form1.cs)を開く
- ツールボックス>コモンコントロール>TextBoxを4つ作る
- ツールボックス>コモンコントロール>ラベルを4つ作る(idm,pmm,gkuseki_n,gakuseki)
- ツールボックス>コンポーネント>Buttonを1つ作る
- プロジェクト>既定の項目の追加>「\\felicalib-0.4.2\src\CSharp\FelicaLib.cs」を追加(ソリューションエクスプローラーで確認する)
- 「\\felicalib-0.4.2\felicalib.dll」をexeが作成される場所にコピーしておく
ちょっと時間が掛かった、つづき
検証に掛かった。
//Form1.csだよーん using System; using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using FelicaLib; namespace testFelica01 { public partial class Form1 : Form { private string idm = null; private string pmm = null; private bool loading = false; private string gakuseki = null; private string tmpGakuseki = null; private string rtnGakuseki = null; public Form1() { InitializeComponent(); } /** * バイナリ配列を文字列に変換する */ private string BytesToHexString(byte[] bytes) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < bytes.Length; i++) { sb.Append(bytes[i].ToString("X2")); } return sb.ToString(); } private void button1_Click(object sender, EventArgs e) { Hashtable ht = new Hashtable(); ht["30"] = "0"; ht["31"] = "1"; ht["32"] = "2"; ht["33"] = "3"; ht["34"] = "4"; ht["35"] = "5"; ht["36"] = "6"; ht["37"] = "7"; ht["38"] = "8"; ht["39"] = "9"; ht["00"] = "N"; //検証用に作った try { using (Felica f = new Felica()) { // FeliCaポーリング開始 f.Polling((int)SystemCode.UnivCode); if (this.idm == null && this.pmm == null && this.gakuseki == null) { this.idm = BytesToHexString(f.IDm()); this.pmm = BytesToHexString(f.PMm()); //学籍番号アドレス tmpGakuseki = BytesToHexString(f.ReadWithoutEncryption(0x100B, 1)); //Suica利用履歴 検証用 //tmpGakuseki = BytesToHexString(f.Re0adWithoutEncryption(2319, 2)); //tmpGakuseki = BytesToHexString(f.ReadWithoutEncryption(0x090F, 2)); for (int i = 0; i < 20; i++) { string tmp = tmpGakuseki[i].ToString() + tmpGakuseki[i + 1].ToString(); rtnGakuseki += ht[tmp]; i++; } this.gakuseki = rtnGakuseki; } } if (!this.loading) { // GET開始 this.loading = true; this.textBox1.Text = this.idm; this.textBox2.Text = this.pmm; this.textBox3.Text = this.gakuseki; this.textBox4.Text = this.tmpGakuseki; } } catch (Exception) { } } } }
ポイント
- 「using System.Collections;」「using FelicaLib;」を追加
- Ascii変換できなくて、ハッシュテーブルを使う
- ポーリングするときに「Any」から「UnivCode」に変えておく
FelicaLib.csにも手を入れる
//FelicaLib.cs 一部分だけ namespace FelicaLib { // システムコード enum SystemCode : int { Any = 0xffff, // ANY Common = 0xfe00, // 共通領域 Cyberne = 0x0003, // サイバネ領域 Edy = 0xfe00, // Edy (=共通領域) Suica = 0x0003, // Suica (=サイバネ領域) UnivCode = 0x3333, //学籍番号が入っているところのシステムコード(値はテキトー) }
これで出来た。
学籍番号が入っているところのシステムコードってどこ?
FeliCaRawViewerってのを使いました。学籍番号の値をASCII変換して探してください。
JISX0408とは異なっていた。
いやー、なんとかなるもんだ。