private void SCardListReaders() { uint pcchReaders = 0; // NFCリーダの文字列バッファのサイズを取得 uint ret = NfcApi.SCardListReaders(hContext, null, null, ref pcchReaders); if (ret != NfcConstant.SCARD_S_SUCCESS) { // 検出失敗 throw new ApplicationException("NFCリーダを確認できません。"); } // NFCリーダの文字列を取得 byte[] mszReaders = new byte[pcchReaders * 2]; // 1文字2byte ret = NfcApi.SCardListReaders(hContext, null, mszReaders, ref pcchReaders); if (ret != NfcConstant.SCARD_S_SUCCESS) { // 検出失敗 throw new ApplicationException("NFCリーダの取得に失敗しました。"); } UnicodeEncoding unicodeEncoding = new UnicodeEncoding(); string readerNameMultiString = unicodeEncoding.GetString(mszReaders); // 認識したNDCリーダの最初の1台を使用 int nullindex = readerNameMultiString.IndexOf((char)0); readerName = readerNameMultiString.Substring(0, nullindex); }
private void SCardTransmit() { uint maxRecvDataLen = 256; var recvBuffer = new byte[maxRecvDataLen + 2]; var sendBuffer = new byte[] { 0xff, 0xca, 0x00, 0x00, 0x00 }; // ← IDmを取得するコマンド NfcApi.SCARD_IO_REQUEST ioRecv = new NfcApi.SCARD_IO_REQUEST(); ioRecv.cbPciLength = 255; int pcbRecvLength = recvBuffer.Length; int cbSendLength = sendBuffer.Length; IntPtr handle = NfcApi.LoadLibrary("Winscard.dll"); IntPtr pci = NfcApi.GetProcAddress(handle, "g_rgSCardT1Pci"); NfcApi.FreeLibrary(handle); uint ret = NfcApi.SCardTransmit(hCard, pci, sendBuffer, cbSendLength, ioRecv, recvBuffer, ref pcbRecvLength); if (ret != NfcConstant.SCARD_S_SUCCESS) { throw new ApplicationException("NFCカードへの送信に失敗しました。code = " + ret); } // 受信データからIDmを抽出する // recvBuffer = IDm + SW1 + SW2 (SW = StatusWord) // SW1 = 0x90 (144) SW1 = 0x00 (0) で正常だが、ここでは見ていない cardId = BitConverter.ToString(recvBuffer, 0, pcbRecvLength - 2); }
private uint SCardEstablishContext() { uint ret = NfcApi.SCardEstablishContext(NfcConstant.SCARD_SCOPE_USER, IntPtr.Zero, IntPtr.Zero, out hContext); if (ret != NfcConstant.SCARD_S_SUCCESS) { string message; switch (ret) { case NfcConstant.SCARD_E_NO_SERVICE: message = "サービスが起動されていません。"; break; default: message = "サービスに接続できません。code = " + ret; break; } throw new ApplicationException(message); } if (hContext == IntPtr.Zero) { throw new ApplicationException("コンテキストの取得に失敗しました。"); } return(ret); }
private void SCardStatus() { int dwReaderLen = readerName.Length; int dwState = 0; byte[] byAtr = new byte[64]; //ATR int dwAtrLen = byAtr.Length; long lResult = NfcApi.SCardStatus(hCard, null, ref dwReaderLen, ref dwState, ref activeProtocol, byAtr, ref dwAtrLen); if (lResult != NfcConstant.SCARD_S_SUCCESS) { throw new ApplicationException(""); } lResult = NfcApi.SCardStatus(hCard, readerName, ref dwReaderLen, ref dwState, ref activeProtocol, byAtr, ref dwAtrLen); if (lResult != NfcConstant.SCARD_S_SUCCESS) { throw new ApplicationException(""); } // FeliCaかどうか if ((byAtr[13] != 0x00 || byAtr[14] != 0x3b) && DetectOnlyFeliCa) { throw new ApplicationException("FeliCaではありません。"); } }
private IntPtr getPciT1() { IntPtr handle = NfcApi.LoadLibrary("Winscard.dll"); IntPtr pci = NfcApi.GetProcAddress(handle, "g_rgSCardT1Pci"); NfcApi.FreeLibrary(handle); return(pci); }
void disconnect(IntPtr hCard) { uint ret = NfcApi.SCardDisconnect(hCard, NfcConstant.SCARD_LEAVE_CARD); if (ret != NfcConstant.SCARD_S_SUCCESS) { throw new ApplicationException("カードとの接続を切断できません。code = " + ret); } }
private void SCardDisconnect() { uint ret = NfcApi.SCardDisconnect(hCard, NfcConstant.SCARD_LEAVE_CARD); if (ret != NfcConstant.SCARD_S_SUCCESS) { throw new ApplicationException("NFCカードとの切断に失敗しました。code = " + ret); } }
int control(IntPtr hCard, int controlCode, byte[] sendBuffer, byte[] recvBuffer) { int bytesReturned = 0; uint ret = NfcApi.SCardControl(hCard, controlCode, sendBuffer, sendBuffer.Length, recvBuffer, recvBuffer.Length, ref bytesReturned); if (ret != NfcConstant.SCARD_S_SUCCESS) { throw new ApplicationException("カードへの制御命令送信に失敗しました。code = " + ret); } return(bytesReturned); }
private void Form1_FormClosed(object sender, FormClosedEventArgs e) { frm = null; if (_is_connect) { NfcApi.SCardReleaseContext(_hContext); } server.Stop(); }
private void SCardConnect() { activeProtocol = IntPtr.Zero; hCard = IntPtr.Zero; uint ret = NfcApi.SCardConnect(hContext, readerName, NfcConstant.SCARD_SHARE_SHARED, NfcConstant.SCARD_PROTOCOL_T1, ref hCard, ref activeProtocol); if (ret != NfcConstant.SCARD_S_SUCCESS) { throw new ApplicationException("カードに接続できません。code = " + ret); } }
IntPtr connect(IntPtr hContext, string readerName) { IntPtr hCard = IntPtr.Zero; IntPtr activeProtocol = IntPtr.Zero; uint ret = NfcApi.SCardConnect(hContext, readerName, NfcConstant.SCARD_SHARE_SHARED, NfcConstant.SCARD_PROTOCOL_T1, ref hCard, ref activeProtocol); if (ret != NfcConstant.SCARD_S_SUCCESS) { throw new ApplicationException("カードに接続できません。code = " + ret); } return(hCard); }
private void SCardReleaseContext() { if (hContext == IntPtr.Zero) { throw new ApplicationException("コンテキストの取得に失敗しました。"); } uint ret = NfcApi.SCardReleaseContext(hContext); if (ret != NfcConstant.SCARD_S_SUCCESS) { throw new ApplicationException("カードリーダーとの切断に失敗しました。code = " + ret); } }
private void Timer1_Tick(object sender, EventArgs e) { timer1.Stop(); try { _readerStateArray[0].dwCurrentState = NfcConstant.SCARD_STATE_UNAWARE; _readerStateArray[0].szReader = _readername; uint ret = NfcApi.SCardGetStatusChange(_hContext, 100 /*msec*/, _readerStateArray, _readerStateArray.Length); if (ret != NfcConstant.SCARD_S_SUCCESS) { throw new ApplicationException("リーダーの初期状態の取得に失敗。code = " + ret); } var state_is_present = _readerStateArray[0].dwEventState & NfcConstant.SCARD_STATE_PRESENT; if (_prev_state_is_present != state_is_present && state_is_present == NfcConstant.SCARD_STATE_PRESENT) { IntPtr hCard = connect(_hContext, _readername); string readerSerialNumber = readReaderSerialNumber(hCard); string cardId = readCardId(hCard); notify_detect_to_sessions(readerSerialNumber, cardId); disconnect(hCard); } var state_is_empty = _readerStateArray[0].dwEventState & NfcConstant.SCARD_STATE_EMPTY; if (_prev_state_is_empty != state_is_empty && state_is_empty == NfcConstant.SCARD_STATE_EMPTY) { notify_lost_to_sessions(); } _prev_state_is_present = state_is_present; _prev_state_is_empty = state_is_empty; } catch (ApplicationException ex) { frm.add_log( DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"), ex.Message ); } timer1.Start(); }
int transmit(IntPtr hCard, byte[] sendBuffer, byte[] recvBuffer) { NfcApi.SCARD_IO_REQUEST ioRecv = new NfcApi.SCARD_IO_REQUEST(); ioRecv.cbPciLength = 255; int pcbRecvLength = recvBuffer.Length; int cbSendLength = sendBuffer.Length; IntPtr SCARD_PCI_T1 = getPciT1(); uint ret = NfcApi.SCardTransmit(hCard, SCARD_PCI_T1, sendBuffer, cbSendLength, ioRecv, recvBuffer, ref pcbRecvLength); if (ret != NfcConstant.SCARD_S_SUCCESS) { throw new ApplicationException("カードへの送信に失敗しました。code = " + ret); } return(pcbRecvLength); // 受信したバイト数(recvBufferに受け取ったバイト数) }
private void Form1_Load(object sender, EventArgs e) { frm = this; try { var server_config = new SuperSocket.SocketBase.Config.ServerConfig() { Port = 80, Ip = "127.0.0.1", MaxConnectionNumber = 100, Mode = SuperSocket.SocketBase.SocketMode.Tcp, Name = "SuperSocket.WebSocket Sample Server", MaxRequestLength = 1024 * 1024 * 10 }; setup_server(ref server, server_config); var result = NfcApi.SCardEstablishContext( NfcConstant.SCARD_SCOPE_USER, IntPtr.Zero, IntPtr.Zero, out _hContext ); if (result != 0) { if (result == NfcConstant.SCARD_E_NO_SERVICE) { frm.add_log(DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"), "Smart Card Servise is not Started."); } else { frm.add_log(DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"), string.Format("SCardEstablishContext Error.\nErrorCode.{0:X}\n", result)); } } else { _is_connect = true; try { uint pcchReaders = 0; result = NfcApi.SCardListReaders(_hContext, null, null, ref pcchReaders); if (result != NfcConstant.SCARD_S_SUCCESS) { throw new ApplicationException("リーダーの情報が取得できません。\nErrorCode: " + String.Format("{0:X}", result)); } byte[] mszReaders = new byte[pcchReaders * 2]; result = NfcApi.SCardListReaders(_hContext, null, mszReaders, ref pcchReaders); if (result != NfcConstant.SCARD_S_SUCCESS) { throw new ApplicationException("リーダーの情報が取得できません。\nErrorCode: " + String.Format("{0:X}", result)); } UnicodeEncoding unicodeEncoding = new UnicodeEncoding(); string readerNameMultiString = unicodeEncoding.GetString(mszReaders); int nullindex = readerNameMultiString.IndexOf((char)0); // 装置は1台のみ _readername = readerNameMultiString.Substring(0, nullindex); frm.add_log(DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"), "リーダー名:" + _readername); _readerStateArray = new NfcApi.SCARD_READERSTATE[1]; timer1.Start(); } catch (ApplicationException ex) { frm.add_log(DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"), ex.Message); } } } catch (Exception ex) { MessageBox.Show(ex.ToString()); } }
private void Form1_Load(object sender, EventArgs e) { frm = this; try { var server_config_ssl = new SuperSocket.SocketBase.Config.ServerConfig() { Port = 443, Ip = "127.0.0.1", MaxConnectionNumber = 100, Mode = SuperSocket.SocketBase.SocketMode.Tcp, Name = "SuperWebSocket Sample Server", MaxRequestLength = 1024 * 1024 * 10, Security = "tls", Certificate = new SuperSocket.SocketBase.Config.CertificateConfig { FilePath = ConfigurationManager.AppSettings["cert_file_path"], Password = ConfigurationManager.AppSettings["cert_password"] } }; setup_server(ref server_ssl, server_config_ssl); valid_cert(); var result = NfcApi.SCardEstablishContext( NfcConstant.SCARD_SCOPE_USER, IntPtr.Zero, IntPtr.Zero, out _hContext ); if (result != 0) { if (result == NfcConstant.SCARD_E_NO_SERVICE) { frm.add_log(DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"), "Smart Card Servise is not Started."); } else { frm.add_log(DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"), string.Format("SCardEstablishContext Error.\nErrorCode.%08X\n", result)); } } else { _is_connect = true; try { uint pcchReaders = 0; result = NfcApi.SCardListReaders(_hContext, null, null, ref pcchReaders); if (result != NfcConstant.SCARD_S_SUCCESS) { throw new ApplicationException("リーダーの情報が取得できません。"); } byte[] mszReaders = new byte[pcchReaders * 2]; result = NfcApi.SCardListReaders(_hContext, null, mszReaders, ref pcchReaders); if (result != NfcConstant.SCARD_S_SUCCESS) { throw new ApplicationException("リーダーの情報が取得できません。"); } UnicodeEncoding unicodeEncoding = new UnicodeEncoding(); string readerNameMultiString = unicodeEncoding.GetString(mszReaders); int nullindex = readerNameMultiString.IndexOf((char)0); // 装置は1台のみ _readername = readerNameMultiString.Substring(0, nullindex); frm.add_log(DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"), "リーダー名:" + _readername); _readerStateArray = new NfcApi.SCARD_READERSTATE[1]; timer1.Start(); } catch (ApplicationException ex) { frm.add_log(DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"), ex.Message); } } } catch (Exception ex) { reflesh_cert(); MessageBox.Show("証明書を更新しました。\nアプリケーションを再起動します。"); Application.Restart(); } }