方法回复未插入的 NFC 阅读器
Method replys unplugged NFC readers
我目前使用 pcsc-sharp 从 NFC 标签中读取 ID。我得到了这个方法来列出所有可用的读者。但这回答了我所有使用过的阅读器。还列出了未插入电源的老读者。有人知道如何解决这个问题吗?
public void SelectDevice()
{
List<string> availableReaders = this.ListReaders();
this.RdrState = new Card.SCARD_READERSTATE();
readername = availableReaders[0].ToString();
this.RdrState.RdrName = readername;
}
public List<string> ListReaders()
{
int ReaderCount = 0;
List<string> AvailableReaderList = new List<string>();
retCode = Card.SCardListReaders(hContext, null, null, ref ReaderCount);
if (retCode != Card.SCARD_S_SUCCESS)
{
MessageBox.Show(Card.GetScardErrMsg(retCode));
}
byte[] ReadersList = new byte[ReaderCount];
retCode = Card.SCardListReaders(hContext, null, ReadersList, ref ReaderCount);
if (retCode != Card.SCARD_S_SUCCESS)
{
MessageBox.Show(Card.GetScardErrMsg(retCode));
}
string rName = "";
int indx = 0;
if (ReaderCount > 0)
{
while (ReadersList[indx] != 0)
{
while (ReadersList[indx] != 0)
{
rName = rName + (char)ReadersList[indx];
indx = indx + 1;
}
AvailableReaderList.Add(rName);
rName = "";
indx = indx + 1;
}
}
return AvailableReaderList;
}
好的,我想我已经解决了问题。不知道这是否是最好的方法,但它确实有效。我也不知道为什么 ListReaders()-Method 为我提供了我曾经使用过的所有 reader,但我找到了另一种方法来获取当前 reader 的 reader 名称已插入。
public void SelectDevice()
{
string[] readerNames = new string[1];
using (var context = new SCardContext())
{
context.Establish(SCardScope.System);
readerNames = context.GetReaders();
}
readername = readerNames[0];
this.RdrState.RdrName = readername;
}
如果有更好的方法,或者有人知道为什么我用过所有 reader,请发表评论。
我目前使用 pcsc-sharp 从 NFC 标签中读取 ID。我得到了这个方法来列出所有可用的读者。但这回答了我所有使用过的阅读器。还列出了未插入电源的老读者。有人知道如何解决这个问题吗?
public void SelectDevice()
{
List<string> availableReaders = this.ListReaders();
this.RdrState = new Card.SCARD_READERSTATE();
readername = availableReaders[0].ToString();
this.RdrState.RdrName = readername;
}
public List<string> ListReaders()
{
int ReaderCount = 0;
List<string> AvailableReaderList = new List<string>();
retCode = Card.SCardListReaders(hContext, null, null, ref ReaderCount);
if (retCode != Card.SCARD_S_SUCCESS)
{
MessageBox.Show(Card.GetScardErrMsg(retCode));
}
byte[] ReadersList = new byte[ReaderCount];
retCode = Card.SCardListReaders(hContext, null, ReadersList, ref ReaderCount);
if (retCode != Card.SCARD_S_SUCCESS)
{
MessageBox.Show(Card.GetScardErrMsg(retCode));
}
string rName = "";
int indx = 0;
if (ReaderCount > 0)
{
while (ReadersList[indx] != 0)
{
while (ReadersList[indx] != 0)
{
rName = rName + (char)ReadersList[indx];
indx = indx + 1;
}
AvailableReaderList.Add(rName);
rName = "";
indx = indx + 1;
}
}
return AvailableReaderList;
}
好的,我想我已经解决了问题。不知道这是否是最好的方法,但它确实有效。我也不知道为什么 ListReaders()-Method 为我提供了我曾经使用过的所有 reader,但我找到了另一种方法来获取当前 reader 的 reader 名称已插入。
public void SelectDevice()
{
string[] readerNames = new string[1];
using (var context = new SCardContext())
{
context.Establish(SCardScope.System);
readerNames = context.GetReaders();
}
readername = readerNames[0];
this.RdrState.RdrName = readername;
}
如果有更好的方法,或者有人知道为什么我用过所有 reader,请发表评论。