虚拟卡软仿真说明 Virtual Card and Simulator manual 使用说明 Virtual card 软件仿真是指在 pc 上使用 vc 等工具, 配合 工具, 能够快速进行功能调试一种工程搭建方法 使用者通过一些简单设置, 即可将同一套代码共享在两个工程下 ( 例如一个 vc 工程, 一个 keil 工程 ), 这样代码的逻辑完全一致, 绝大多数问题都可以在 vc 环境下进行调试, 效率比在 keil 下调试能提高几倍到几十倍, 并可实现一些在真实环境下很难复现的场景 本手册中涉及 Vcardio.lib 和 vcardio.h 两个 vc 工程文件 本手册中涉及的软件是 taoism 2 软件 0.0.3.9 版及以上版本 第 1 页共 34 页
虚拟卡软仿真说明 目 录 VIRTUAL CARD AND SIMULATOR MANUAL... 1 目录... 2 建立一个 VC 对话框工程... 3 拷贝 VCARDIO.LIB 和 VCARDIO.H 到工程目录下, 并加入工程... 9 在 MYCARDDLG.CPP 中 INCLUDE VCARDIO.H... 10 修改 INITIADIALOG 函数, 按 CTRL + W, 编辑 ONINITDIALOG 函数... 11 在 ONINITDIALOG 中加入如下代码... 11 编译代码, 会有如下错误... 12 按 ALT+F7, 加入 VCARDIO.LIB... 13 如有若干个 LNK2005 错误, 按 ALT+F7... 13 再次编译, 会有如下错误... 14 再次编译, 成功... 16 按 CTRL + W, 响应 TIMER... 16 编辑 ONTIMER 函数, 加入 KILLTIMER 和调用虚拟卡主函数... 16 编译代码, 提示缺少 MYMAIN 函数... 17 加入 MYMAIN 函数... 17 新建代码文件, 实现 MYMAIN 函数... 18 将 KEIL_MAIN.C 加入工程中... 22 编译代码, 有可能有如下错误... 25 再次编译可能有如下错误... 27 再次编译彻底成功... 29 响应 WM_CLOSE 消息, 防止程序死锁... 29 编写智能卡逻辑代码... 29 一个极简单的 cos 代码... 30 将代码实现编写好后, 运行程序... 32 运行 SNOOPER TAOISM2 程序, 选择虚拟协议 1/11,IP 为 127.0.0.1, 端口为 9999... 33 连接成功, 效果如下... 33 发送一些指令... 34 界面脚本示例... 错误! 未定义书签 读写 flash, 定时器, 异常现象都可在 vc 下实现... 34 第 2 页共 34 页
虚拟卡软仿真说明 建立一个 vc 对话框工程 第 3 页共 34 页
虚拟卡软仿真说明 第 4 页共 34 页
虚拟卡软仿真说明 第 5 页共 34 页
虚拟卡软仿真说明 第 6 页共 34 页
虚拟卡软仿真说明 第 7 页共 34 页
虚拟卡软仿真说明 第 8 页共 34 页
虚拟卡软仿真说明 拷贝 vcardio.lib 和 vcardio.h 到工程目录下, 并加入工程 第 9 页共 34 页
虚拟卡软仿真说明 在 mycarddlg.cpp 中 include vcardio.h 第 10 页共 34 页
虚拟卡软仿真说明 修改 initiadialog 函数, 按 ctrl + w, 编辑 OnInitDialog 函数 在 OnInitDialog 中加入如下代码 第 11 页共 34 页
虚拟卡软仿真说明 编译代码, 会有如下错误 --------------------Configuration: mycard - Win32 Debug-------------------- Compiling resources... Compiling... StdAfx.cpp Compiling... mycard.cpp mycarddlg.cpp Generating Code... Linking... mycarddlg.obj : error LNK2001: unresolved external symbol "unsigned long stdcall daemon(void *)" (?daemon@@ygkpax@z) Debug/mycard.exe : fatal error LNK1120: 1 unresolved externals Error executing link.exe. mycard.exe - 2 error(s), 0 warning(s) 第 12 页共 34 页
虚拟卡软仿真说明 按 alt+f7, 加入 vcardio.lib 如有若干个 LNK2005 错误, 按 Alt+F7 例如 --------------------Configuration: mycard - Win32 Debug-------------------- Linking... nafxcw.lib(thrdcore.obj) : error LNK2005: "public: virtual void thiscall CWinThread::Delete(void)" (?Delete@CWinThread@@UAEXXZ) already defined in mfc42d.lib(mfc42d.dll) 忽略掉相关库 第 13 页共 34 页
虚拟卡软仿真说明 再次编译, 会有如下错误 --------------------Configuration: mycard - Win32 Debug-------------------- Linking... LINK : warning LNK4098: defaultlib "libc.lib" conflicts with use of other libs; use /NODEFAULTLIB:library vcardio.lib(vcardio.obj) : error LNK2001: unresolved external symbol imp accept@12 vcardio.lib(vcardio.obj) : error LNK2001: unresolved external symbol imp listen@8 vcardio.lib(vcardio.obj) : error LNK2001: unresolved external symbol imp closesocket@4 vcardio.lib(vcardio.obj) : error LNK2001: unresolved external symbol imp bind@12 vcardio.lib(vcardio.obj) : error LNK2001: unresolved external symbol imp htons@4 vcardio.lib(vcardio.obj) : error LNK2001: unresolved external symbol imp htonl@4 vcardio.lib(vcardio.obj) : error LNK2001: unresolved external symbol imp WSACleanup@0 vcardio.lib(vcardio.obj) : error LNK2001: unresolved external symbol imp socket@12 vcardio.lib(vcardio.obj) : error LNK2001: unresolved external symbol imp WSAStartup@8 vcardio.lib(vcardio.obj) : error LNK2001: unresolved external symbol imp recv@16 vcardio.lib(vcardio.obj) : error LNK2001: unresolved external symbol imp select@20 vcardio.lib(vcardio.obj) : error LNK2001: unresolved external symbol imp send@16 Debug/mycard.exe : fatal error LNK1120: 12 unresolved externals 第 14 页共 34 页
虚拟卡软仿真说明 Error executing link.exe. mycard.exe - 13 error(s), 1 warning(s) 第 15 页共 34 页
虚拟卡软仿真说明 再次编译, 成功 按 Ctrl + w, 响应 Timer 编辑 OnTimer 函数, 加入 KillTimer 和调用虚拟卡主函数 第 16 页共 34 页
虚拟卡软仿真说明 编译代码, 提示缺少 mymain 函数 --------------------Configuration: mycard - Win32 Debug-------------------- Compiling... mycarddlg.cpp Linking... mycarddlg.obj : error LNK2001: unresolved external symbol "void cdecl mymain(void)" (?mymain@@yaxxz) Debug/mycard.exe : fatal error LNK1120: 1 unresolved externals Error executing link.exe. mycard.exe - 2 error(s), 0 warning(s) 加入 mymain 函数 将新的代码存储到独立的文件夹下 第 17 页共 34 页
虚拟卡软仿真说明 新建代码文件, 实现 mymain 函数 并存储为.c 文件 第 18 页共 34 页
虚拟卡软仿真说明 创建一个文件夹, 例如 keil_src 第 19 页共 34 页
虚拟卡软仿真说明 将文件存储到 keil_src 中, 命名 keil_main.c 第 20 页共 34 页
虚拟卡软仿真说明 第 21 页共 34 页
虚拟卡软仿真说明 将 keil_main.c 加入工程中 第 22 页共 34 页
虚拟卡软仿真说明 第 23 页共 34 页
虚拟卡软仿真说明 第 24 页共 34 页
虚拟卡软仿真说明 编译代码, 有可能有如下错误 --------------------Configuration: mycard - Win32 Debug-------------------- Compiling resources... Compiling... StdAfx.cpp Compiling... mycard.cpp mycarddlg.cpp Generating Code... Compiling... keil_main.c d:\mycard\keil_src\keil_main.c(11) : fatal error C1010: unexpected end of file while looking for precompiled header directive Generating Code... Error executing cl.exe. 第 25 页共 34 页
虚拟卡软仿真说明 mycard.exe - 1 error(s), 0 warning(s) 如有此错误, 按 Alt + f7 第 26 页共 34 页
虚拟卡软仿真说明 再次编译可能有如下错误 Compiling... keil_main.c c:\program files\microsoft visual studio\vc98\mfc\include\afx.h(15) : fatal error C1189: #error : MFC requires C++ compilation (use a.cpp suffix) Generating Code... Compiling... mycarddlg.cpp Generating Code... Error executing cl.exe. mycard.exe - 1 error(s), 0 warning(s) 如有此错误, 按 Alt + f7, 加入 /Tp 选项 第 27 页共 34 页
虚拟卡软仿真说明 第 28 页共 34 页
虚拟卡软仿真说明 再次编译彻底成功 响应 WM_CLOSE 消息, 防止程序死锁 代码如下 void CMycardDlg::OnClose() { // TODO: Add your message handler code here and/or call default TerminateProcess( GetCurrentProcess(), 0 ); CDialog::OnClose(); } 编写智能卡逻辑代码 智能卡逻辑代码一般由发送 atr 或 ats 和一个无限循环组成, 下面使用 atr 来简单描述, 虚拟卡与真实 卡只是 io 收发不同, 其他的逻辑是相同的 第 29 页共 34 页
虚拟卡软仿真说明 一个极简单的 cos 代码 #include "..\vcardio.h" typedef unsigned char UINT8; UINT8 read_byte( void ) { #ifdef WIN32 return readio(); #else // 真实函数代码 return 0; #endif } void write_byte( UINT8 c ) { #ifdef WIN32 writeio( c ); #else // 真实函数代码 #endif } void sendatr( void ) { #ifdef WIN32 // 软仿真中, 发送复位信息, 使用 sendstr 函数 sendstr( "3b00" ); // t0 #else // 各种初始化 #endif } // 除一些基本函数外, 其他函数代码都是统一的 // 主函数收到一切返回 9000 void 第 30 页共 34 页
虚拟卡软仿真说明 mainloop( void ) { UINT8 command[ 5 ]; UINT8 i; } while( 1 ) { for( i = 0; i < 5; i++ ) { command[ i ] = read_byte(); } write_byte( 0x90 ); write_byte( 0x00 ); } // 主函数写法略有不同 #ifdef WIN32 void mymain( void ) { while( 1 ) { try { mainloop(); } catch(... ) { sendatr(); } } } #else void main( void ) { sendatr(); mainloop(); } #endif 第 31 页共 34 页
虚拟卡软仿真说明 将代码实现编写好后, 运行程序 点击允许访问 第 32 页共 34 页
虚拟卡软仿真说明 运行 Taoism2 程序, 选择虚拟协议 1/11,ip 为 127.0.0.1, 端口为 9999 连接成功, 效果如下 //VCard(Private Protocol 11) (T0/T1) //--connect success //reset 3B00 第 33 页共 34 页
虚拟卡软仿真说明 发送一些指令 读写 flash, 定时器, 异常现象都可在 vc 下实现 第 34 页共 34 页