📄 anony.c
字号:
//-----------------------------------------------------------------------------
// anony.c
//-----------------------------------------------------------------------------
#include "rfid/card.h"
#ifndef USE_JMY_MODULE
//-----------------------------------------------------------------------------
// Includes
//-----------------------------------------------------------------------------
#include <reg52.h>
#include <string.h>
#include "cpu/cpu.h"
#include "rfid/card.h"
#include "misc/misc.h"
#include "misc/general.h"
#include "config/config.h"
//-----------------------------------------------------------------------------
// Anonymous Card Module Command Define
//-----------------------------------------------------------------------------
/*
char xdata SET_MODULE[] = { 0x3C, 0x04, 0x01, 0x68, 0x00, 0x00, 0x51, 0x0D };
// Return: { 0x3C, 0x02, 0x00, 0x00, 0x3E, 0x0D }
char xdata READ_CARD_ID[] = { 0x3C, 0x04, 0x01, 0x70, 0x00, 0x00, 0x49, 0x0D };
// ICC Return SNR: { 0x3C, 0x05, 0xF9, 0x5D, 0x09, 0xE8, 0x00, 0x7C, 0x0D }
// NO ICC Return: { 0x3C, 0x01, 0xFF, 0xC2, 0x0D }
char xdata WRITE_CARD_ID[] = { 0x3C, 0x08, 0x01, 0x6A, 0x00, 0x3D,
0xF9, 0x5D, 0x09, 0xE8, 0x27, 0x0D };
// Return: { 0x3C, 0x02, 0x00, 0x00, 0x3E, 0x0D }
// Error Return: { 0x3C, 0x01, 0xF5, 0xC8, 0x0D }
char xdata READ_CARD_BLOCK[] = { 0x3C, 0x04, 0x01, 0x66, 0x3D, 0x00, 0x62, 0x0D };
// ICC Return Block: { 0x3C, 0x12, 0x00,
// ( block 16 byte data ) 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22,
// 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
// 0x2E, 0x0D }
char xdata WRITE_CARD_BLOCK[] = { 0x3C, 0x13, 0x01, 0x67, 0x3D,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x0D };
*/
//-----------------------------------------------------------------------------
// Anonymous Card Module Canstants Define
//-----------------------------------------------------------------------------
#define STX 0x3C
#define ETX 0x0D
#define LEN_MAX 0x1F
//-----------------------------------------------------------------------------
// Anonymous Card Module Struct Define
//-----------------------------------------------------------------------------
typedef struct _STAnony
{
char Stx;
char Len;
char State;
char Cmd;
} STAnony, *pSTAnony;
//-----------------------------------------------------------------------------
// Functions Prototype
//-----------------------------------------------------------------------------
void Transmit_Card_Buf ( char * buf );
char Receive_Card_Buf ( char * buf );
char Access_Card_Module ( char cmd, char sub, char * block );
//-----------------------------------------------------------------------------
// Transmit Anonymous Card Buffer Routine
//-----------------------------------------------------------------------------
void Transmit_Card_Buf ( char * buf )
{
char i, n;
n = 2 + buf[1];
buf[n] = Buffer_XOR ( buf, n );
buf[n + 1] = ETX;
n += 2;
for ( i = 0; i < n; i++ )
{
if ( MSB & buf[i] ) Uart0_Send_Byte ( 0x81 );
Uart0_Send_Byte ( buf[i] );
}
}
//-----------------------------------------------------------------------------
// Receive Anonymous Card Buffer Routine
//-----------------------------------------------------------------------------
char Receive_Card_Buf ( char * buf )
{
char i, n;
buf[0] = Uart0_Receive_Byte ();
if ( buf[0] == 0xFF ) return Fail( Rxd_Err );
if ( buf[0] != STX ) return Fail( Stx_Err );
buf[1] = Uart0_Receive_Byte ();
if ( buf[1] > LEN_MAX ) return Fail( Len_Err );
n = buf[1] + 4;
for ( i = 2; i != n; i++ )
{
buf[i] = Uart0_Receive_Byte ();
if (( n - i ) == 2 && buf[i] == ETX ) break;
}
if ( i != n ) n = buf[1] + 1; else n = buf[1] + 2;
if ( Buffer_XOR ( buf, n ) != buf[n] ) return Fail( Xor_Err );
return TRUE;
}
//-----------------------------------------------------------------------------
// Receive Anonymous Card Buffer Routine
//-----------------------------------------------------------------------------
/*char Receive_Card_Buf ( char * p )
{
char n;
char * buf = p;
if ( Uart0_Receive_Byte ( p ) == FALSE ) return Fail( Rxd_Err );
if ( *p != STX ) return Fail( Stx_Err );
if ( Uart0_Receive_Byte ( ++p ) == FALSE ) return Fail( Rxd_Err );
if ( *p > LEN_MAX ) return Fail( Len_Err );
n = *p + 2;
do {
if ( Uart0_Receive_Byte ( ++p ) == FALSE ) return Fail( Rxd_Err );
if ( n == 2 && *p == ETX ) break;
} while ( --n );
if ( n != 0 ) n = buf[1] + 1; else n = buf[1] + 2;
if ( Buffer_XOR ( buf, n ) != buf[n] ) return Fail( Xor_Err );
return TRUE;
}*/
//-----------------------------------------------------------------------------
// Access Anonymous Card Module Routine
//-----------------------------------------------------------------------------
char Access_Card_Module ( char cmd, char sub, char * block )
{
char rtn;
char buf[23];
switch ( cmd )
{
case MODULE_CTRL:
buf[1] = 0x04;
buf[3] = 0x68;
buf[4] = 0x00;
buf[5] = 0x00;
break;
case FIND_CARD:
buf[1] = 0x04;
buf[3] = 0x70;
buf[4] = 0x00;
buf[5] = 0x00;
break;
case WRITE_KEY:
buf[1] = 0x08;
buf[3] = 0x6A;
buf[4] = 0x00;
buf[5] = sub;
memcpy ( buf + 6, block, CARD_SN_LEN );
break;
case READ_BLOCK:
buf[1] = 0x04;
buf[3] = 0x66;
buf[4] = sub;
buf[5] = 0x00;
break;
case WRITE_BLOCK:
buf[1] = 0x13;
buf[3] = 0x67;
buf[4] = sub;
memcpy ( buf + 5, block, BLOCK_LEN );
break;
default:
return FALSE;
break;
}
buf[0] = STX;
buf[2] = 0x01;
Transmit_Card_Buf ( buf );
memset ( buf, 0, sizeof( buf ));
if (( rtn = Receive_Card_Buf ( buf )) != TRUE ) return rtn;
if ( buf[1] == 0x01 ) return NO_CARD;
if ( cmd == FIND_CARD && buf[1] == 0x05 ) memcpy ( block, buf + 2, CARD_SN_LEN );
else if ( cmd == READ_BLOCK && buf[1] == 0x12 ) memcpy ( block, buf + 3, BLOCK_LEN );
return TRUE;
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -