Example #1
0
        /*
         * Potentially useful links
         * https://stackoverflow.com/questions/36270238/android-nfc-ndef-writendefmessage-throws-ioexception-and-erases-tag-data
         * https://stackoverflow.com/questions/40288795/android-nfca-connect-nfca-transceive-nfca-settimeout-and-nfca-getmaxtran
         * https://stackoverflow.com/questions/29718618/get-the-data-payload-of-a-tag
         * https://stackoverflow.com/questions/42819027/nfca-transceive-commands-documentation-nfc-a-iso-14443-3a*
         */


        public void Callback(object obj)
        {
            if (obj is Intent intent)
            {
                Logging.Log(LogType.Information, $"Callback object is of type 'Intent'");

                Tag rawTag = intent.GetParcelableExtra(NfcAdapter.ExtraTag) as Tag;

                NfcA tag = NfcA.Get(rawTag);

                tag.Connect();
                byte[] result = tag.Transceive(CommandFactory.Instance().GetByteCommand(NfcByteCommand.Select));

                if (!(result[0] == (byte)0x90 && result[1] == (byte)0x00))
                {
                    throw new IOException("could not select applet");
                }

                result = tag.Transceive(CommandFactory.Instance().GetByteCommand(NfcByteCommand.GetString));
                int len = result.Length;

                if (!(result[len - 2] == (byte)0x90 && result[len - 1] == (byte)0x00))
                {
                    throw new RuntimeException("could not retrieve msisdn");
                }

                byte[] data = new byte[len - 2];

                Array.Copy(result, data, len - 2);

                var str = Encoding.Default.GetString(data).Trim();

                tag.Close();
            }
        }
        private bool isMIFARETag(Tag tag)
        {
            bool      returnVar = false;
            ArrayList arr       = new ArrayList();

            arr.AddRange(tag.GetTechList());
            if (arr.Contains("android.nfc.tech.NfcA"))
            {
                NfcA   nfc_A = NfcA.Get(tag);
                byte[] atqa  = nfc_A.GetAtqa();
                int    Sak   = int.Parse(nfc_A.Sak.ToString());
                switch (atqa[1])
                {
                case 0x00:
                    if (atqa[0] == 0x44 || atqa[0] == 0x42 ||
                        atqa[0] == 0x02 || atqa[0] == 0x04)
                    {
                        if (Sak == 0x20)
                        {
                            returnVar   = true;
                            detectedTag = "MIFARE_PLUS_SL3";
                        }
                        else if (Sak == 0x10)
                        {
                            returnVar   = true;
                            detectedTag = "MIFARE_PLUS_SL2";
                        }
                    }
                    break;

                case 0x03:
                    if (atqa[0] == 0x44 || atqa[0] == 0x4)
                    {
                        returnVar   = true;
                        detectedTag = "MIFARE_DESFIRE";
                    }
                    break;

                default:
                    break;
                }
            }
            return(returnVar);
        }
Example #3
0
 public (TagInfo?, NFCMessage) ReadInfo(Tag tag)
 {
     if (tag == null)
     {
         return(null, NFCMessage.NFC_NULL_TAG);
     }
     return(new TagInfo
     {
         Uid = tag.GetId(),
         Tag = tag,
         IsoDep = IsoDep.Get(tag),
         MifareClassic = MifareClassic.Get(tag),
         MifareUltralight = MifareUltralight.Get(tag),
         NfcV = NfcV.Get(tag),
         Ndef = Ndef.Get(tag),
         NdefFormatable = NdefFormatable.Get(tag),
         NfcA = NfcA.Get(tag),
         NfcB = NfcB.Get(tag),
         NfcF = NfcF.Get(tag),
         NfcBarcode = NfcBarcode.Get(tag),
         TechList = tag.GetTechList()
     }, NFCMessage.NFC_NO_ERROR);
 }
