経緯
非接触ICカードリーダーを使って、そのカードの中の数値でいろいろできないか試したくて、
今回勉強しました。
ドライバーをインストール
はじめに以下のドライバーをダウンロードして、
https://www.sony.co.jp/Products/felica/consumer/support/download/nfcportsoftware.html
exeファイルをインストールしてください。
Windows APIを使う
次に、コードを書きます。モジュール1にコピペしてください。
'' Windows標準APIを使用するための宣言。エラーが発生した場合は"ERROR:"で始まるメッセージを返し、
'' 正常に読み込みができた場合はUIDを返す。カードリーダはSONY RC-S380のみが動作確認済み。
'' TypeBのカードは乱数値(PUPI)を返すため、このコードでは実用的ではない。
Public Function readUID() As String
'' readUIDという名前のPublic関数を定義。戻り値の型はString。
Const SCARD_SCOPE_USER As Integer = 0
'' SCARD_SCOPE_USERという定数を宣言し、0で初期化。この定数はスマートカードのスコープ定義に使用される。
Dim ret As LongPtr
Dim pcchReaders As Long
Dim mszReaders As String
Dim readerArray() As String
'' 必要な変数を宣言。
'' ret: API関数の戻り値を保持
'' pcchReaders: カードリーダのリスト長を保持
'' mszReaders: カードリーダのリストを保持
'' readerArray: カードリーダの名前を保持する文字列配列
ret = SCardEstablishContext(SCARD_SCOPE_USER, 0, 0, hContext)
'' スマートカードリソースマネージャの新しいコンテキストを確立。
If ret <> 0 Then
readUID = "ERROR:初期化処理に失敗しました!"
Exit Function
End If
'' 初期化が正常に行われなかった場合、エラーメッセージを返して関数を終了。
pcchReaders = 256
'' カードリーダのリスト長を256に設定。
If readerState.szReader = "" Then
'' 現在のリーダーの状態が未設定の場合、以下の処理を実行。
ret = SCardListReaders(hContext, vbNullString, mszReaders, pcchReaders)
'' カードリーダのリストを取得。
If ret <> 0 Then
readUID = "ERROR:カードリーダが見つかりません!"
Exit Function
End If
'' カードリーダのリスト取得が失敗した場合、エラーメッセージを返して関数を終了。
mszReaders = String$(pcchReaders, vbNullChar)
'' カードリーダのリストを初期化。
ret = SCardListReaders(hContext, vbNullString, mszReaders, pcchReaders)
'' カードリーダのリストを取得。
If ret <> 0 Then
readUID = "ERROR:カードリーダが見つかりません!"
Exit Function
End If
'' カードリーダのリスト取得が失敗した場合、エラーメッセージを返して関数を終了。
readerArray = Split(mszReaders, vbNullChar)
'' カードリーダのリストを配列に変換。
readerState.dwCurrentState = 0
readerState.szReader = readerArray(0)
'' カードリーダの状態を設定。
End If
Dim hCard As LongPtr
Dim activeProtocol As Long
'' カードとプロトコルの変数を宣言。
ret = SCardConnectA(hContext, readerState.szReader, SCARD_SHARE_SHARED, SCARD_PROTOCOL_T1, hCard, activeProtocol)
'' スマートカードリソースマネージャに接続。
If ret <> 0 Then
readUID = "ERROR:正しいカードをセットしてください!"
Exit Function
End If
'' 接続が失敗した場合、エラーメッセージを返して関数を終了。
Dim sendBuffer(4) As Byte
Dim recvBuffer(255) As Byte
Dim recvLen As Long
Dim ioSendReq As SCARD_IO_REQUEST
Dim ioRecvReq As SCARD_IO_REQUEST
'' 必要な変数を宣言。送信と受信用のバッファ、受信長、送受信リクエストオブジェクト。
ioSendReq.dwProtocol = activeProtocol
ioSendReq.cbPciLength = Len(ioSendReq)
ioRecvReq.dwProtocol = activeProtocol
ioRecvReq.cbPciLength = Len(ioSendReq)
'' 送受信リクエストオブジェクトを設定。
sendBuffer(0) = &HFF
sendBuffer(1) = &HCA
sendBuffer(2) = &H0
sendBuffer(3) = &H0
sendBuffer(4) = &H0
'' 送信バッファにデータを設定。
recvLen = 255
ret = SCardTransmit(hCard, ioSendReq, sendBuffer(0), 5, ioRecvReq, recvBuffer(0), recvLen)
'' スマートカードとの通信を行い、結果を受信バッファに格納。
If ret <> 0 Then
readUID = "ERROR:ID取得エラー(Transmit:" & Hex(ret) & ")"
GoTo ExitProc
End If
'' 通信が失敗した場合、エラーメッセージを返してExitProcラベルへジャンプ。
If recvBuffer(recvLen - 2) <> &H90 Then
readUID = "ERROR:ID取得エラー(読込異常:" & Hex(recvBuffer(0)) & "," & Hex(recvBuffer(1)) & ")"
GoTo ExitProc
End If
'' 受信データが正常でない場合、エラーメッセージを返してExitProcラベルへジャンプ。
ExitProc:
'' ExitProcラベル。
ret = SCardDisconnect(hCard, SCARD_LEAVE_CARD)
'' スマートカードリソースマネージャから切断。
If ret <> 0 Then
MsgBox ("ERROR:切断エラー " + Hex(ret))
Exit Function
End If
'' 切断が失敗した場合、エラーメッセージを表示して関数を終了。
Dim cardData As String
Dim i As Long
cardData = ""
For i = 0 To 8
If Chr(recvBuffer(i)) <> Space(1) Then
cardData = cardData & Hex(recvBuffer(i))
End If
Next
'' 受信バッファからデータを取得し、文字列に変換。
readUID = cardData
'' 関数の戻り値にデータを設定。
End Function
'' 関数の終わり。
これは、
- API宣言: これらはWindowsのWinscard.dllライブラリに対するAPI呼び出しを宣言しています。これにより、カードリーダーへの接続、切断、カード情報の取得などの機能を利用することができます。
- readUID関数: これは実際のカード読み取りロジックを含む主要な関数です。ここでは、カードリーダーへの接続、カード情報の送受信、エラーチェック、そしてカードから読み取ったUIDの出力を行っています。
- エラーハンドリング: 各ステップでエラーチェックを行い、エラーメッセージを出力しています。
ということをしています。
実行マクロを作る
次にモジュール2を作って、以下のコードをコピペしてください。
Public Sub ExecuteReadUID()
Dim result As String
result = readUID()
MsgBox result
End Sub
という感じです。
あとは、Excelの”挿入”からボタンとか作って、↑のコードをマクロ登録して、端末にICカードをかざして、ボタンを押すとカードの中の数値が出力されると思います。
参考になれば、幸いです。
ここまで読んでいただきありがとうございました。
スクールの紹介
最後に宣伝をさせてください。
技術で未来を切り拓く―あなたの夢を現実にするプログラミングスクール
Webデザインやプログラミングで成功を目指している方々にとって、このオンラインスクールは夢を叶えるための最適な場所です。皆さんのキャリアを次の段階へと引き上げるためにデザインされたこのスクールは、一人ひとりの成功を心から願い、それを実現するための全てを提供しています。ここでは、このスクールの魅力について詳しくご紹介します。
◆圧倒的な費用対効果
このオンラインプログラミングスクールは、Web系教育において最高の費用対効果を提供しています。多くの高額スクールが存在する中で、ここではリーズナブルな価格で、質の高い教材、無限のサポート、そして実際に市場で求められるスキルの習得機会を提供しています。
◆現役フリーランスの講師陣
講師たちは全員、現役のフリーランスプロフェッショナルです。市場で活躍している講師から直接、最新のトレンドや実践的なスキルを学べるのは、このスクールの大きな特徴です。
◆柔軟な学習コース
固定のコースがなく、学習者の興味やニーズに応じて自由に学習できます。進路変更も自由で、最低契約期間は1ヶ月という柔軟性を持っています。自分のペースで、自分に合った学習が可能です。
◆無制限の添削とサポート
理解できるまで、そして満足するまで、無制限に添削と質問への回答を提供しています。進路相談や技術面以外の相談にも対応しており、全面的にサポートします。
◆社長から学べる貴重な機会
デザイナー、プログラマー、ディレクター、マーケターとして豊富な経験を持つ社長から直接学べるのも、このスクールの特別な点です。他のスクールでは得られない、貴重な機会です。
◆実績作りへの徹底的なサポート
就職、転職、フリーランスとして成功するためには、高品質な実績が必要です。生徒の作品レベルを最大限に高め、市場で求められる実績を作り上げることに力を入れています。案件を取得できない生徒には、直接案件を提供することもあります。
◆メッセージからの約束
高額な授業料を支払わせて結果を出せないスクールとは違い、物理的なサポートは提供できないかもしれませんが、継続的な努力を通じて最高の結果を出せるようにサポートします。一緒に不正なスクールを撲滅し、あなたの夢を実現しましょう。
このプログラミングスクールは、Webデザインやプログラミングでの成功を目指す方々に必要な全てを備えています。今こそ、このコミュニティに参加し、あなたのキャリアを加速させる時です。
詳しくはこちら↓