⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 commtran.c

📁 此程序为13.56MHz的RFID底层读写卡程序
💻 C
📖 第 1 页 / 共 4 页
字号:
	         Status=Mf500PiccAnticoll (0,snr);
                 if(Status==MI_OK)
                 {
                    Status=Mf500PiccSelect(snr,buf);
                    if(Status==MI_OK)
                    {
                      SendResponse(0x01,5,snr);
                      return;
                    }
                 }
                 SendResponse(0x80,1,buf);
                 break;

          case 0x42:                                /*read m_block*/

                 sector_n=ComBuffer[4]>>2;          /* sector no. */
	         block_n=ComBuffer[4];              /* block no. */
	         if(ComBuffer[3]==0x01)
	         {
	            key_type=PICC_AUTHENT1B;
	         }
                 key_type=PICC_AUTHENT1A;
	         Status=Mf500PiccAuth(key_type,sector_n,block_n);
	         if(Status==MI_OK)
	         {
	            Status=Mf500PiccRead(block_n,buf);
	            if(Status==MI_OK)
	            {
	               SendResponse(0x01,17,buf);
	            }
	            else
	            {
	               SendResponse(0x80,1,buf);
	            }
	         }
	         else
	         {
	            SendResponse(0x81,1,buf);
                 }

	         break;

	  case 0x43:                                /*write m_block*/

	         sector_n=ComBuffer[4]>>2;          /* sector no. */
	         block_n=ComBuffer[4];              /* block no. */

	         if(ComBuffer[3]==0x01)
	         {
	            key_type=PICC_AUTHENT1B;
	         }
                 key_type=PICC_AUTHENT1A;
	         Status=Mf500PiccAuth(key_type,sector_n,block_n);
	         if(Status==MI_OK)
	         {
	            Status=Mf500PiccWrite(block_n,ComBuffer+5);
	            if(Status==MI_OK)
	            {
	               SendResponse(0x01,1,buf);
	            }
	            else
	            {
	               SendResponse(0x80,1,buf);
	            }
	         }
	         else
	         {
	             SendResponse(0x81,1,buf);
                 }

	         break;
               case 0x39:	                    /* write file */
	          //"格式 60 xx 39 (文件标识2字节)(密钥类型1字节)(起始块号)(偏移地址)(数据长度)(数据)
	          //      0   1  2    3 4              5                 6           7           8        9--
	          temp[0]=ComBuffer[7];
                  temp[1]=ComBuffer[8];
                  block_n=(sector_n<<2);
                  len_x=(ComBuffer[6]<<4);

                  if((len_x+temp[0]+temp[1])>48)
                  {
                     SendResponse(0x82,1,buf);//"超界错误
                     return;
                  }

                  for(i=0;i<3;i++)         //
                  {
                      if(flag1)
                       {
                        Status=MF1_read_key(key_type,block_n+i,TempBuffer+(i<<4),key);
                       }
                     else Status=MF1_read(key_type,block_n+i,TempBuffer+(i<<4));
                     if(Status!=MI_OK) break;
                  }
                  if(Status==MI_OK)
                  {
                    memcpy(TempBuffer+len_x+temp[0],ComBuffer+9,temp[1]);
                    for(i=0;i<3;i++)     //
                    {
                       if(flag1)
                        {
                         Status=MF1_write_key(key_type,block_n+i,TempBuffer+(i<<4),key);
                        }
                        else Status=MF1_write(key_type,block_n+i,TempBuffer+(i<<4));
                    	if(Status!=MI_OK) break;
                    }
                 }
                 if(Status==MI_OK) SendResponse(0x01,1,buf);
                 else SendResponse(0x80,1,buf);
                 flag1=0;
                 break;


	  case 0x3b:                                 /* read file */
	         //"格式 60 xx 3b (文件标识2字节)(密钥类型1字节)(起始块号)(块数量)
	         //      0   1  2    3 4                  5             6         7

                 block_n=(sector_n<<2)+ComBuffer[6];
	         temp[0]=ComBuffer[7];

	         if((ComBuffer[6]+temp[0])>3)
	         {
	            SendResponse(0x82,1,buf);
	            return;
	         }

	         for(i=0;i<temp[0];i++)
	         {
	            if(flag1)
                    {
                     Status=MF1_read_key(key_type,block_n+i,buf,key);
                    }
                    else Status=MF1_read(key_type,block_n+i,buf);
	            if(Status!=MI_OK) break;
	            else memcpy(ComBuffer+9+(i<<4),buf,16);
	         }
	         if(Status==MI_OK)
	         {
	            SendResponse(0x01,(temp[0]<<4)+18,buf); /* OK */
	         }
	         else
	         {
	            SendResponse(0x80,1,buf);    /* read file error */
	         }

                 flag1=0;
	         break;


	  case 0xF9:	                    /* write file */
	          //"格式 60 xx F9 (文件标识2字节)(密钥类型1字节)(起始块号)(偏移地址)(数据长度)(数据)
	          //      0   1  2    3 4              5  6               7          8           9        10--

	         Status=CheckMad2(buf2);    /*get sector no.*/
      	         if(Status!=MI_OK) return;

      	         temp[0]=ComBuffer[8]; //"偏移地址
                 temp[1]=ComBuffer[9]; //"数据长度

                 LEN1=buf2[0]+buf2[0]+buf2[0];//"块数
                 LEN1=(LEN1<<4);              //"字节数
                 if(((ComBuffer[7]<<4)+temp[0]+temp[1])>LEN1)
                 {
                     SendResponse(0x82,1,buf);
                     return;
                 }

                 LEN1=0;
                 LEN2=0;
      	         for(j=1;j<=buf2[0];j++)     //"一个文件多个扇区
      	         {
      	             sector_n=buf2[j];
      	             block_n=(sector_n<<2);
      	             keytest=ComBuffer[6];  //"密钥类型2(认证码标识和KEYA KEYB)
      	             Status=Creat_key2(keytest,sector_n,ComBuffer[5],key);
                     if(Status!=MI_OK)
                     {
                      SendResponse(0x01,CREAT_KEY_ERROR,buf);
                      return ;
                     }
                     flag1=1;
                     if((keytest&0x0F)==0)
                     {
                        keytest=PICC_AUTHENT1A;
                     }
                     else keytest=PICC_AUTHENT1B;
                     if(flag1)
                      {
                        Status=MF1_authkey(keytest,key,block_n);
                      }
                     else Status=MF1_auth(keytest,sector_n,block_n);
                     if(Status!=MI_OK)
                      {
                        SendResponse(0x81,1,buf);
                        return;
                      }

                     for(i=0;i<3;i++)
                     {
                       if(flag1)
                        {
                         Status=MF1_read_key(keytest,block_n+i,TempBuffer+LEN2,key);
                        }
                       else Status=MF1_read(keytest,block_n+i,TempBuffer+LEN2);
                       if(Status!=MI_OK) break;
                       LEN2+=16;
                     }
                     if(Status!=MI_OK) break;
                 }

                 if(Status==MI_OK)
                 {
                    LEN1=(ComBuffer[7]<<4)+temp[0];//"绝对偏移地址

                    memcpy(TempBuffer+LEN1,ComBuffer+10,temp[1]);
                    LEN2=0;
                    for(j=1;j<=buf2[0];j++)
                    {
                    	sector_n=buf2[j];
                    	block_n=(sector_n<<2);
                        keytest=ComBuffer[6];      //"密钥类型2(认证码标识和KEYA KEYB  )
      	                Status=Creat_key2(keytest,sector_n,ComBuffer[5],key);//
                        if(Status!=MI_OK)
                        {
                         SendResponse(0x01,CREAT_KEY_ERROR,buf);
                         return ;
                        }                           //
                        flag1=1;                                             //
                    	keytest=(ComBuffer[6]&0x0F);
                    	if(keytest==0)
                    	{
                    	    keytest=PICC_AUTHENT1A;
                    	}
                    	else keytest=PICC_AUTHENT1B;

                        for(i=0;i<3;i++)
                        {
                    	   if(flag1)
                           {
                            Status=MF1_write_key(keytest,block_n+i,TempBuffer+LEN2,key);
                           }
                          else Status=MF1_write(keytest,block_n+i,TempBuffer+LEN2);
                    	  if(Status!=MI_OK) break;
                    	  LEN2+=16;
                        }
                        if(Status!=MI_OK) break;
                    }
                 }
                 if(Status==MI_OK) SendResponse(0x01,1,buf);
                 else SendResponse(0x80,1,buf);
                 flag1=0;
                 break;

      	  case 0xFb:                                 /* read file */
	         //"格式:要求支持一个文件占多个扇区(现在支持4个扇区)
	         //"    60 xx fb 文件标识(2) 密钥标识(2)开始块地址(1) 要读的块数(1)
	         //"现在0  1   2   3 4          5 6           7                8
	         //"原来0  1   2   3 4          5             6                7
	         Status=CheckMad2(buf2);       /*get sector no.*/
      	         if(Status!=MI_OK) return;

      	         temp[0]=ComBuffer[7]; //"偏移地址
                 temp[1]=ComBuffer[8]; //"数据长度
                 LEN1=buf2[0]+buf2[0]+buf2[0];//"块数

                 if((temp[0]+temp[1])>LEN1)
                 {
                     SendResponse(0x82,1,buf);
                     return;
                 }

                 LEN1=0;
                 LEN2=0;
      	         for(j=1;j<=buf2[0];j++)     //"一个文件多个扇区
      	         {
      	             sector_n=buf2[j];
      	             block_n=(sector_n<<2);
      	             keytest=ComBuffer[6];     //"密钥类型2(认证码标识和KEYA KEYB)
      	             Status=Creat_key2(keytest,sector_n,ComBuffer[5],key);
                     if(Status!=MI_OK) return;
                     flag1=1;
                     if((keytest&0x0F)==0)
                     {
                        keytest=PICC_AUTHENT1A;
                     }
                     else keytest=PICC_AUTHENT1B;
                     if(flag1)
                      {
                        Status=MF1_authkey(keytest,key,block_n);
                      }
                     else Status=MF1_auth(keytest,sector_n,block_n);
                     if(Status!=MI_OK)
                     {
                        SendResponse(0x81,1,buf);
                        return;
                     }

                     for(i=0;i<3;i++)
                     {
                        if(flag1)
                         {
                          Status=MF1_read_key(keytest,block_n+i,TempBuffer+LEN2,key);
                         }
                        else Status=MF1_read(keytest,block_n+i,TempBuffer+LEN2);
                        if(Status!=MI_OK) break;
                        LEN2+=16;
                     }
                     if(Status!=MI_OK) break;
                 }

                 LEN1=(temp[0]<<4);//"绝对地址
                 LEN2=(temp[1]<<4);//"长度
                 if(Status==MI_OK)
                 {
                     memcpy(ComBuffer+9,TempBuffer+LEN1,LEN2);
                     SendResponse(0x01,LEN2+18,buf);
                 }

                 else SendResponse(0x80,1,buf);
                 flag1=0;
                 break;


	  case 0x34:                                /* load_key */


                if(ComBuffer[3]==0x01)
	         {
	           keytest=PICC_AUTHENT1B;   /* KEYB */
	         }
                 else  keytest=PICC_AUTHENT1A;
                 sector_n=ComBuffer[4]&0x0f;        // so the sector is 0~15 for thr rc500

	         if((ComBuffer[4]==0x10)&(keytest==PICC_AUTHENT1A))
                 {
                   Status=Write_Ram_byte(0x0000,ComBuffer+5,6);
                 }
                 else if((ComBuffer[4]==0x10)&(keytest==PICC_AUTHENT1B))
                 {
                   Status=Write_Ram_byte(0x0006,ComBuffer+5,6);
                 }

                 else if((ComBuffer[4]>=0x20)&(ComBuffer[4]<=0x2f))
                 {
                    if(keytest==PICC_AUTHENT1A)
                    {
                     Status=Write_Ram_byte(0x0010,ComBuffer+5,6);
                    }
                    if(keytest==PICC_AUTHENT1B)
                    {
                     Status=Write_Ram_byte(0x0016,ComBuffer+5,6);
                    }
                 }

                else Status=Mf500PcdLoadKeyE2(keytest,sector_n,ComBuffer+5);

                 if(Status==MI_OK)
	         {
	            SendResponse(0x01,1,buf);
	         }
	         else
	         {
	            SendResponse(0x80,1,buf);
	         }


	         break;


	  /******************************TIME COS COMMAND************************/
	  case 0x88:     //T=CL;for mifare pro


                switch(ComBuffer[3])//check message's head      //2refrence  TimeCos command
	         {
	            case 0x00:                                  // 2 the first byte
	            case 0x04:
	            case 0x80:
	            case 0x84:
                    case 0xe0:
	                 key_index=1; break;
	            default:
	                 key_index=0;
	         }
	         if(key_index==0)
	         {
	            SendResponse(COS_CLA_ERROR,1,buf);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -