搜索
bottom↓
回复: 52

RC531 读二代身份证8字节UID命令是什么?

[复制链接]

出0入0汤圆

发表于 2010-3-25 13:46:51 | 显示全部楼层 |阅读模式
1,我发送 status = M531PiccRequestB(PICC_REQBWUP,0,0,ReadBuf); // ReqB with 1 slot
   每次返回都是0xFF
   我发送的是05 00  00 3字节
   下面选卡等也不好往下
   第一步就卡住了。

读type a的 M1 S50卡 倒是没问题 说明硬件还有最底层的接口也肯定过了

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

 楼主| 发表于 2010-3-25 13:51:39 | 显示全部楼层
while(1)
        {
          // IS014443B
/*
当完成MF RC531复位和初始化之后,读卡模块天线产生高频磁场,并循环发送REQB命令
“0x05 0x00 0x00”,对“二代证”进行询卡操作。当“二代证”靠近读卡模块天线,距离在
100mm以内时,“二代证”内部的线圈接收到读卡模块天线发出的磁场能量,产生感应电压对
“二代证”内部芯片进行供电。当“二代证”内部芯片正常工作并接收到读卡模块发送的REQB
命令后,会返回12个字节的卡类型代码给读卡模块。
5000000000D1038605008080

询卡成功后,读卡模块发送SELECT命令“0x1D 0x00 0x00 0x00 0x00 0x00 0x08 0x01 0x08”
,对“二代证”进行选卡操作,这时“二代证”会返回状态码。最后读卡模块发送GUID命令“0x00
0x36 0x00 0x00 0x08”,读取“二代证”的8字节的唯一序列号UID。
*/

           M500PcdConfigISOType(TYPEB);
           status = M531PiccRequestB(PICC_REQBWUP,0,0,ReadBuf); // ReqB with 1 slot
           if(status==MI_OK || status==MI_COLLERR)   //这里就开始错误 一直是0XFF
           {
             if(status == MI_COLLERR) // more then 1 card
             {


char M500PcdConfigISOType(unsigned char type)
{
   if(type==TYPEA)
   {
     WriteIO(RegTxControl,0x5b);         // Force100ASK, TX1 & TX2 enable
     WriteIO(RegCoderControl,0x19);     // Miller coding, 106kbps
     WriteIO(RegRxControl1,0x73);
     WriteIO(RegDecoderControl,0x08);   // Manchester Coding
     WriteIO(RegCRCPresetLSB,0x63);     // set CRC preset to 0x6363
     WriteIO(RegCRCPresetMSB,0x63);
     WriteIO(RegRxThreshold,0x88);          // set max MinLevel & ColLevel.
     TYPE = TYPEA;       
   }
   else
   { /*
     WriteIO(RegTxControl,0x4b);              // disable Force100ASk
     WriteIO(RegCoderControl,0x20);     // NRZ-L, TypeB baud 106kbps
     WriteIO(RegRxControl1,0x73);       //
     WriteIO(RegDecoderControl,0x19);   // BPSK coding
     WriteIO(RegCRCPresetLSB,0xff);     // set CRC preset to 0xffff
     WriteIO(RegCRCPresetMSB,0xff);
     WriteIO(RegTypeBFraming,0x23);     // EGT=0
     WriteIO(RegBPSKDemControl,0x3e);   // ignore EOF, on amp. detect
     WriteIO(RegModConductance,0x06);        // set modulation index at 12%
     WriteIO(RegRxThreshold,0x44);  // Reduce MinLevel & ColLevel.
                                    // Increase higher nibble if carrier
                                    // present but not detect
         */         //源码

            //ISO14443B电子标签         JB8_NE64_RC531
                //第2页 传送器与编码器控制
                WriteIO(RegTxControl, 0x4b);                       //0x4b, 13.56MHz
                WriteIO(RegCwConductance, 0x3f);                         //0x3f, 设置输出驱动的电导系数
                WriteIO(RegModConductance, 0x06);                 //0x06, 幅移键控ASk 12%
                WriteIO(RegCoderControl, 0x20);          //0x20, TypeB,波特率106kbps, NRZ编码
                WriteIO(RegTypeBFraming, 0x23);          //0x23, 定义ISO14443B帧格式
               
                //第3页 接收器与解码器控制
                WriteIO(RegDecoderControl, 0x19);        //0x19, ISO14443B帧,BPSK编码
                WriteIO(RegRxThreshold, 0x44);           //0x44, 可接收的最小信号强度
                WriteIO(RegBPSKDemControl, 0x3e);        //0x3e, 忽略EOF,打开高通滤波
                WriteIO(RegClockQControl, 0x07);               //0x3f, Q时钟控制
               
                //第4页 射频时间和通道冗余
                WriteIO(RegRxWait, 0x06);                //0x06, 设置接收延时
                WriteIO(RegChannelRedundancy, 0x2c);     //0x2c, TypeB接收冗余校验
                WriteIO(RegCRCPresetLSB, 0xff);          //0xff, CRC预设值
                WriteIO(RegCRCPresetMSB, 0xff);          //0xff, CRC预设值
        TYPE = TYPEB;
   }
   return MI_OK;
}





//////////////////////////////////////////////////////////////////////
//           E X C H A N G E   B Y T E   S T R E A M
///////////////////////////////////////////////////////////////////////
char ExchangeByteStream(unsigned char Cmd,
                        unsigned char *send_data,
                        unsigned char send_bytelen,
                        unsigned char *rec_data,  
                        unsigned char *rec_bytelen)
{
   signed char status = MI_OK;
   
   FlushFIFO();    // empty FIFO
   ResetInfo(MInfo); // initialise ISR Info structure

   if (send_bytelen > 0)
   {
      memcpy(MSndBuffer,send_data,send_bytelen); // write n bytes
      MInfo.nBytesToSend = send_bytelen;
      // write load command
      status = M500PcdCmd(Cmd,                      //这里进入实际发送函数后 接收返回一直是0xff
                                MSndBuffer,
                                MRcvBuffer,
                                &MInfo);
      if ( status == MI_OK )
      {
         *rec_bytelen = MInfo.nBytesReceived;
         if (*rec_bytelen)
         {
            memcpy(rec_data,MRcvBuffer,MInfo.nBytesReceived);
         }
      }
   }
   else
   {
      status = MI_WRONG_PARAMETER_VALUE;
   }
   return status;
}      


//////////////////////////////////////////////////////////////////////
//                    R E Q U E S T   B
//////////////////////////////////////////////////////////////////////
char M531PiccRequestB(unsigned char req_code,
                      unsigned char AFI,
                      unsigned char N,
                      unsigned char *ATQB)
{
   char   status = MI_OK;
   unsigned char rec_len;

   WriteIO(RegChannelRedundancy,0x2C); // RxCRC and TxCRC enable, parity
                                       // disable, ISO/IEC3390 enable       
   ClearBitMask(RegControl,0x08);      // disable crypto 1 unit 加密单元关闭
   SetBitMask(RegTxControl,0x03);      // Tx2RF-En, Tx1RF-En enable
  

   M500PcdSetTmo(5);

   MSndBuffer[0] = 0x05;                    // APf code
   MSndBuffer[1] = AFI; //
   MSndBuffer[2] = (req_code&0x08)|(N&0x07); // PARAM

   MSndBuffer[1] = 0; //                    ////////////////改成0
   MSndBuffer[2] = 0; // PARAM              /////////////// 改成0


   status = ExchangeByteStream(PCD_TRANSCEIVE,
                               MSndBuffer,
                               3,
                               ATQB,
                               &rec_len);

   if (status!=MI_OK && status!=MI_NOTAGERR) status = MI_COLLERR; // collision occurs
   
   if (status == MI_OK) M500PcdSetTmo(ATQB[11]>>4); // set FWT



         
   return status;
}

出0入0汤圆

发表于 2010-3-25 15:03:40 | 显示全部楼层
xuexi

出0入0汤圆

 楼主| 发表于 2010-3-25 15:14:43 | 显示全部楼层
做过的来麻烦指导下~~

出0入0汤圆

发表于 2010-3-25 16:25:04 | 显示全部楼层
兄弟,二代证的命令是加密的,需要加密模块才能完成,
你没发现卡片的UID都是0吗
并不完全兼容14443-B,是非标的,

出0入0汤圆

 楼主| 发表于 2010-3-25 19:37:29 | 显示全部楼层
这么说 网上卖的MCU+RC531读 8字节ID的 都是代码解密的?他们都没用专门解密模块啊

另外只读2代的 8字节ID 我查下来的资料是不需要解密模块的

目前我 连00 都收不到、发了询卡 一点反应也没

有点晕我了~~

出0入0汤圆

发表于 2010-3-25 20:01:29 | 显示全部楼层
是这样的,二代证是应答标准的REQB指令的,但Attrib指令是非标的,这一点我没深入研究,也许不对,

如果你的没收到二代证REQB指令的应答,估计是你的RC531配置不对

建议你购买一个阅读器,用逻辑分析仪分析一下就行了

出0入0汤圆

 楼主| 发表于 2010-3-25 20:04:50 | 显示全部楼层
是的
ATTRIB 是特殊的发指令。

出0入0汤圆

发表于 2010-3-25 20:41:09 | 显示全部楼层
mark.

出0入0汤圆

发表于 2010-3-25 20:43:26 | 显示全部楼层
帮顶。

出0入0汤圆

 楼主| 发表于 2010-3-30 11:28:58 | 显示全部楼层
有做过的吗?

出0入0汤圆

 楼主| 发表于 2010-4-4 20:46:39 | 显示全部楼层
已解决 可以读2代身份证的UID了
上面发的代码没问题 芯片焊接问题

出0入0汤圆

发表于 2010-4-30 13:43:15 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-4-30 13:52:36 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-4-30 13:54:19 | 显示全部楼层
二代证不是每家都有资质做的

出0入0汤圆

发表于 2010-5-20 14:26:44 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-6-11 20:44:48 | 显示全部楼层
回复【楼主位】tick  
-----------------------------------------------------------------------

我也碰到和楼主一样的问题,能指教一下吗?
MF1读写卡都正常

M531PiccRequestB返回0xff

出0入0汤圆

发表于 2010-8-6 14:04:46 | 显示全部楼层
将WriteIO(RegRxThreshold, 0x44);           //0x44, 可接收的最小信号强度
改为:WriteIO(RegRxThreshold, 0xFF);           //0x44, 可接收的最小信号强度
试一下!!!!
请问有没有对typeB的CPU卡操作成功的!

出0入0汤圆

发表于 2010-9-20 17:11:40 | 显示全部楼层
我获取了UID呀,但是怎么是动态的呢?同一张身份证,不断的刷,得到的是不同的序列号呀?
请问各位大虾,你们是怎么解决的呀?

是不是有一个什么公式还是我发送的命令不对呀!

我是先发“0x05 0x00 0x00”,得到"5000000000D1038605008080"
询卡成功后,读卡模块发送SELECT命令“0x1D 0x00 0x00 0x00 0x00 0x00 0x08 0x01 0x08”
最后读卡模块发送GUID命令“0x00 0x36 0x00 0x00 0x08”

请问,问题出在那里呀

出0入0汤圆

发表于 2010-9-20 17:29:40 | 显示全部楼层
632能读二代身份证么?问下楼主??

为毛很多模块都说读不了呢,真的是因为没有资质吗?
好像是可以读出身份证号的吧,照片什么的没有加密模块是读不出来的。。

各种解释都有。

出0入0汤圆

 楼主| 发表于 2010-9-20 20:57:01 | 显示全部楼层
TYPE B 支持就可以
像MFRC500只支持TYPE A当然不行
MFRC531支持  TYPE B就可以,读出来的只是二代身份证唯一的8字节 UID号。

该方案我只应用到 一家企业在用  要求全部员工用2代身份证门禁考勤。
他们不计成本,就开发出来呗。


另外:这公司大概400多员工,其中大约《=10张是读不了的。据说二代有些卡连UID都读不出的,这个试下来确实是这样的

出0入0汤圆

发表于 2010-9-21 11:08:28 | 显示全部楼层
回复【20楼】tick
-----------------------------------------------------------------------

我读出来的UID号码是在不断变化的,不过就只是在几个数据之间变化。
作为产品,我们需要的是唯一的一个序列号,如果是不断变化的号码,那就只能用于实验室。如果读不出来那问题将更加的严重,

请问大虾,我得到的UID号是不是要需要一个特殊的公式才可以转换为唯一的号呢!

谢谢

出0入0汤圆

 楼主| 发表于 2010-9-25 09:49:11 | 显示全部楼层
不需要,读出来就是唯一的码

出0入0汤圆

发表于 2010-9-25 10:00:39 | 显示全部楼层
回复【20楼】tick  
type b 支持就可以
像mfrc500只支持type a当然不行
mfrc531支持  type b就可以,读出来的只是二代身份证唯一的8字节 uid号。
该方案我只应用到 一家企业在用  要求全部员工用2代身份证门禁考勤。
他们不计成本,就开发出来呗。
另外:这公司大概400多员工,其中大约《=10张是读不了的。据说二代有些卡连uid都读不出的,这个试下来确实是这样的

-----------------------------------------------------------------------

是这样啊
看来632也没问题了,只要写出合理的命令,传递进模块里,很有可能能读出点什么吧(?)
我觉得我应该找个网吧读二代的机器拆了看看,全世界应该就做这个读typeb芯片应该就一两家吧?什么复旦是干嘛的。。
很久以前传言说二代身份证技术用了日本人的技术,不知道这个又是怎么回事?

出0入0汤圆

发表于 2010-9-25 12:37:09 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-9-25 15:45:59 | 显示全部楼层
mark

出10入12汤圆

发表于 2011-1-7 09:38:05 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-1-8 12:23:11 | 显示全部楼层
哦,原来读出来的是UID,不是身份证号码,2者有必然关联吗?

RC522也支持TYPE B,应该也可以读到UID吧?

出0入0汤圆

发表于 2011-2-17 14:54:23 | 显示全部楼层
MARK

出0入0汤圆

发表于 2011-2-17 16:41:51 | 显示全部楼层
身份证号码我觉得应该给读出的

出0入0汤圆

发表于 2011-2-18 13:22:23 | 显示全部楼层
身份证号码是加密的,读不出来。UID的话只要支持TYPE B模式就能读出来。

出0入0汤圆

发表于 2011-3-19 19:46:51 | 显示全部楼层
m1卡能读不一定 硬件没问题,typeB是10%调制的,能读typeA的天线板不一定能读typeB

出0入0汤圆

发表于 2011-5-27 11:32:57 | 显示全部楼层
MARK
LEARN

出0入12汤圆

发表于 2011-5-27 11:54:02 | 显示全部楼层
good

出0入0汤圆

发表于 2011-5-27 12:28:19 | 显示全部楼层
之前有同事试过说是读出来的UID是变化的。
请教一下,不用加密模块,确实可以读出UID吗?

出0入0汤圆

发表于 2011-5-27 12:46:47 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-5-27 14:13:34 | 显示全部楼层
jh

出0入0汤圆

发表于 2011-7-17 16:08:30 | 显示全部楼层
回复【11楼】tick  
-----------------------------------------------------------------------

tick在吗,你的代码能不能看下子啊,读二代证的代码,谢谢啊

出0入0汤圆

发表于 2011-9-11 20:44:00 | 显示全部楼层
兄弟们,我也是能读typeA.读不了typeB啊.还弄不明白是硬件问题还是软件问题啊.郁闷中...

出0入0汤圆

发表于 2011-12-20 15:01:26 | 显示全部楼层
回复【39楼】zjczm  
-----------------------------------------------------------------------

应该是代码的问题,最近也在研究啊~~

出0入0汤圆

发表于 2011-12-20 15:02:17 | 显示全部楼层
回复【31楼】mylovefor  
-----------------------------------------------------------------------

确定吗,只改动代码可以实现的

出0入4汤圆

发表于 2011-12-20 16:37:10 | 显示全部楼层
留印,也许有用...

出0入0汤圆

发表于 2011-12-20 18:04:12 | 显示全部楼层
有意思

出0入21汤圆

发表于 2012-6-13 17:55:46 | 显示全部楼层
mark,learn

出0入0汤圆

发表于 2012-6-13 18:31:13 | 显示全部楼层
第二代身份证 是CPU卡 需要发送数据 然后校验 对了 才返回正确信息。

出0入30汤圆

发表于 2012-6-13 19:16:59 | 显示全部楼层
二代证读内容肯定是没那么容易的,一般厂家做不出来,想做还得什么公安部的授权。
读UID只要是支持TYPEB的基站芯片都能读,这没什么秘密。
当然,ATRRIB是非标的。

出90入372汤圆

发表于 2012-8-30 11:13:02 | 显示全部楼层
准备改一下M1的读卡器用来读TYPE A 的UID号

出0入0汤圆

发表于 2012-9-20 11:53:51 | 显示全部楼层
我日,我是用EM4094,也是能读A卡,读不了B卡,怎么回事

出0入0汤圆

发表于 2012-12-3 09:12:26 | 显示全部楼层
tick 发表于 2010-3-25 13:51
while(1)
        {
          // IS014443B

楼主,能上传下你的工程吗?

出0入0汤圆

发表于 2013-4-15 15:26:32 | 显示全部楼层
tick 发表于 2010-9-25 09:49
不需要,读出来就是唯一的码

读出来的是8个字节的数据,但是我们的身份证是18位的,那是怎么计算出来的!

出0入0汤圆

发表于 2013-7-25 20:04:32 | 显示全部楼层
我用的是523,能读的了A卡,读不了B卡,不知道是程序的原因,还是天线的原因。

出0入0汤圆

发表于 2016-11-18 10:40:10 | 显示全部楼层
qzxy0927 发表于 2013-4-15 15:26
读出来的是8个字节的数据,但是我们的身份证是18位的,那是怎么计算出来的! ...

我的理解是,身份证UID是卡片的唯一标示,身份证号作为个人信息录入卡片上,可能通过有关部门定义的加密命令获取。UID和身份证号应该是关联起来的。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 02:28

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表