热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

IC卡操作功能实现

本文介绍了如何通过C#语言调用动态链接库(DLL)中的函数来实现IC卡的基本操作,包括初始化设备、设置密码模式、获取设备状态等,并详细展示了将TextBox中的数据写入IC卡的具体实现方法。

public partial class ICOperation : Form
{
// 包含所有与IC卡交互的方法
[StructLayout(LayoutKind.Sequential)]
public unsafe class ICAPI
{
// 初始化IC卡读写器
[DllImport("Mwic_32.dll", EntryPoint = "auto_init", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = true, CallingCOnvention= CallingConvention.StdCall)]
public static extern int Initialize(int port, int baud);

// 设置安全模式
[DllImport("Mwic_32.dll", EntryPoint = "setsc_md", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = true, CallingCOnvention= CallingConvention.StdCall)]
public static extern int SetSecurityMode(int icDevice, int mode);

// 获取设备状态
[DllImport("Mwic_32.dll", EntryPoint = "get_status", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = true, CallingCOnvention= CallingConvention.StdCall)]
public static extern Int16 GetStatus(int icDevice, Int16* status);

// 关闭设备
[DllImport("Mwic_32.dll", EntryPoint = "ic_exit", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = true, CallingCOnvention= CallingConvention.StdCall)]
public static extern int CloseDevice(int icDevice);

// 发出蜂鸣声
[DllImport("Mwic_32.dll", EntryPoint = "dv_beep", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = true, CallingCOnvention= CallingConvention.StdCall)]
public static extern int Beep(int icDevice, int duration);

// 向IC卡写入数据
[DllImport("Mwic_32.dll", EntryPoint = "swr_4442", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = true, CallingCOnvention= CallingConvention.StdCall)]
public static extern int WriteToCard(int icDevice, int offset, int length, char* data);

// 校验卡密码
[DllImport("Mwic_32.dll", EntryPoint = "csc_4442", SetLastError = true, CharSet = CharSet.Auto, ExactSpelling = true, CallingCOnvention= CallingConvention.Winapi)]
public static extern Int16 CheckCardPassword(int icDevice, int length, [MarshalAs(UnmanagedType.LPArray)] byte[] password);
}

public ICOperation()
{
InitializeComponent();
}

private void OnWriteButtonClicked(object sender, EventArgs e)
{
int icDevice = ICAPI.Initialize(0, 9600);
if (icDevice <0)
{
MessageBox.Show("端口初始化失败,请检查接口线是否连接正确。");
return;
}

int securityMode = ICAPI.SetSecurityMode(icDevice, 1);
unsafe
{
Int16 status = 0;
Int16 result = ICAPI.GetStatus(icDevice, &status);
if (result != 0)
{
MessageBox.Show("设备当前状态错误!");
ICAPI.CloseDevice(icDevice);
return;
}
if (status != 1)
{
MessageBox.Show("请插入IC卡");
ICAPI.CloseDevice(icDevice);
return;
}
}

unsafe
{
byte[] password = { 255, 255, 255 };
Int16 passwordCheckResult = ICAPI.CheckCardPassword(icDevice, 3, password);
if (passwordCheckResult <0)
{
MessageBox.Show("IC卡密码错误!");
return;
}

for (int i = 0; i {
char data = textBox1.Text[i];
int writeResult = ICAPI.WriteToCard(icDevice, 33 + i, 1, &data);
if (writeResult != 0)
{
MessageBox.Show("数据写入IC卡失败!");
ICAPI.CloseDevice(icDevice);
return;
}
}

ICAPI.Beep(icDevice, 20);
MessageBox.Show("数据已成功写入IC卡中!");
ICAPI.CloseDevice(icDevice);
}
}

private void OnExitButtonClicked(object sender, EventArgs e)
{
Application.Exit();
}
}


通过上述代码,可以实现IC卡的初始化、安全模式设置、状态查询、数据写入及设备关闭等功能,同时提供了用户界面交互,使得操作更加便捷。


推荐阅读
  • spring boot使用jetty无法启动 ... [详细]
  • Android与JUnit集成测试实践
    本文探讨了如何在Android项目中集成JUnit进行单元测试,并详细介绍了修改AndroidManifest.xml文件以支持测试的方法。 ... [详细]
  • linux网络子系统分析(二)—— 协议栈分层框架的建立
    目录一、综述二、INET的初始化2.1INET接口注册2.2抽象实体的建立2.3代码细节分析2.3.1socket参数三、其他协议3.1PF_PACKET3.2P ... [详细]
  • 驱动程序的基本结构1、Windows驱动程序中重要的数据结构1.1、驱动对象(DRIVER_OBJECT)每个驱动程序会有唯一的驱动对象与之对应,并且这个驱动对象是在驱 ... [详细]
  • 本文整理了一份基础的嵌入式Linux工程师笔试题,涵盖填空题、编程题和简答题,旨在帮助考生更好地准备考试。 ... [详细]
  • 一、Advice执行顺序二、Advice在同一个Aspect中三、Advice在不同的Aspect中一、Advice执行顺序如果多个Advice和同一个JointPoint连接& ... [详细]
  • 问题场景用Java进行web开发过程当中,当遇到很多很多个字段的实体时,最苦恼的莫过于编辑字段的查看和修改界面,发现2个页面存在很多重复信息,能不能写一遍?有没有轮子用都不如自己造。解决方式笔者根据自 ... [详细]
  • 入门指南:使用FastRPC技术连接Qualcomm Hexagon DSP
    本文旨在为初学者提供关于如何使用FastRPC技术连接Qualcomm Hexagon DSP的基础知识。FastRPC技术允许开发者在本地客户端实现远程调用,从而简化Hexagon DSP的开发和调试过程。 ... [详细]
  • 本文详细介绍了Windows网络编程中常用的几个关键结构体,包括sockaddr_in、in_addr和hostent,解释了它们的定义和用途,并提供了实际应用中的示例。 ... [详细]
  • 本文介绍了如何利用X_CORBA实现远程对象调用,并通过多个示例程序展示了其功能与应用,包括基础的Hello World示例、文件传输工具以及一个完整的聊天系统。 ... [详细]
  • 题目描述:计算从起点到终点的最小能量消耗。如果下一个单元格的风向与当前单元格相同,则消耗为0,否则为1。共有8个可能的方向。 ... [详细]
  • 首部|接口类型_OSI 7层模型 & TCP/IP协议首部封装格式解析
    首部|接口类型_OSI 7层模型 & TCP/IP协议首部封装格式解析 ... [详细]
  • DirectShow Filter 开发指南
    本文总结了 DirectShow Filter 的开发经验,重点介绍了 Source Filter、In-Place Transform Filter 和 Render Filter 的实现方法。通过使用 DirectShow 提供的类,可以简化 Filter 的开发过程。 ... [详细]
  • WPF项目学习.一
    WPF项目搭建版权声明:本文为博主初学经验,未经博主允许不得转载。一、前言记录在学习与制作WPF过程中遇到的解决方案。使用MVVM的优点是数据和视图分离,双向绑定,低耦合,可重用行 ... [详细]
  • 包含phppdoerrorcode的词条 ... [详细]
author-avatar
UPI
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有