软件名:D8M1.exe

更新时间:2014.06.28

操作系统:windowAll

外部设备:D8读卡器

D8M1可以对MIFARE块读写操作,支持1K,4K。检验KEY后返回SAK,QTAQ,UID。基于D8读卡器提供的dcrf32.dll开发。

D8型IC卡读写器是开发IC卡相关产品及系统集成必备的前端处理设备,可读写双界面射频智能卡或单独的非接触式射频卡,通过RS232串行接口或USB口实现同PC机及相关设备的连接,USB采用无驱技术,可方便用户的安装使用,它对多卡的支持可用于安全发卡及那些安全要求较高的领域需要。

核心代码如下:

  1. void CD8M1Dlg::Show(CString str)
  2. {
  3. time = CTime::GetCurrentTime();
  4. CString strTime = time.Format("%H:%M:%S");
  5. int len = editShow.GetWindowTextLength();
  6. editShow.SetSel(len, len);
  7. editShow.ReplaceSel(strTime + " ----> " + str + _T("\r\n"));
  8. }
  9.  
  10. void CD8M1Dlg::Beer()
  11. {
  12. UCHAR SONG_TONE[] = { 212, 212, 190, 212, 159, 169, 212, 212, 190, 212, 142, 159, 212, 212, 106, 126, 159, 169, 190, 119, 119, 126, 159, 142, 159, 0 }; //生日快乐歌的音符频率表,不同频率由不同的延时来决定
  13. UCHAR SONG_LONG[] = { 9, 3, 12, 12, 12, 24, 9, 3, 12, 12, 12, 24, 9, 3, 12, 12, 12, 12, 12, 9, 3, 12, 12, 12, 24, 0 }; //生日快乐歌节拍表,节拍决定每个音符的演奏长短
  14.  
  15. int len = 6;
  16. for (int i = 0; i < len; i++){
  17. dc_beep(icdev, SONG_LONG[i]/3);
  18. Sleep(SONG_TONE[i]);
  19. }
  20. }
  21.  
  22. void CD8M1Dlg::OnBnClickedInitcom()
  23. {
  24. //初始化串口1,
  25. icdev = dc_init(100, 9600);
  26. if ((int)icdev <= 0){
  27. Show("Init Com Error!");
  28. }
  29. else{
  30. Show("Init Com OK!");
  31. }
  32. dc_beep(icdev, 1);//蜂鸣时间,单位是10毫秒
  33. Sleep(30);
  34. dc_beep(icdev, 1);
  35. Sleep(60);
  36. dc_beep(icdev, 1);
  37. // Beer();
  38.  
  39. }
  40.  
  41. void CD8M1Dlg::OnBnClickedLoadKey()
  42. {
  43. //下载密码
  44. CString keys;
  45. GetDlgItemText(IDC_EDIT_KEY, keys);
  46. int pos = keys.Find("\r\n");
  47. UCHAR uKey[6];
  48. while (pos != -1){
  49. CString key = keys.Left(pos).Trim();
  50. keys = keys.Mid(pos+2);
  51. unsigned char _SecNr = StrToIntA(key.Left(2));
  52. CString keyN = key.Mid(3);
  53. if (_SecNr > 40){
  54. Show("扇区号有误,大于40扇区...");
  55. }
  56. memset(uKey, 0, 6);
  57. Alg::HexToAsc(keyN, uKey);
  58. int st = dc_load_key(icdev, GetKeyMode(), _SecNr, uKey);
  59. if (st != 0){
  60. Show(IntToStr(_SecNr) + ": 扇区密钥写入失败...");
  61. return;
  62. }
  63.  
  64. pos = keys.Find("\r\n");
  65. }
  66.  
  67. Show("载入KEY成功...\r\n");
  68. }
  69.  
  70. void CD8M1Dlg::OnBnClickedVerifyCard()
  71. {
  72. //寻卡函数,
  73. // int st = dc_card(icdev, 0, &cardsnr);
  74. CString linstr;
  75. unsigned short tagType;
  76. int st = dc_request(icdev, 0, &tagType);
  77. if (st != 0)
  78. {
  79. Show("Find Card Error!");
  80. return;
  81. }
  82. else
  83. {
  84. Show("Find Card Ok!");
  85. linstr.Format("%04d", tagType);
  86. Show("ATQA:" + linstr);
  87. }
  88.  
  89. st = dc_anticoll(icdev, 0, &cardsnr);
  90. if (st != 0)
  91. {
  92. Show("Find Card Error!");
  93. return;
  94. }
  95. else
  96. {
  97. linstr.Format("%X", cardsnr);
  98. Show("UID:" + linstr);
  99. }
  100.  
  101. UCHAR size;
  102. st = dc_select(icdev, cardsnr, &size);
  103. if (st != 0)
  104. {
  105. Show("select Card Error!");
  106. return;
  107. }
  108. else
  109. {
  110. linstr.Format("%X", size);
  111. Show("SAK:" + linstr);
  112. }
  113.  
  114. //核对密码
  115. int sec = GetSecNr();
  116. int keyMode = GetKeyMode();
  117. for (int i = 0; i < sec; i++){
  118. st = dc_authentication(icdev, keyMode, i);
  119. if (st != 0){
  120. Show(IntToStr(i) + ": Auth Card Error...");
  121. return;
  122. }
  123. }
  124. Show("核对密码完成...\r\n");
  125. }
  126.  
  127. void CD8M1Dlg::OnBnClickedRead()
  128. {
  129. EditBlock.SetWindowTextA("");
  130. ClearShow();
  131.  
  132. int adrs = GetBlockNr();
  133. CString sData;
  134. UCHAR pData[32];
  135.  
  136. unsigned long _NSnr;
  137. for (int i = 0; i < adrs; i++){
  138. //int st = dc_read(icdev, i, data);
  139.  
  140. if (IsCheckW()){//only read block 3
  141. if ((i < 128) && ((i+1) % 4 != 0)){
  142. continue;
  143. }
  144.  
  145. if ((i > 128) && ((i+1) % 16 != 0)){
  146. continue;
  147. }
  148. }
  149. memset(pData, 0, 32);
  150. int st = dc_HL_read(icdev, 0, i, cardsnr, pData, &_NSnr);
  151. Alg::AscToHex(pData, 16, sData);
  152.  
  153. if (st != 0){
  154. Show(IntToStr(i) + ": 读取失败...");
  155. continue;
  156. }
  157. else{
  158. Show(IntToStr(i) + ": 读取成功," + sData);
  159. }
  160.  
  161. int len = EditBlock.GetWindowTextLength();
  162. EditBlock.SetSel(len, len);
  163. EditBlock.ReplaceSel(IntToStr(i) + ":" + sData + _T("\r\n"));
  164. }
  165.  
  166. Show("读取块完成...\r\n");
  167. }
  168.  
  169. void CD8M1Dlg::OnBnClickedWrite()
  170. {
  171. ClearShow();
  172. CString blocks;
  173. int adrs = GetBlockNr();
  174. GetDlgItemText(IDC_EDIT_BLOCK, blocks);
  175. int pos = blocks.Find("\r\n");
  176. UCHAR uData[16];
  177. while (pos != -1){
  178. CString block = blocks.Left(pos).Trim();
  179. blocks = blocks.Mid(pos + 2);
  180. int posn = block.Find(':');
  181. if (posn == -1){
  182. Show("块地址值有误," + block);
  183. return;
  184. }
  185. unsigned char adr = StrToIntA(block.Left(posn));
  186. CString data = block.Mid(posn + 1);
  187. if (data.GetLength() != 32){
  188. Show("块值长度有误," + block);
  189. }
  190. if (adr > adrs){
  191. Show("块地址越界:" + IntToStr(adr));
  192. return;
  193. }
  194.  
  195. Alg::HexToAsc(data, uData);
  196.  
  197. int st = dc_HL_write(icdev, 0, adr, &cardsnr, uData);
  198. if (st != 0){
  199. Show(IntToStr(adr) + ": 写入失败...");
  200. }
  201. else{
  202. Show(IntToStr(adr) + ": 写入成功,写入值 " + data);
  203. }
  204. pos = blocks.Find("\r\n");
  205. }
  206.  
  207. Show("写入块完成...\r\n");
  208. }
  209.  
  210. void CD8M1Dlg::OnClose()
  211. {
  212. dc_exit(icdev);
  213. CDialogEx::OnClose();
  214. }

软件下载地址:http://download.csdn.net/detail/yxstars/7675429

文/闫鑫原创转载请注明出处http://blog.csdn.net/yxstars/article/details/38108709

MIFARE系列8《D8M1.exe》的更多相关文章

  1. Mifare系列6-射频卡与读写器的通信(转)

    文/闫鑫原创转载请注明出处http://blog.csdn.net/yxstars/article/details/38085415 1. 复位应答(Answer to request) 读写器呼叫磁 ...

  2. Mifare系列1-简介(转)

    文章转自 文/闫鑫原创转载请注明出处http://blog.csdn.net/yxstars/article/details/38079827 感谢原创作者的辛勤,对您再次表达感谢! 随着社会的发展, ...

  3. MIFARE系列6《射频卡与读写器的通讯》

    1. 复位应答(Answer to request) 读写器呼叫磁场内的卡片,卡片对呼叫做出应答.对刚进入磁场得到电复位处于休闲状态的卡片,卡请求(REQA,0x26):对于已进行过读写操作并进入休眠 ...

  4. MIFARE系列1《MIFARE简介》

    随着社会的发展,智能卡在很多领域得到了广泛的应用.特别是非接触卡,由于使用方便以及功能强大的特点,在管理.公交.工作证.身份识别等领域得到了快速的普及和推广. 非接触卡已经逐步发展成为一个独立的跨学科 ...

  5. 射频识别技术漫谈(11)——Mifare系列卡的共性【worldsing笔记】

    Mifare是NXP公司生产的一系列遵守ISO14443A标准的射频卡,包Mifare S50.Mifare S70.Mifare UltraLight.Mifare Pro.Mifare Desfi ...

  6. 射频识别技术漫谈(11)——Mifare系列卡的共性

    Mifare是NXP公司生产的一系列遵守ISO14443A标准的射频卡,包Mifare S50.Mifare S70.Mifare UltraLight.Mifare Pro.Mifare Desfi ...

  7. MIFARE系列6《射频卡与读写器的通信》

    1. ATR(Answer to request) 读写器呼叫磁场内的卡片.卡片对呼叫做出应答. 对刚进入磁场得到电复位处于休闲状态的卡片,卡请求(REQA,0x26):对于已进行过读写操作并进入休眠 ...

  8. C#程序集系列06,程序集清单,EXE和DLL的区别

    CLR在加载程序集的时候会查看程序集清单,程序集清单包含哪些内容呢?可执行文件和程序集有什么区别/ 程序集清单 □ 查看程序集清单 →清空F盘as文件夹中的所有内容→创建MainClass.cs文件→ ...

  9. Mifare系列7-安全性(转)

    文/闫鑫原创转载请注明出处http://blog.csdn.net/yxstars/article/details/38087245 飞利浦的MIFARE卡 由于它的高安全性在市场上得到广泛应用,比如 ...

