tick 发表于 2010-3-25 13:46:51

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

1,我发送 status = M531PiccRequestB(PICC_REQBWUP,0,0,ReadBuf); // ReqB with 1 slot
   每次返回都是0xFF
   我发送的是05 0000 3字节
   下面选卡等也不好往下
   第一步就卡住了。

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

tick 发表于 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 = 0x05;                // APf code
   MSndBuffer = AFI; //
   MSndBuffer = (req_code&0x08)|(N&0x07); // PARAM

   MSndBuffer = 0; //                  ////////////////改成0
   MSndBuffer = 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>>4); // set FWT



       
   return status;
}

hongyancl 发表于 2010-3-25 15:03:40

xuexi

tick 发表于 2010-3-25 15:14:43

做过的来麻烦指导下~~

jeames 发表于 2010-3-25 16:25:04

兄弟,二代证的命令是加密的,需要加密模块才能完成,
你没发现卡片的UID都是0吗
并不完全兼容14443-B,是非标的,

tick 发表于 2010-3-25 19:37:29

这么说 网上卖的MCU+RC531读 8字节ID的 都是代码解密的?他们都没用专门解密模块啊

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

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

有点晕我了~~

jeames 发表于 2010-3-25 20:01:29

是这样的,二代证是应答标准的REQB指令的,但Attrib指令是非标的,这一点我没深入研究,也许不对,

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

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

tick 发表于 2010-3-25 20:04:50

是的
ATTRIB 是特殊的发指令。

zhangjw 发表于 2010-3-25 20:41:09

mark.

wisebaby 发表于 2010-3-25 20:43:26

帮顶。

tick 发表于 2010-3-30 11:28:58

有做过的吗?

tick 发表于 2010-4-4 20:46:39

已解决 可以读2代身份证的UID了
上面发的代码没问题 芯片焊接问题

zzyzheng12 发表于 2010-4-30 13:43:15

mark

byin 发表于 2010-4-30 13:52:36

mark

shmily 发表于 2010-4-30 13:54:19

二代证不是每家都有资质做的

726bf 发表于 2010-5-20 14:26:44

mark

jokeyli 发表于 2010-6-11 20:44:48

回复【楼主位】tick
-----------------------------------------------------------------------

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

M531PiccRequestB返回0xff

lqtech 发表于 2010-8-6 14:04:46

将WriteIO(RegRxThreshold, 0x44);         //0x44, 可接收的最小信号强度
改为:WriteIO(RegRxThreshold, 0xFF);         //0x44, 可接收的最小信号强度
试一下!!!!
请问有没有对typeB的CPU卡操作成功的!

satellite_army 发表于 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”

请问,问题出在那里呀

reloaded 发表于 2010-9-20 17:29:40

632能读二代身份证么?问下楼主??

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

各种解释都有。

tick 发表于 2010-9-20 20:57:01

TYPE B 支持就可以
像MFRC500只支持TYPE A当然不行
MFRC531支持TYPE B就可以,读出来的只是二代身份证唯一的8字节 UID号。

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


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

satellite_army 发表于 2010-9-21 11:08:28

回复【20楼】tick
-----------------------------------------------------------------------

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

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

谢谢

tick 发表于 2010-9-25 09:49:11

不需要,读出来就是唯一的码

reloaded 发表于 2010-9-25 10:00:39

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

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

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

leifeng 发表于 2010-9-25 12:37:09

mark

yl604922959 发表于 2010-9-25 15:45:59

mark

442502587 发表于 2011-1-7 09:38:05

mark

whimsy 发表于 2011-1-8 12:23:11

哦,原来读出来的是UID,不是身份证号码,2者有必然关联吗?

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

aujux 发表于 2011-2-17 14:54:23

MARK

axeon 发表于 2011-2-17 16:41:51

身份证号码我觉得应该给读出的

utopiaprince 发表于 2011-2-18 13:22:23

身份证号码是加密的,读不出来。UID的话只要支持TYPE B模式就能读出来。

mylovefor 发表于 2011-3-19 19:46:51

m1卡能读不一定 硬件没问题,typeB是10%调制的,能读typeA的天线板不一定能读typeB

szbored 发表于 2011-5-27 11:32:57

MARK
LEARN

skynet 发表于 2011-5-27 11:54:02

good

mdf1314 发表于 2011-5-27 12:28:19

之前有同事试过说是读出来的UID是变化的。
请教一下,不用加密模块,确实可以读出UID吗?

gloryzkl 发表于 2011-5-27 12:46:47

mark

ndust 发表于 2011-5-27 14:13:34

jh

rachel-yoyo 发表于 2011-7-17 16:08:30

回复【11楼】tick
-----------------------------------------------------------------------

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

zjczm 发表于 2011-9-11 20:44:00

兄弟们,我也是能读typeA.读不了typeB啊.还弄不明白是硬件问题还是软件问题啊.郁闷中...

rachel-yoyo 发表于 2011-12-20 15:01:26

回复【39楼】zjczm
-----------------------------------------------------------------------

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

rachel-yoyo 发表于 2011-12-20 15:02:17

回复【31楼】mylovefor
-----------------------------------------------------------------------

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

xymxym 发表于 2011-12-20 16:37:10

留印,也许有用...

Gloriousle 发表于 2011-12-20 18:04:12

有意思

qd118118 发表于 2012-6-13 17:55:46

mark,learn

wind2100 发表于 2012-6-13 18:31:13

第二代身份证 是CPU卡 需要发送数据 然后校验 对了 才返回正确信息。

lovelywwei 发表于 2012-6-13 19:16:59

二代证读内容肯定是没那么容易的,一般厂家做不出来,想做还得什么公安部的授权。
读UID只要是支持TYPEB的基站芯片都能读,这没什么秘密。
当然,ATRRIB是非标的。

keshipt 发表于 2012-8-30 11:13:02

准备改一下M1的读卡器用来读TYPE A 的UID号

swqshyj 发表于 2012-9-20 11:53:51

我日,我是用EM4094,也是能读A卡,读不了B卡,怎么回事

qzxy0927 发表于 2012-12-3 09:12:26

tick 发表于 2010-3-25 13:51 static/image/common/back.gif
while(1)
        {
          // IS014443B


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

qzxy0927 发表于 2013-4-15 15:26:32

tick 发表于 2010-9-25 09:49 static/image/common/back.gif
不需要,读出来就是唯一的码

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

hcw 发表于 2013-7-25 20:04:32

我用的是523,能读的了A卡,读不了B卡,不知道是程序的原因,还是天线的原因。

kyle4812 发表于 2016-11-18 10:40:10

qzxy0927 发表于 2013-4-15 15:26
读出来的是8个字节的数据,但是我们的身份证是18位的,那是怎么计算出来的! ...

我的理解是,身份证UID是卡片的唯一标示,身份证号作为个人信息录入卡片上,可能通过有关部门定义的加密命令获取。UID和身份证号应该是关联起来的。
页: [1]
查看完整版本: RC531 读二代身份证8字节UID命令是什么?