学生番号の読み取りって簡単なのか?

PaSoRiが届いた。さっそくテスト開始!

エクセルに学生番号が溜まる方法を探す。MANICAエクセルツールを試すがうまくいかない。・・・と思い込んでいた。インストール後にデスクトップにできるショートカットからExcelを起動する必要があった。マニュアルにも載っていない落とし穴。 
 
FeliCaのデータを読み出す (FeliCa Raw Viewer for Windows)
動いたけど、学生証が手元にない。しまった。
 
さてさて、最終形はRailsで読み取れると嬉しいのでRubyを使ってPaSoRi経由でSuicaの乗車履歴を取得し、GoogleMapsやGoogleEarthで表示するを読んでみる。
どこもかしこもC#が必要ってことで、C/C++までの経験だけどVisual Studio 2010 Expressを導入してみる。ちょっと大げさになってきた。
 

ためす

はじめてのFeliCa(3)を参照する。
しかし素人なので特訓が必要です。

 

実践する

ちょっと時間が掛かった、つづき

検証に掛かった。

//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とは異なっていた。
いやー、なんとかなるもんだ。