[Go言語] Windows10でFelicaを読み込む

どうも武士は食わねど高楊枝、ざわです。

今日はWindows10でFelica読み込みのサンプル作りました。

使用するFelicaリーダー

定番のこれ

SONY-RC-S320

Goのインストール

** 注意 ** 32bit版をダウンロードします(felicalib.dllが32bitでしか動作しないので)
https://golang.org/dl/

Felicaのドライバダウンロード

現在では以下が最新となっておりました。

NFCポートソフトウェア(旧FeliCaポートソフトウェア)
(Version 5.6.0.2 / 約40MB / 2017.07.25)https://www.sony.co.jp/Products/felica/consumer/download/felicaportsoftware.htmlhtml

USBが認識されない?

インストール後USB接続したのですが、「不明なデバイス」と表示され認識されませんでした。
いくつか別のURBポートを試したところ認識するUSBポートが見つかりました

felicalib.dllのインストール

こちらからzipをダウンロードすると、中に入っています。

GOのソース

felicaのidmを取得するサンプルです。
コードは以下です。

package main

import (
    // Felica
    "log"
    "syscall"
    "unsafe"
)

func main() {
    println("処理開始")
    // DDLの読み込み
    var tPath = "felicalib.dll"
    dll, err := syscall.LoadDLL(tPath)
    if err != nil {
        log.Fatal(err)
    }
    defer dll.Release()

    // ここから準備
    pasori_open, err := dll.FindProc("pasori_open")
    if err != nil {
        log.Fatal(err)
    }
    pasori_close, err := dll.FindProc("pasori_close")
    if err != nil {
        log.Fatal(err)
    }
    pasori_init, err := dll.FindProc("pasori_init")
    if err != nil {
        log.Fatal(err)
    }
    felica_polling, err := dll.FindProc("felica_polling")
    if err != nil {
        log.Fatal(err)
    }
    felica_free, err := dll.FindProc("felica_free")
    if err != nil {
        log.Fatal(err)
    }
    felica_getidm, err := dll.FindProc("felica_getidm")
    if err != nil {
        log.Fatal(err)
    }

    tPasori, _, _ := pasori_open.Call(0)
    println("open", tPasori)
    if tPasori == uintptr(0) {
        log.Fatal("カードリーダが接続されていません。")
    }
    defer pasori_close.Call(tPasori)

    ret, _, _ := pasori_init.Call(tPasori)
    println("init", ret)
    if ret != 0 {
        log.Fatal("ドライバが正しく動作していない可能性があります。USBポートを切り替えたりしてみてください。")
    }

    // ここまで準備

    // ここからFelicaを認識するまで待機
    println("Felicaを認識するまで待機します")
    for {
        tFelica, _, _ := felica_polling.Call(tPasori, 0xFFFF, 0, 0)

        if tFelica > 0 {
            tIdm := uint64(1)
            felica_getidm.Call(tFelica, uintptr(unsafe.Pointer(&tIdm)))
            println("gIdm", tIdm)
            defer felica_free.Call(tFelica)
            break
        }
    }
}

felica_getidm.Call()でidmを取得してます。
これがドキュメントなのかな…?

構成

上記ソースをそのまま使う場合はgoファイルとfelicalib.dllを同じパスに配置してあげます

./
 ∟実行ファイル.go 
 ∟felicalib.dll

実行

以下のコマンドで実行します。

$ go run 実行ファイル.go

待機中になります!

ACTIVEのランプが光るんですねー

Suica置いてみた!

yes!!

おわり

ではまた!

サーバサイドエンジニア。オムライスが好物

シェアする

  • このエントリーをはてなブックマークに追加

フォローする