随机推荐

  1. 测试方法---"SFDIPOT"

    SFDIPOT方法是快速测试的一种方法,可以帮助你快速理清测试点. 我粗略地想了一下,凡是面试时我遇到过的奇葩的让我测一个电梯.雨伞.电话.水杯.测一个奇怪的东西的面试题上都能用. 然后嘛,日常工作中 ...

  2. 实时阴影渲染(一):PSSM平行分割阴影图

    PSSM(Parallel Split Shadow Map)平行分割阴影图,是一种根据距离远近采用多个深度纹理渲染阴影的方法 适合用于室外大场景中的平行光比如太阳形成的阴影 本系列需要读者了解基本的 ...

  3. Android开发-API指南-<provider>

    <provider> 英文原文:http://developer.android.com/guide/topics/manifest/provider-element.html 采集(更新 ...

  4. Facebook三种分享方式

    一.去Facebook开发者中心注册APP,获取APP ID https://developers.facebook.com 二.导入 FBSDKCoreKit.Framework, FBSDKLog ...

  5. android屏幕基础知识

    首先,先来上一张图,看看android屏幕分辨率的占比情况 什么是dp,dip,dpi,sp.px ?之间的关系是什么? px:构成图像的最小单位 dp/dip:密度无关像素 以160dpi为基准 1 ...

  6. 从汇编层面深度剖析C++虚函数

    文章出处:http://blog.csdn.net/linyt/article/details/6336762 虚函数是C++语言实现运行时多态的唯一手段,因此掌握C++虚函数也成为C++程序员是否合 ...

  7. CSS3 伪类选择器 :nth-child()

    :nth-child()可以选择某个的一个或多个特定的子元素,你可以按这种方式进行选择: :nth-child(length);/*参数是具体数字*/ :nth-child(n);/*参数是n,n从0 ...

  8. ORA-00031: session marked for kill 处理Oracle中杀不掉的锁

    一些ORACLE中的进程被杀掉后,状态被置为"killed",但是锁定的资源很长时间不释放,有时实在没办法,只好重启数据库.现在提供一种方法解决这种问题,那就是在ORACLE中杀不 ...

  9. Android IOS WebRTC 音视频开发总结(二九)-- 安卓噪声消除交流

    Android上的音质一直被大家所困扰和诟病,这里面有很多原因, 下面是最近一位前UC同行发邮件跟我交流的一些记录,供参考,支持原创,文章来自博客园RTC.Blacker,转载请说明出处. 以下文字来 ...

  10. EasyUI-Combox

    Combox的数据格式和默认选中项设置 [{ "id":1, "text":"text1" },{ "id":2, &q ...