Example #4
0
        protected override void OnNewIntent(Intent intent)
        {
            base.OnNewIntent(intent);
            Toast.MakeText(this, "Leyendo NFC", ToastLength.Short).Show();
            var tag = intent.GetParcelableExtra(NfcAdapter.ExtraTag) as Tag;

            /*if (_inWriteMode)
             * {
             *  _inWriteMode = false;
             *
             *  if (tag == null)
             *  {
             *      return;
             *  }
             *
             *  // These next few lines will create a payload (consisting of a string)
             *  // and a mimetype. NFC record are arrays of bytes.
             *  var payload = Encoding.ASCII.GetBytes("YeeSaurio");
             *  var mimeBytes = Encoding.ASCII.GetBytes("application/NFCFighters");
             *  var apeRecord = new NdefRecord(NdefRecord.TnfMimeMedia, mimeBytes, new byte[0], payload);
             *  var ndefMessage = new NdefMessage(new[] { apeRecord });
             *
             *  if (!TryAndWriteToTag(tag, ndefMessage))
             *  {
             *      // Maybe the write couldn't happen because the tag wasn't formatted?
             *      TryAndFormatTagWithMessage(tag, ndefMessage);
             *  }
             * }
             *
             * /*string[] techList = tag.GetTechList();
             * info.Text = "";
             * foreach (string tech in techList)
             * {
             *  info.Text += "\n\t" + tech;
             * }*/

            NfcA             nfca  = NfcA.Get(tag);
            NdefFormatable   ndeff = NdefFormatable.Get(tag);
            IsoDep           iso   = IsoDep.Get(tag);
            MifareUltralight mifU  = MifareUltralight.Get(tag);


            /*try
             * {
             *  nfca.Connect();
             *  short s = nfca.Sak;
             *  byte[] a = nfca.GetAtqa();
             *  string atqa = Encoding.ASCII.GetString(a);
             *  info.Text += "\nSAK = " + s + "\nATQA = " + atqa;
             *  nfca.Close();
             * } catch (Exception e)
             * {
             *  Toast.MakeText(this, "NfcA" + e.Message, ToastLength.Short).Show();
             * }*/

            /*try
             * {
             *  iso.Connect();
             *
             *  iso.Close();
             * }
             * catch (Exception e)
             * {
             *  Toast.MakeText(this, "IsoDep" + e.Message, ToastLength.Short).Show();
             * }*/

            /*try
             * {
             *  ndeff.Connect();
             *  //info.Text += "\nType: " + ndeff.GetType();
             *  //info.Text += "\nConnected: " + ndeff.IsConnected;
             *  var rawMsgs = intent.GetParcelableArrayExtra(NfcAdapter.ExtraNdefMessages);
             *  var msg = (NdefMessage)rawMsgs[0];
             *  var record = msg.GetRecords()[0];
             *
             *  info.Text += "\n\tNdefFormatted: " + Encoding.ASCII.GetString(record.GetPayload());
             *  ndeff.Close();
             * }
             * catch (Exception e)
             * {
             *  Toast.MakeText(this, "NdefFormatted " + e.Message, ToastLength.Short).Show();
             * }*/

            try
            {
                mifU.Connect();
                byte[]        mPag      = mifU.ReadPages(12);
                StringBuilder aux       = new StringBuilder();
                String        cont_mpag = "";
                for (int i = 0; i < mPag.Length; i++)
                {
                    aux.Append(mPag[i]);
                }
                cont_mpag = aux.ToString();
                //info.Text = Charset.AvailableCharsets().ToString();
                //var mifM = new String(cont_mpag, Charset.ForName("US-ASCII"));
                string mifM = Encoding.ASCII.GetString(mPag);
                info.Text += "\nTu personaje es " + mifM;
                mifU.Close();
            }
            catch (Exception e)
            {
                //Toast.MakeText(this, "MifareUltralight" + e.Message, ToastLength.Short).Show();
            }
        }
Example #5
0
        public static string GetManufacturer(Tag tag)
        {
            string mifareInfo = "";

            string[] techtags = tag.GetTechList();
            foreach (string s in techtags)
            {
                if (s.ToLower().IndexOf("mifareultralight") != -1)
                {
                    return("MifareUltralight");
                }
                else if (s.ToLower().IndexOf("mifareclassic") != -1)
                {
                    mifareInfo = "Mifare Classic";
                    MifareClassic mifareClassicTag = MifareClassic.Get(tag); //Get MIFARE CLASSIC tag
                    if (mifareClassicTag != null)
                    {
                        if (mifareClassicTag.Type == MifareClassic.TypePlus)
                        {
                            mifareInfo = "Mifare  Plus";
                        }
                        else if (mifareClassicTag.Type == MifareClassic.TypePro)
                        {
                            mifareInfo = "Mifare  Pro";
                        }
                    }

                    return(mifareInfo);
                }
                else if (s.ToLower().IndexOf("nfca") != -1)
                {
                    NfcA nfc_A = NfcA.Get(tag);
                    if (nfc_A != null)
                    {
                        byte[] atqa = nfc_A.GetAtqa();
                        if (atqa.Length >= 2)
                        {
                            Int32.TryParse(nfc_A.Sak.ToString(), out int Sak);
                            switch (atqa[1])
                            {
                            case 0x00:
                                if (atqa[0] == 0x44 || atqa[0] == 0x42 || atqa[0] == 0x02 || atqa[0] == 0x04)
                                {
                                    if (Sak == 0x20)
                                    {
                                        mifareInfo = "Mifare Plus SL3";
                                    }
                                    else if (Sak == 0x10)
                                    {
                                        mifareInfo = "Mifare Plus SL2";
                                    }

                                    else if (Sak == 0x00)
                                    {
                                        mifareInfo = "Mifare EM";
                                    }
                                }
                                break;

                            case 0x03:
                                if (atqa[0] == 0x44 || atqa[0] == 0x4)
                                {
                                    mifareInfo = "Mifare Desfire";
                                }
                                break;

                            default:
                                break;
                            }
                        }
                    }
                }
                else if (IsFelicaTag(tag))
                {
                    mifareInfo = "Felica";
                }
            }

            return(mifareInfo);
        }
Example #6
0
 public byte[] NfcA_WritePage(NfcA nfca, byte Page)
 {
     return(nfca.Transceive(new byte[2] {
         NfcA_Write_Key, Page
     }));
 }