SM130 Mifare moduleには、ソフトウェアレベルで制御するためのOCXファイルが付属している。
OCXはActiveXコントロールの前身のようなものだが、ここではVisualBasicと共にLIBファイルのように扱う。
SM130に付属しているSMX10.OCXは、開発環境内でインポートすることでActiveXのAPIライブラリのように振舞う。
このSMX10.OCXファイルはVisual StudioやDelphi環境など、ActiveXをサポートしている開発環境で利用することができる。

この項では、ライブラリ資料がVBしか存在しないことと、インポートが簡単なことから、VB.NETを元に説明を行う。
また、VBの文法や構文などについての説明は含んでいない。
しかし、VB6.0から.NETに移る際にオブジェクト指向的に大幅な仕様改変が行われたので、JavaやC++を知っているのであれば十分理解はできると思われる。


OCXファイルの読み込み

プログラムの最初に、SMX10.OCXに定義されているクラスファイルを読み込む。
注意すべきなのは、例えば .h ファイルを読み込むように、ファイル名をそのまま書くのではないこと。
下記の文をプログラムの文頭に書けば、SMifareXというクラスが使えるようになる。
このクラス内部には、SM130モジュールを制御するためのメソッドが実装されている。
SM130にコマンドを送るには、このクラスからメソッドを呼び出すことで実現する。


Imports Sonmicro_Mifare_v10



ポートのオープン

SM130モジュールはEvaluation Kitに装着することでRS-232を通じてPCと通信が行える。
Mifareプロトコルでタグと通信を行う前に、このEvaluation KitとPCを接続しているポートを開く必要がある。
Windows APIを使うのであれば少々の手順を踏む必要があるが、ここではボーレートとポート番号を設定すればよい。
ボーレート値は、9600bps、19200bps、38400bps、57600bps、115200bpsのいずれかを用いる。
出荷状態では19200bpsに設定されている。
ポート番号は、通常のシリアルを用いているのであればCOM1が該当すると思われる。
USB-Serial変換機を介して接続している場合は、Windowsのコントロールパネルから該当するものを指定する。(COMx)

もしボーレート値が分らなくなった場合は、サンプルプログラムのSMRFID MIFARE 1_0.exeを使って、通信できるボーレートを探せばよい。

ポートを開くには、SMifareX.CMD_OpenPort()メソッドを用いる。


Dim portName As String = "19200"
Dim baudRate As String = "COM1"
Dim Mifare AS SMifareX = New SMifareX()
Mifare.CMD_OpenPort( portName, baudRate )



タグの選択

ポートを開いたら、SM130モジュールのアンテナから通信可能距離内に存在するタグを検索する。
これはFeliCaでいうポーリングにあたる。

タグを検索するには、SMifareX.CMD_SeekTag()を用いる。



'Dim Mifare As SMifareX = New SMifareX()
Dim serial As String
If Mifare.CMD_SeekTag() <> 0 Then
	Console.WriteLine("seek error")
End If



認証とリード・ライト

タグを見つけた後に、いよいよ認証とデータの読み込み・書き換えを行う。
MifareがFeliCaと決定的に違うことは、タグとデータのやり取りを行う際に、各ブロックごとに認証を行う点である。
つまり、1つのブロックと通信するのにあたって、認証を必ず行わなくてはいけない。
もし複数のブロックと通信したい場合は、認証してからそれぞれのブロックとデータのやり取りを行う。

SMifareXクラスの認証用メソッドは、認証鍵と鍵の種類、そして認証対象となるブロックの番号を構造体で引数にとる。
ブロックの中身を読み取るメソッドは、対象となるブロックの番号と、読み取ったデータを受け取るための構造体と文字列を引数にとる。
ブロックの中身を書き換えるメソッドは、対象となるブロックの番号と、書き込むデータ内容を格納した構造体を引数にとる。

認証にはSMifareX.CMD_Authenticate()メソッドを、
データの読み取りにはSMifareX.CMD_ReadBlock()メソッドを、
データの書き込みにはSMifareX.CMD_WriteBlock()メソッドをそれぞれ用いる。
16バイト以上のデータをやり取りする場合には、下記のソースコードをループで囲い、ブロック番号を変更しながら繰り返せばよい。


'Dim Mifare As SMifareX = New SMifareX()

' authentication
Dim auth As TS_Auth = New TS_Auth()
auth.Keys = New TS_Keys()
auth.Keys.Key = New Byte() {&HD3, &HF7, &HD3, &HF7, &HD3, &HF7} ' key of NDEF
Dim blockNo As Byte = 3
auth.Source = ES_Auth_Type.Provided_Key
auth.Key_Type = ES_Key_Type.Type_A
error_code = Mifare.CMD_Authenticate(blockNo, auth)
If error_code <> 0 Then
	Console.WriteLine("authentication error")
End If

' write
Dim writeData As TS_Mifare_Block
Dim i As Byte
For i=0 to 15
	writeData.Bytes(i) = i
Next i
error_code = Mifare.CMD_WriteBlock( blockNo, writeData )
If error_code <> 0 Then
	Console.WriteLine("write error")
End If

' read
Dim readData AS TS_Mifare_Block
Dim readStr As String = "" ' read block as string
error_code = Mifare.CMD_ReadBlock( blockNo, readData, readStr )
If error_code <> 0 Then
	Console.WriteLine("read error")
End If



ポートのクローズ

タグとの通信が終了した後に、プログラムの後始末としてポートを閉じる。

ポートを閉じるには、SMifareX.CMD_ClosePort()メソッドを用いる。


Mifare.CMD_ClosePort()



その他のコマンド

SM130と通信する際のボーレート(UARTのボーレート)が合致していないと、SM130は一切のコマンドを受け付けない。
PCからの信号を正しい信号として読み取れないからだ。
このボーレートを変更するには、SMifareX.CMD_SetDeviceBaudRate()メソッドを用いる。
しかし当然だが、このメソッドを使用する際にもボーレートが正しくなければ動かない。
もし現在のボーレートが分らなくなったら、総当たりで通信可能なボーレートを探すことになる。



' set to 19200bps
Mufare.CMD_SetDeviceBaudRate( 19200 )



現在SM130が処理している命令を停止したい時には、SMifareX.CMD_Halt()メソッドを用いる。
たとえば、プログラム内部でMifare通信を行おうとする際にこのメソッドを使っておけば、実行中の処理と被ることなく通信を始めることができる。


Mifare.CMD_Halt()