net 中的智能(射频)卡框架

本文介绍了一种在.NET环境中操作智能卡的简单框架设计。该框架利用.NET的互操作特性,通过COM和P/Invoke技术实现了智能卡的控制命令。此外,还提供了智能卡插入和移除事件的支持。

作者:orouit 来自马来西亚

前言:

.NET framework在2002年推出,目前最高版本是3.5。到目前为止,微软在。NET中还没有包含操作智能卡的类,如果你想建立一个智能卡应用项目,你需要设计你自己的类。幸运的是在.net中比java强的多的是,我们可以大量重复使用现有的代码。在Windows里,假如你需要应用智能卡项目,在恰好在你的程序中使用PC/SC API。这个API使用C语言写的函数通过COM与COM的互操作,和P/Invoke的本地代码的互操来实现。

背景:

本文演示了如何使用关于互操作性的特点,在NET中利用他们呢来写一个简单的框架,以在你的程序中操作智能卡。智能卡是一种小型嵌入式设备通过PC/Win32 API连接的读卡器接受命令。如果你想使用这个API,你将需要一个智能卡如SIM卡,还有一个智能卡的读卡器。

简单的智能卡框架

SC框架是一个设计与智能卡沟通的接口。很少的类通过不同的参数来操作智能卡的控制命令,我们正在使用的类取决于互操作模式。

这个智能卡接口允许通过.net程序进行简单的访问。稍后我们将看到如何实现此接口同时使用的互操作性技术。

spublic interface ICard

string[] ListReaders();

void Connect(string Reader, SHARE ShareMode,

PROTOCOL PreferredProtocols);

void Disconnect(DISCONNECT Disposition);

APDUResponse Transmit(APDUCommand ApduCmd);

void BeginTransaction();

void EndTransaction(DISCONNECT Disposition);

类APDUCommand和APDUResponse是用来向卡发送命令和得到的卡的响应。共享协议,和DISCONNECT是一个常量,在PC/SC上。

public class APDUCommand

{

public APDUCommand(byte bCla, byte bIns,

byte bP1, byte bP2, byte[] baData, byte bLe);

public void Update(APDUParam apduParam);

public override string ToString();

public byte Class;

public byte Ins;

public byte P1;

public byte P2;

public byte[] Data;

public byte Le;

}

public class APDUResponse

{

public APDUResponse(byte[] baData);

public byte[] Data;

public byte SW1;

public byte SW2;

public ushort Status;

public override string ToString();

}

增加支持智能卡触发事件

当卡插入阅读器或离开,PC/SC可以让你处理这些事件。因此,我增加一个智能卡事件支持的.net基础框架模型。CardBase类,继承了来自ICard接口。实施支持两个事件,CardInserted 和 CardRemoved。到目前为止,我只执行了这项支持CardNative 。如果你想在你的项目中支持这个事件,你只需要执行CardInsertedEventHandler 和 CardRemovedEventHandler.

abstract public class CardBase : ICard

{

public event CardInsertedEventHandler OnCardInserted = null;

public event CardRemovedEventHandler OnCardRemoved = null;

abstract public string[] ListReaders();

abstract public void Connect(string Reader,

SHARE ShareMode, PROTOCOL PreferredProtocols);

abstract public void Disconnect(DISCONNECT Disposition);

abstract public APDUResponse Transmit(APDUCommand ApduCmd);

abstract public void BeginTransaction();

abstract public void EndTransaction(DISCONNECT Disposition);

public void StartCardEvents(string Reader);

public void StopCardEvents();

abstract protected void RunCardDetection();

protected void CardInserted();

protected void CardRemoved();

}

我开发了关于接口ICard两个实现。一种是使用COM互操作性,另一种是使用 P/Invoke的本地互操作性。实现的方式是一样的。此外用P/Invoke执行协议框架,以便有可能开发智能卡应用的手持机。

CardCOM:一个COM互操作实现类

在.net中,COM的互操作行最简单的方式是重复使用旧代码。所有版本的Studio .NET都对COM有很好的支持。你只需要添加一个引用的COM对象到你的项目当中,并且他是一个通用的DLL动态库,并有必要的类使用的接口。基本上你不需要写任何代码。不过,您的COM组件必须遵守一些规则,特别是关于参数的方法。由于不同的PC/SC COM组件是在.NET出现前就出现的,和一些接口不完全符合的COM互操作性。这就是我为什么要开发自己的COM接口。对于重要的接口,ISCard和它的接口采用了输入限制。

interface ISCardDatabaseEx : IDispatch{

[id(1), helpstring("method ListReaders")]

HRESULT ListReaders([out,retval] VARIANT* ppReaders);

};

用COM组件开发取代我设计的ISCardDatabase接口,只有实现它的一个方法:ListReaders。在微软实施,返回参数是的SAFEARRAY BSTR ,不幸的是.NET中不能正确导入。正确的方法是使用一个VARIANT*包含的SAFEARRAY BSTR 。然后,.net将产生的包装方法,返回一个对象,你只需要投入一个string[]。使用COM对象。 NET中很简单,只要增加一个参考到这个对象在您的代码。Visual Studio然后将生成一个包装类,你直接使用您的代码。以下摘录说明了这一点。

using SCARDSSPLib; // 用 SCard COM 对象

/// <summary>

/// 默认构造

/// </summary>

public CardCOM()

{

// Create the SCard object

m_itfCard = new CSCardClass();

}

public override void Connect(string Reader,

SHARE ShareMode, PROTOCOL PreferredProtocols)

{

// Calls AttachReader to connect to the card

m_itfCard.AttachByReader(Reader,

(SCARD_SHARE_MODES) ShareMode,

(SCARD_PROTOCOLS) PreferredProtocols);

}

这 ISCardDatabase接口提供了一个DLL ,必须用Regsvr32来注册这个动态库 。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值