Exemple #1
0
 /// <summary>
 /// 设置某个扇区的密钥,如果此扇区已经被加密,返回false
 /// </summary>
 /// <param name="cardID">卡片的卡号(为null或空时不检查卡号是否一致)</param>
 /// <param name="section">扇区(0~15)</param>
 /// <param name="originalKey">旧密钥(6字节)</param>
 /// <param name="key">新密钥(6字节)</param>
 /// <param name="successBuz">成功是否发出提示音</param>
 /// <param name="failBuz">失败是否发出提示音</param>
 /// <returns></returns>
 public CardOperationResultCode SetSectionKey(string cardID, int section, byte[] originalKey, byte[] key, bool successBuz, bool failBuz)
 {
     try
     {
         CardOperationResultCode result = CardOperationResultCode.Success;
         int         ret    = 1;
         ACTIVEPARAA pAInfo = new ACTIVEPARAA();
         if (MUR200Init() > 0)
         {
             ret = MUR200Open(0);
         }
         else if (result == CardOperationResultCode.Success)
         {
             result = CardOperationResultCode.InitFail;
         }
         if (ret == 0)
         {
             ret = MFActivate(0, 0x52, ref pAInfo);
         }
         else if (result == CardOperationResultCode.Success)
         {
             result = CardOperationResultCode.OpenFail;
         }
         if (ret == 0)
         {
             //cardID不为空时,需要检查卡号是否一致,不一致时,返回写卡失败
             if (!string.IsNullOrEmpty(cardID) && cardID != GetUID(pAInfo.UID, pAInfo.UIDLen))
             {
                 ret = 1;
             }
         }
         else if (result == CardOperationResultCode.Success)
         {
             result = CardOperationResultCode.NoCard;
         }
         if (ret == 0)
         {
             result = _InitKey(section, originalKey, key);
         }
         else if (result == CardOperationResultCode.Success)
         {
             result = CardOperationResultCode.CardIDError;
         }
         if (ret == 0 && successBuz)
         {
             _SucessBuz();
         }
         else if (ret != 0 && failBuz)
         {
             _FailBuz();
         }
         MUR200Exit();
         return(result);
     }
     catch (Exception ex)
     {
         ExceptionPolicy.HandleException(ex);
     }
     return(CardOperationResultCode.Fail);
 }
Exemple #2
0
        /// <summary>
        /// 读卡片的ID号及数据
        /// </summary>
        /// <returns></returns>
        public ReadCardResult ReadCard()
        {
            ReadCardResult result = new ReadCardResult();

            try
            {
                string      value  = string.Empty;
                ACTIVEPARAA pAInfo = new ACTIVEPARAA();
                if (MUR200Init() > 0)
                {
                    if (MUR200Open(0) == 0)
                    {
                        if (MFActivate(0, 0x52, ref pAInfo) == 0)
                        {
                            if (!InvalidReading)
                            {
                                InvalidReading = true;
                                value          = GetUID(pAInfo.UID, pAInfo.UIDLen);
                                //读取扇区2数据,读取成功将数据返回,失败不作处理
                                if (MFAuth(KEY_TYPE_A | KEY_SOURCE_EXT, (2 * 4 + 3), RalidKey) == 0)
                                {
                                    byte[] sectiondata = new byte[16 * 3];
                                    if (MFRead((2 * 4 + 0), 3, sectiondata) == 0)
                                    {
                                        result.ParkingDate = new byte[16 * 3];
                                        Array.Copy(sectiondata, result.ParkingDate, 16 * 3);
                                    }
                                }
                                _SucessBuz();
                            }
                            MFHalt();
                        }
                        else
                        {
                            InvalidReading = false;
                        }
                        MUR200Exit();
                    }
                }
                if (!string.IsNullOrEmpty(value))
                {
                    result.CardID = value.ToString();
                }
            }
            catch (Exception ex)
            {
                ExceptionPolicy.HandleException(ex);
            }
            return(result);
        }
Exemple #3
0
 private static extern byte MFActivate(byte ucMode, byte ucReqCode, ref ACTIVEPARAA pAInfo);
