C#基于PC/SC协议怎么实现与智能卡通信

小超小调 2021-01-29 04:50:11

我是需要用C#实现,和图中的[37]连接上,然后能发APDU命令。
我在GitHub上找到danm-de/pcsc-sharp这个是C# 基于PC/SC访问智能卡的。但代码都没注释,没chm文档,看起来好费力。希望有经验的可以推荐这方面好的博文或者项目代码,感谢!
...全文
632 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
ziqi0716 2021-02-01
  • 打赏
  • 举报
回复
一步一步调试下,没多少代码呀,20行都不到,F10一会儿就走完了
小超小调 2021-01-29
  • 打赏
  • 举报
回复
引用 6 楼 wanghui0380 的回复:
ps:我瞄了一眼对方的说明文档,实际上这份说明文档已经写的很明确了
var contextFactory = ContextFactory.Instance;
using (var ctx = contextFactory.Establish(SCardScope.System)) {
    using (var isoReader = new IsoReader(ctx, "ACME Smartcard reader", SCardShareMode.Shared, SCardProtocol.Any, false)) {
         //上面3行不需要看,他完全遵循C++的定义,查找连接设备,至于那些参数都是C++参数,你看c++文档定义就好

//下面构造一个发送指令包
        var apdu = new CommandApdu(IsoCase.Case2Short, isoReader.ActiveProtocol) {
            CLA = 0x00, // Class
            Instruction = InstructionCode.GetChallenge,
            P1 = 0x00, // Parameter 1
            P2 = 0x00, // Parameter 2
            Le = 0x08 // Expected length of the returned data
        };
             //发送并获取结果
        var response = isoReader.Transmit(apdu);
        Console.WriteLine("SW1 SW2 = {0:X2} {1:X2}", response.SW1, response.SW2);
        // ..
    }
}
到这种程度,你就只需要使用他就好,你不需要管他的代码注释?这样的demo要注释什么呢,这代码一目了然哦。如果你想知道他底下具体实现,我说你到不必去看,前面已经说了,他其实就是调用winscard.dll。所以他的底层流程你可以不用看,他完全遵循C++的调用流程和定义。
大佬,你说的对,我只想调用连接的方法和发命令的方法就行,但我看这个项目里文件一堆,所以不知道看哪些;那我先把example文件夹下的看懂吧,多谢指教
wanghui0380 2021-01-29
  • 打赏
  • 举报
回复
ps:我瞄了一眼对方的说明文档,实际上这份说明文档已经写的很明确了
var contextFactory = ContextFactory.Instance;
using (var ctx = contextFactory.Establish(SCardScope.System)) {
    using (var isoReader = new IsoReader(ctx, "ACME Smartcard reader", SCardShareMode.Shared, SCardProtocol.Any, false)) {
         //上面3行不需要看,他完全遵循C++的定义,查找连接设备,至于那些参数都是C++参数,你看c++文档定义就好

//下面构造一个发送指令包
        var apdu = new CommandApdu(IsoCase.Case2Short, isoReader.ActiveProtocol) {
            CLA = 0x00, // Class
            Instruction = InstructionCode.GetChallenge,
            P1 = 0x00, // Parameter 1
            P2 = 0x00, // Parameter 2
            Le = 0x08 // Expected length of the returned data
        };
             //发送并获取结果
        var response = isoReader.Transmit(apdu);
        Console.WriteLine("SW1 SW2 = {0:X2} {1:X2}", response.SW1, response.SW2);
        // ..
    }
}
到这种程度,你就只需要使用他就好,你不需要管他的代码注释?这样的demo要注释什么呢,这代码一目了然哦。如果你想知道他底下具体实现,我说你到不必去看,前面已经说了,他其实就是调用winscard.dll。所以他的底层流程你可以不用看,他完全遵循C++的调用流程和定义。
wanghui0380 2021-01-29
  • 打赏
  • 举报
回复
一份C++ api的简略说明 https://blog.csdn.net/woshi_ziyu/article/details/7871559 基本上把这个看一遍,大体的使用流程就是清楚的,哪怕外面是C#封装版本的,但基本的过程和使用逻辑不会有太大改变
wanghui0380 2021-01-29
  • 打赏
  • 举报
回复
先看这里 https://docs.microsoft.com/zh-cn/windows/win32/api/winscard/ 大体上这种类型的操作,第一手资料是微软官方api,C#里没有直接提供的class的话,第3方封装最简单直接的步骤就是使用pinvoke调用C++的dll (winscard.dll),所以想了解他怎么用,可以先看看C++的常规流程,他们的流程决定我们的流程(毕竟api是c++的api,nuget上能做的只是简化调用声明和对象化封装,但使用流程和对象定义规定还得兼容C++的)。 明白这个了,我们在来看你给那个库 https://github.com/danm-de/pcsc-sharp/blob/master/src/PCSC/Interop/Windows/WinSCardAPI.cs
  [DllImport(WINSCARD_DLL, CharSet = CharSet.Unicode)]
        private static extern int SCardEstablishContext(
            [In] int dwScope,
            [In] IntPtr pvReserved1,
            [In] IntPtr pvReserved2,
            [In, Out] ref IntPtr phContext);
可以看到他依旧还是使用的这种方式,只是外面对其做了一下简化封装 至于使用上你先看他的demo https://github.com/danm-de/pcsc-sharp/tree/master/Examples ps:从他的项目上看,个人建议使用Reactive版本的提供,我个人喜欢可观测流版本(方便啊)
小超小调 2021-01-29
  • 打赏
  • 举报
回复
引用 2 楼 jhdxhj 的回复:
智能卡一般用的串口协议居多
串口就是要和图中的[38]通信,我已经能和串口通信了。现在需要和[37]通信
jhdxhj 2021-01-29
  • 打赏
  • 举报
回复
智能卡一般用的串口协议居多
ziqi0716 2021-01-29
  • 打赏
  • 举报
回复
没有写过,但是如果让我写,我回去找官方提供的资料以及二次开发的demo,然后依葫芦画瓢做

111,129

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