Exemple #4
0
 /// <summary>
 /// 把数据写入卡片的某个扇区的某些块中
 /// </summary>
 /// <param name="cardID">需写入卡片的卡号(为null或空时不检查卡号)</param>
 /// <param name="section">扇区(0~15)</param>
 /// <param name="block">起始块号(0~3)</param>
 /// <param name="ucExt">写入块数(1~3)</param>
 /// <param name="pBuf">写入数据</param>
 /// <param name="key">密钥</param>
 /// <param name="successBuz">成功是否发出提示音</param>
 /// <param name="failBuz">失败是否发出提示音</param>
 /// <param name="initKey">密钥验证失败后,是否初始化扇出密钥</param>
 /// <returns></returns>
 public CardOperationResultCode WriteSection(string cardID, int section, int block, byte ucExt, byte[] pBuf, byte[] key, bool successBuz, bool failBuz, bool initKey)
 {
     try
     {
         CardOperationResultCode result = CardOperationResultCode.Success;
         int         ret    = 1;
         ACTIVEPARAA pAInfo = new ACTIVEPARAA();
         if (MUR200Init() > 0)
         {
             ret = MUR200Open(0);
         }
         else if (result == CardOperationResultCode.Success)
         {
             result = CardOperationResultCode.InitFail;
         }
         if (ret == 0)
         {
             ret = MFActivate(0, 0x52, ref pAInfo);
         }
         else if (result == CardOperationResultCode.Success)
         {
             result = CardOperationResultCode.OpenFail;
         }
         if (ret == 0)
         {
             //cardID不为空时,需要检查卡号是否一致,不一致时,返回写卡失败
             if (!string.IsNullOrEmpty(cardID) && cardID != GetUID(pAInfo.UID, pAInfo.UIDLen))
             {
                 ret = 1;
             }
         }
         else if (result == CardOperationResultCode.Success)
         {
             result = CardOperationResultCode.NoCard;
         }
         if (ret == 0)
         {
             ret = MFAuth(KEY_TYPE_A | KEY_SOURCE_EXT, (byte)(section * 4 + 3), key);
         }
         else if (result == CardOperationResultCode.Success)
         {
             result = CardOperationResultCode.CardIDError;
         }
         //密钥验证失败后,如果需要初始化密钥
         if (initKey && ret != 0 && result == CardOperationResultCode.Success)
         {
             MFActivate(0, 0x52, ref pAInfo);
             result = _InitKey(section, DefaultKey, key);
             if (result == CardOperationResultCode.Success)
             {
                 ret = MFAuth(KEY_TYPE_A | KEY_SOURCE_EXT, (byte)(section * 4 + 3), key);//再次验证密钥
             }
         }
         if (ret == 0)
         {
             ret = MFWrite((byte)(section * 4 + block), ucExt, pBuf);
             if (ret != 0)
             {
                 result = CardOperationResultCode.Fail;
             }
         }
         else if (result == CardOperationResultCode.Success)
         {
             result = CardOperationResultCode.AuthFail;
         }
         if (ret == 0 && successBuz)
         {
             _SucessBuz();
         }
         else if (ret != 0 && failBuz)
         {
             _FailBuz();
         }
         MUR200Exit();
         return(result);
     }
     catch (Exception ex)
     {
         ExceptionPolicy.HandleException(ex);
     }
     return(CardOperationResultCode.Fail);
 }
Exemple #5
0
        /// <summary>
        /// 从卡片中读卡扇区某些块中的数据,失败返回空
        /// </summary>
        /// <param name="cardID">卡片的卡号(为null或空时不检查卡号是否一致)</param>
        /// <param name="section">扇区(0~15)</param>
        /// <param name="block">起始块号(0~3)</param>
        /// <param name="count">读取块数(1~3)</param>
        /// <param name="key">密钥</param>
        /// <param name="successBuz">成功是否发出提示音</param>
        /// <param name="failBuz">失败是否发出提示音</param>
        /// <param name="initKey">密钥验证失败后,是否初始化扇出密钥</param>
        /// <returns></returns>
        public ReadCardResult ReadSection(string cardID, int section, int block, byte count, byte[] key, bool successBuz, bool failBuz, bool initKey)
        {
            ReadCardResult result = new ReadCardResult();

            try
            {
                int         ret       = 1;
                byte[]      readbytes = null;
                ACTIVEPARAA pAInfo    = new ACTIVEPARAA();
                if (MUR200Init() > 0)
                {
                    ret = MUR200Open(0);
                }
                else if (result.ResultCode == CardOperationResultCode.Success)
                {
                    result.ResultCode = CardOperationResultCode.InitFail;
                }
                if (ret == 0)
                {
                    ret = MFActivate(0, 0x52, ref pAInfo);
                }
                else if (result.ResultCode == CardOperationResultCode.Success)
                {
                    result.ResultCode = CardOperationResultCode.OpenFail;
                }
                if (ret == 0)
                {
                    result.CardID = GetUID(pAInfo.UID, pAInfo.UIDLen);

                    //cardID不为空时,需要检查卡号是否一致,不一致时,返回写卡失败
                    if (!string.IsNullOrEmpty(cardID) && cardID != result.CardID)
                    {
                        ret = 1;
                    }
                }
                else if (result.ResultCode == CardOperationResultCode.Success)
                {
                    result.ResultCode = CardOperationResultCode.NoCard;
                }
                if (ret == 0)
                {
                    ret = MFAuth(KEY_TYPE_A | KEY_SOURCE_EXT, (byte)(section * 4 + 3), key);
                }
                else if (result.ResultCode == CardOperationResultCode.Success)
                {
                    result.ResultCode = CardOperationResultCode.CardIDError;
                }
                //密钥验证失败后,如果需要初始化密钥
                if (initKey && ret != 0 && result.ResultCode == CardOperationResultCode.Success)
                {
                    MFActivate(0, 0x52, ref pAInfo);
                    result.ResultCode = _InitKey(section, DefaultKey, key);
                    if (result.ResultCode == CardOperationResultCode.Success)
                    {
                        ret = MFAuth(KEY_TYPE_A | KEY_SOURCE_EXT, (byte)(section * 4 + 3), key);//再次验证密钥
                    }
                }
                if (ret == 0)
                {
                    readbytes = new byte[16 * count];
                    ret       = MFRead((byte)(section * 4 + block), count, readbytes);
                    if (ret == 0)
                    {
                        result[section]   = readbytes;
                        result.ResultCode = CardOperationResultCode.Success;
                    }
                    else
                    {
                        result.ResultCode = CardOperationResultCode.Fail;
                    }
                }
                else if (result.ResultCode == CardOperationResultCode.Success)
                {
                    result.ResultCode = CardOperationResultCode.AuthFail;
                }
                if (ret == 0 && successBuz)
                {
                    _SucessBuz();
                }
                else if (ret != 0 && failBuz)
                {
                    _FailBuz();
                }
                MUR200Exit();
            }
            catch (Exception ex)
            {
                ExceptionPolicy.HandleException(ex);
            }
            return(result);
        }